Synthèse sur l'utilisation des WS

Objectif

Apporter des précisions et des indications sur l'utilisation des outils dans "ethereum-ws" par l'intermédiaire de l'application ARC.

On utilise la requète "Solidity Compiler".

  1. Vérifier que le Content-Type est bien "Text/Plain".
  2. Dans l'onglet "RAW Payload", coller directement le code Solidity.

    Si la réponse est "200" (OK), on trouve en fin de retour du code indenté les différents éléments utiles à récupérer afin de déployer par la suite le contrat compilé. Ces différents éléments seront :

    1. "bytecode" ("data").

      Exemple avec le bytecode du premier contrat en production de Smoothie :

      606060405234610000576040516020806101b583398101604052515b60008054600160a060020a0319166c010000000000000000000000003381020417808255600160a060020a031681526001602052604090208190555b505b61014e806100676000396000f3606060405260e060020a600035046302d05d3f811461003457806370a082311461005d578063a9059cbb1461007f575b610000565b3461000057610041610094565b60408051600160a060020a039092168252519081900360200190f35b346100005761006d6004356100a3565b60408051918252519081900360200190f35b34610000576100926004356024356100b5565b005b600054600160a060020a031681565b60016020526000908152604090205481565b8015156100c157610000565b33600160a060020a031682600160a060020a031614156100e057610000565b600160a060020a03821615156100f557610000565b600160a060020a0333166000908152600160205260409020548190101561011b57610000565b600160a060020a0380831660009081526001602052604080822080548501905533909216815220805482900390555b505056

    2. "interface" ("abi" format JSON).

      Exemple avec l'interface du premier contrat en production de Smoothie:

      [{"constant":true,"inputs":[],"name":"creator","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"dest","type":"address"},{"name":"quantity","type":"uint256"}],"name":"transfer","outputs":[],"payable":false,"type":"function"},{"inputs":[{"name":"totalShares","type":"uint256"}],"payable":false,"type":"constructor"}]

On utilise la requète "Contract creation".

  1. Vérifier le Content-Type !

  2. La valeur "interface" doit être convertie pour PHP 5.6.29 afin d'être attribuée à "abi" par la suite. On peut par exemple utiliser l'application web suivante : http://json_encode.onlinephpfunctions.com/


    Exemple avec l'interface rendue dans la partie précédente (Compilation dans ARC) :

    "abi":"[{\"constant\":true,\"inputs\":[],\"name\":\"creator\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"dest\",\"type\":\"address\"},{\"name\":\"quantity\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"inputs\":[{\"name\":\"totalShares\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"constructor\"}]"

  3. Les valeurs à transmettre seront :

    1. "abi" au format transcrit pour PHP 5.6.29. (voir point 2.).

    2. "from" : Adresse hash Ethereum de l'entreprise qui déploie le contrat.

    3. "data" : Le bytecode.

    4. "tokens" : Tokens de l'entreprise pour le contrat.

    5. "amount" : Valeur par défaut indexée sur le gaz consommé pour déployer le contrat (0.2 avec le premier contrat en production).

    6. "passphrase" : Le mot de passe du compte "from", c'est-à-dire le mot de passe de l'entreprise qui permet de débloquer le déploiement du contrat.

  4. La méthode employée est POST. Le format du "RAW Payload" est donc :

    {"abi":"abi_format_pour_php_5.6.29", "from":"0x12345...", "data":"bytecode", "tokens":54321, "amount":0.2, "passphrase":"mot_2_passe"}

    Exemple avec le déploiement du premier contrat en production de Smoothie :

    {"abi":"[{\"constant\":true,\"inputs\":[],\"name\":\"creator\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"dest\",\"type\":\"address\"},{\"name\":\"quantity\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"inputs\":[{\"name\":\"totalShares\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"constructor\"}]", "from":"0x938fd640696a468040999872b0bd820d4e5ed422", "data":"606060405234610000576040516020806101b583398101604052515b60008054600160a060020a0319166c010000000000000000000000003381020417808255600160a060020a031681526001602052604090208190555b505b61014e806100676000396000f3606060405260e060020a600035046302d05d3f811461003457806370a082311461005d578063a9059cbb1461007f575b610000565b3461000057610041610094565b60408051600160a060020a039092168252519081900360200190f35b346100005761006d6004356100a3565b60408051918252519081900360200190f35b34610000576100926004356024356100b5565b005b600054600160a060020a031681565b60016020526000908152604090205481565b8015156100c157610000565b33600160a060020a031682600160a060020a031614156100e057610000565b600160a060020a03821615156100f557610000565b600160a060020a0333166000908152600160205260409020548190101561011b57610000565b600160a060020a0380831660009081526001602052604080822080548501905533909216815220805482900390555b505056", "tokens":1000, "amount":0.2, "passphrase":"passphrase"}



En résultat on obtiendra l'adresse Ethereum du contrat (0x...). Il faudra la noter pour accéder plus tard au contrat, ses variables et ses fonctions.

  1. Création d'un nouveau compte Ethereum (en dehors d'un contrat dont le compte est crée pour chaque déploiement).

    Requète "New Account" en méthode GET.

    La valeur de "passphrase" est le mot de passe à définir pour le nouvel account.

    Ne pas oublier de faire précéder le mot de passe par le nom du paramètre : ...passphrase=mot_2_passe.



    La réponse obtenue est l'addresse Ethereum du nouveau compte crée.


  2. Réaliser une transaction (à partir du compte par défaut).

    Requète "Send Tx" en méthode GET.

    Ne pas oublier de faire précéder les paramètres avec leur nom : .../sendTransaction?receiver=0x0879...&amount=123456.



    La réponse obtenue est le hash de la transaction.


  3. Récupérer l'adresse du compte par défaut.

    Requète "Default Account" en méthode GET.



    La réponse obtenue est bien sûr l'adresse Ethereum du compte par défaut.


  4. Récupérer la liste des comptes du noeud Ethereum.

    Requète "Accounts List" en méthode GET.



    Bien sûr, la réponse obtenue est la liste des comptes gérés par le noeud Ethereum.


  5. Récupérer la balance d'un compte.

    Requète "Balance" en méthode GET.



    La réponse obtenue est la balance du compte sous deux formes, dont la balance en WEI.


  1. Obtenir la balance en jetons d'un compte à l'intérieur d'un contrat.

    Requète "Internal Balance" en méthode POST.

    Ne pas oublier de vérifier le Content-Type qui doit être positionné sur "application/json".


    Il faut spécifier dans le payload l'interface/abi du contrat, l'adresse du contrat, et enfin, l'adresse Ethereum du compte dont on veut la balance en jetons.

    Exemple de payload :

    { "abi": "[{\"constant\":true,\"inputs\":[],\"name\":\"creator\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"dest\",\"type\":\"address\"},{\"name\":\"quantity\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"inputs\":[{\"name\":\"totalShares\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"constructor\"}]", "contract": "0xffc08af73478d9c0681dc8d2027c92b57a09e6d4", "of": "0x43b77b4031554e04a134ec3a5a3dd1ec4aaaae40" }

    La réponse obtenue est la balance en jetons du compte choisi à l'intérieur du contrat.


  2. Réaliser un transfert de jetons d'un compte à un autre à l'intérieur d'un contrat.

    Requète "Internal Tx" en méthode POST.

    Ne pas oublier de vérifier le Content-Type qui doit être positionné sur "application/json".


    Les différents paramètres à fournir sont :

    1. "to" : Adresse Ethereum destination des tokens dans le contrat.

    2. "from" : Adresse Ethereum expéditeur des tokens dans le contrat.

    3. "passphrase" : Bien sûr, le mot de passe de l'expéditeur.

    4. "contract" : Adresse Ethereum du contrat en question.

    5. "tokens" : Le nombre de jetons transférés dans le contrat.

    6. "abi" : L'interface format PHP 5.6.29...


    Exemple de payload :

    Bleh