> La 1ère partie est ici <

Les contrats

gitlab

Ce projet contient les contrats Ethereum et Loom du token ZYM. Il y’en a deux.
Le premier sur Plasma n’a pas de tokens et les génère à la volée quand ils sont traferés depuis le contrat Ethereum.
Sur Ethereum se trouve le second contrat, lui aussi un ERC20 mais cette fois-ci avec une quantité non nulle et avec un code très classique.

Ethereum

pragma solidity ^0.4.24;

import "openzeppelin-solidity/contracts/token/ERC20/StandardToken.sol";

contract ZYMCoinEVM is StandardToken {
    string public name = "ZYM Coin";
    string public symbol = "ZYM";
    uint8 public decimals = 18;

    // one billion in initial supply
    uint256 public constant INITIAL_SUPPLY = 1000000000;

    constructor() public {
        totalSupply_ = INITIAL_SUPPLY * (10 ** uint256(decimals));
        balances[msg.sender] = totalSupply_;
    }
}

Le ZYM est créé sur la chaine Ethereum. Sa quantité est donnée par la valeur INITIALSUPPLY. Chaque ZYM a 18 décimales, pérmettant ainsi d’avoir une très petite granularité et effectuer des transferts de faible valeur avec précision.

Loom

pragma solidity ^0.4.24;

import “openzeppelin-solidity/contracts/token/ERC20/StandardToken.sol”;

contract ZYMCoin is StandardToken {

    // Transfer Gateway contract address

    address public gateway;

    string public name = “ZYM Coin”;

    string public symbol = “ZYM”;

    uint8 public decimals = 18;

    constructor(address _gateway) public {

        gateway = _gateway;

        totalSupply_ = 0;

    }

    // Used by the DAppChain Gateway to mint tokens that have been deposited to the Ethereum Gateway

    function mintToGateway(uint256 _amount) public {

        require(msg.sender == gateway, “only the gateway is allowed to mint”);

        totalSupply_ = totalSupply_.add(_amount);

        balances[gateway] = balances[gateway].add(_amount);

    }

}

Ce contrat ne possède aucun ZYM à la base. Seul le Gateway loom peut appeler (suite à un ordre de transfert de ZYM depuis Ethereum) la fonction mintToGateway.
Cette fonction va créer le double des ZYMs à transférer sur Loom, les rendant ainsi utilisables sur cette chaine. Les ZYM d’origine, eux, sont gardés par le contrat gateway jusqu’au transfert inverse. Quand un ZYM passe de Loom à Ethereum, il est détruit sur le contrat ZYMCoin, et le ZYM Ethereum est envoyé au propriétaire.

Le Gateway

Le gateway est un serveur Loom qui fait le lien entre les deux chaines.
Il a son propre contrat ethereum qui contient un registre qui stocke des paires de contrats d’un token ERC20 inter-chaine comme ZYM.
Il est résponsable du transfert du token d’une chaine à l’autre. Le même contrat lie aussi les adresses Ethereum et Loom d’un même utilisateur / compte. Le transfer inter-chaine n’est autorisé qu’en interne, entre ces adresses.

Un ordre de transfert depuis Ethereum vers Loom consiste en deux étapes client :

  • Transferer les ZYMs sur le contrat Gateway
  • Donner l’ordre au serveur Gateway de transférer les ZYMs sur Loom
    Le serveur effectue le transfert en deux étapes
  • Le serveur donne l’ordre au contrat erc20 sur Loom de créer (ou “mint”) la même quantité de ZYMs
  • Il crée une transaction pour transferer ces ZYMs au destinataire

Un ordre de transfert depuis Loom vers Ethereum consiste en deux étapes client :

  • Transferer les ZYMs sur le contrat Gateway
  • Donner l’ordre au serveur Gateway de transférer les ZYMs sur Ethereum

Le serveur effectue le transfert en deux étapes :

  • La version Loom des ZYMs est détruite
  • La version Ethereum des ZYMs est transferée sur l’adresse Ethereum du compte

Ainsi le Gateway de loom est le point le moins sécurisé entre le PoS d’Ethereum et le dPoS de la chaine Loom. Ce serveur est une machine unique et en cas de panne, les transferts sont interrompus. De plus nous n’avons pas encore d’information quand à la possibilité des propriétaires de ce serveur de récupérer les tokens déposés sur le gateway pour eux.
Des règles de sécurité sont encore à mettre en place.

Anton, spécialiste blokchain chez Enzym


0 commentaire

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *