EOS契約開発第八章-EOSローカル契約入門

16313 ワード

EOSローカル契約入門
一、インテリジェント契約入門
このチュートリアルの目的は、スマート契約の実験に使用できるローカルブロックチェーンを設定する方法を示すことです.このチュートリアルの第1部では、次のことに重点を置きます.
  • プライベートブロックチェーン
  • を起動する
  • ウォレット
  • を作成
  • Bios契約
  • をロード
  • アカウント
  • を作成
    このチュートリアルの第2部では、独自の契約の作成と導入について説明します.
  • eosio.token契約
  • Exchange契約
  • Hello World契約
  • このチュートリアルでは、EOSIOをインストールし、nodeosとcleosがパスにあるとします.
    二、プライベートブロックチェーンの起動
    次のコマンドを使用して、独自の単一ノードブロックチェーンを起動できます.
    $ nodeos -e -p eosio --plugin eosio::wallet_api_plugin --plugin eosio::chain_api_plugin --plugin eosio::account_history_api_plugin 
    ...
    eosio generated block 046b9984... #101527 @ 2018-04-01T14:24:58.000 with 0 trxs
    eosio generated block 5e527ee2... #101528 @ 2018-04-01T14:24:58.500 with 0 trxs

    このコマンドは多くのオプションを設定し、オプションのプラグインをロードします.このチュートリアルの残りの部分でこれらのプラグインを使用します.すべてが正常であると仮定すると、0.5秒ごとにブロック生成メッセージが表示されます.これは、ローカルブロックチェーンがアクティブで、ブロックを生成して使用できることを意味します.`nodeos`で使用できる他のパラメータについては、コマンドラインのヘルプを参照してください.
    nodeos --help
    三、財布を作成する
    財布は秘密鍵ライブラリであり、ブロックチェーン上で操作を実行するために必要な許可秘密鍵ライブラリである.これらの鍵はディスクに格納され、財布のパスワードを使用して暗号化されます.財布のパスワードは安全なパスワードマネージャに保存する必要があります.
    $ cleos wallet create
    Creating wallet: default
    Save password to use in the future to unlock this wallet.
    Without password imported keys will not be retrievable.
    "PW5JuBXoXJ8JHiCTXfXcYuJabjF9f9UNNqHJjqDVY7igVffe3pXub"

    このシンプルな開発環境と財布の管理を実現するために、nodeosを起動するとeosio::wallet_を起動しました.api_プラグインプラグインです.財布はプラグインで管理されています.いつでもnodeosを再起動するには、財布をロックしてから鍵を使用する必要があります.
    $ cleos wallet unlock --password PW5JuBXoXJ8JHiCTXfXcYuJabjF9f9UNNqHJjqDVY7igVffe3pXub
    Unlocked: default

    コマンドラインで直接パスワードを使用し、bash履歴に記録するのは安全ではありません.したがって、インタラクティブモードでロックを解除することもできます.
    $ cleos wallet unlock
    password:

    安全上、財布を使わないときは財布をロックしたほうがいいです.nodeosを閉じずに財布をロックするには、次のようにします.
    $ cleos wallet lock
    Locked: default

    このチュートリアルの残りの部分では、財布のロックを解除する必要があります.原文には秘密鍵のインポートの手順はありません.次のチュートリアルを完了するには、財布のロック解除状態でeosioの秘密鍵をインポートする必要があります.eosioの秘密鍵は公開されています.
    $ cleos wallet import –n default 5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3

    四、bios契約のロード
    財布を持っていて、eosioアカウントの鍵をロードして、デフォルトのシステム契約を設定することができます.開発の目的のために、デフォルトのeosioを使用することができる.bios契約.この契約により、他のアカウントのリソース割り当てを直接制御し、他の特権APIを呼び出すことができます.公開ブロックチェーンでは、このシステム契約は、他のアカウントのtoken抵当および抵当操作を管理し、契約がCPUの予約、ネットワークアクティビティ帯域幅、およびメモリの予約を実行すると考えられる.
    eosio.Bios契約はEOSIOソースフォルダにあります:contracts/eosio.bios.次のコマンドシーケンスは、EOSIOソースコードのルートディレクトリで実行されると仮定します.ただし、このコマンドは、完全なパスを指定することで、任意の場所から実行できます:${EOSIO_SOURCE}/build/contracts/eosio.bios.
    $ cleos set contract eosio build/contracts/eosio.bios -p eosio
    Reading WAST...
    Assembling WASM...
    Publishing contract...
    executed transaction: 414cf0dc7740d22474992779b2416b0eabdbc91522c16521307dd682051af083  4068 bytes  10000 cycles
    #         eosio <= eosio::setcode               {"account":"eosio","vmtype":0,"vmversion":0,"code":"0061736d0100000001ab011960037f7e7f0060057f7e7e7e...
    #         eosio <= eosio::setabi                {"account":"eosio","abi":{"types":[],"structs":[{"name":"set_account_limits","base":"","fields":[{"n...

    このコマンドシーケンスの結果、cleosは2つの操作(actions)を含む取引(transaction):eosio::setcodeおよびeosio::setabiを開始する.
    コードは契約がどのように実行されるかを定義し、abiはパラメータがバイナリとjson表現の間でどのように変換されるかを記述する.abiは技術的にはオプションですが、使いやすいようにすべてのEOSIOツールが依存しています.
    トランザクション(transaction)を実行すると、次の出力が表示されます.
    executed transaction: 414cf0dc7740d22474992779b2416b0eabdbc91522c16521307dd682051af083  4068 bytes  10000 cycles
    #         eosio <= eosio::setcode               {"account":"eosio","vmtype":0,"vmversion":0,"code":"0061736d0100000001ab011960037f7e7f0060057f7e7e7e...
    #         eosio <= eosio::setabi                {"account":"eosio","abi":{"types":[],"structs":[{"name":"set_account_limits","base":"","fields":[{"n...

    これは、eosioアカウント契約によって定義されたsetcode操作が、eosioアカウントによって与えられる{args...}を選択して設定できます.(注:この言葉は少し迂回しています.eosの中では口座ごとに1つの契約しか発表できないので、口座と契約は対応していると考えられています.口座の下には契約がなくても、あれば1つしかありません.また、この契約の発表もeosio口座の権限で署名されています.)
    #         ${executor} <= ${contract}:${action} ${args...}
    > console output from this execution, if any

    後述するように、操作(actions)は複数の契約で処理できます.
    このコマンドの最後のパラメータは-p eosioです.このパラメータはcleosに、eosioアカウントのactive権限でこの操作に署名することを示します.すなわち、財布をインポートしたeosioアカウントの秘密鍵を使用して操作に署名します.
    五、口座の作成
    今、私たちは基本的なシステム契約を確立して、自分の口座を作成することができます.2つのアカウント、user、testerを作成し、鍵を各アカウントに関連付ける必要があります.この例では、両方のアカウントで同じ鍵が使用されます.(注:ここから、eos内の口座と鍵のペアの間には厳密な対応関係はなく、A口座はB口座と同じ鍵のペアを完全に使用できることがわかります)
    このため、まずアカウントに鍵を生成します.
    $ cleos create key
    Private key: 5Jmsawgsp1tQ3GD6JyGCwy1dcvqKZgX6ugMVMdjirx85iv5VyPR
    Public key: EOS7ijWCBmoXBi3CgtK7DJxentZZeTkeUnaSDvyro9dq7Sd1C3dC4

    次に、この鍵を財布にインポートします.
    $ cleos wallet import 5Jmsawgsp1tQ3GD6JyGCwy1dcvqKZgX6ugMVMdjirx85iv5VyPR
    imported private key for: EOS7ijWCBmoXBi3CgtK7DJxentZZeTkeUnaSDvyro9dq7Sd1C3dC4

    注:cleosコマンドによって生成された実際の秘密鍵が、上記の例に示す値ではなく、使用されていることを確認します.
    鍵は財布に自動的に追加されないため、この手順をスキップすると、アカウントの制御権が失われる可能性があります.
    2つのユーザーアカウントの作成
    次に、上記で作成およびインポートした鍵を使用して、2つのアカウント、userおよびtesterを作成します.
    $ cleos create account eosio user EOS7ijWCBmoXBi3CgtK7DJxentZZeTkeUnaSDvyro9dq7Sd1C3dC4 EOS7ijWCBmoXBi3CgtK7DJxentZZeTkeUnaSDvyro9dq7Sd1C3dC4
    executed transaction: 8aedb926cc1ca31642ada8daf4350833c95cbe98b869230f44da76d70f6d6242  364 bytes  1000 cycles
    #         eosio <= eosio::newaccount            {"creator":"eosio","name":"user","owner":{"threshold":1,"keys":[{"key":"EOS7ijWCBmoXBi3CgtK7DJxentZZ...
    
    $ cleos create account eosio tester EOS7ijWCBmoXBi3CgtK7DJxentZZeTkeUnaSDvyro9dq7Sd1C3dC4 EOS7ijWCBmoXBi3CgtK7DJxentZZeTkeUnaSDvyro9dq7Sd1C3dC4
    executed transaction: 414cf0dc7740d22474992779b2416b0eabdbc91522c16521307dd682051af083 366 bytes  1000 cycles
    #         eosio <= eosio::newaccount            {"creator":"eosio","name":"tester","owner":{"threshold":1,"keys":[{"key":"EOS7ijWCBmoXBi3CgtK7DJxentZZ...

    注意:create accountサブコマンドには、OwnerKey(本番環境で高度なセキュリティを維持する必要がある)とActiveKeyの2つの鍵が必要です.このチュートリアルの例では、両方とも同じ鍵を使用します.
    eosio::account_をロードしたからですhistory_api_pluginプラグインなので、鍵で制御されているすべてのアカウントをクエリーできます.
    $ cleos get accounts EOS7ijWCBmoXBi3CgtK7DJxentZZeTkeUnaSDvyro9dq7Sd1C3dC4
    {
      "account_names": [
        "tester",
        "user"
      ]
    }

    六、Eosio.ExchangeとEosiomsig契約
     
    eosioを導入しますtoken契約では、同じ契約で多くの異なるtokenを作成して実行できますが、これらのtokenは異なるユーザーによって管理される可能性があります.
    token契約を導入する前に、アカウントを作成して導入する必要があります.ここで作成する口座名はeosioです.token、もちろん別の口座名も使えます.
    $ cleos create account eosio eosio.token EOS7ijWCBmoXBi3CgtK7DJxentZZeTkeUnaSDvyro9dq7Sd1C3dC4 EOS7ijWCBmoXBi3CgtK7DJxentZZeTkeUnaSDvyro9dq7Sd1C3dC4
    ...

    その後、契約をこのディレクトリの下に配置することができます:${EOSIO_SOURCE}/build/contracts/eosio.token
    $ cleos set contract eosio.token build/contracts/eosio.token -p eosio.token
    Reading WAST...
    Assembling WASM...
    Publishing contract...
    executed transaction: 528bdbce1181dc5fd72a24e4181e6587dace8ab43b2d7ac9b22b2017992a07ad  8708 bytes  10000 cycles
    #         eosio <= eosio::setcode               {"account":"eosio.token","vmtype":0,"vmversion":0,"code":"0061736d0100000001ce011d60067f7e7f7f7f7f00...
    #         eosio <= eosio::setabi                {"account":"eosio.token","abi":{"types":[],"structs":[{"name":"transfer","base":"","fields":[{"name"...

    七、EOS Tokenの作成
    contracts/eosio.token/eosio.token.hppヘッダファイルでeosioを表示します.token契約が提供する操作(actions):
       void create( account_name issuer,
                    asset        maximum_supply,
                    uint8_t      can_freeze,
                    uint8_t      can_recall,
                    uint8_t      can_whitelist );
    
    
       void issue( account_name to, asset quantity, string memo );
    
       void transfer( account_name from,
                      account_name to,
                      asset        quantity,
                      string       memo );

    新しいtokenを作成するには、create(...)を適切なパラメータで呼び出す必要があります.を選択します.このコマンドは、最大供給量(maximum_supply)のtokenシンボルを使用してtokenを一意に識別します.発行者(issuer)は、発行(issue)操作を呼び出し、フリーズ、リコール、ホワイトリストへのユーザーの登録などの他の操作を実行する権利を有する.
    この操作を呼び出す簡単な方法は次のとおりです(シーケンス化パラメータ).
    $ cleos push action eosio.token create '[ "eosio", "1000000000.0000 EOS", 0, 0, 0]' -p eosio.token
    executed transaction: 0e49a421f6e75f4c5e09dd738a02d3f51bd18a0cf31894f68d335cd70d9c0e12  260 bytes  1000 cycles
    #   eosio.token <= eosio.token::create          {"issuer":"eosio","maximum_supply":"1000000000.0000 EOS","can_freeze":0,"can_recall":0,"can_whitelis...

    または、名前付きパラメータを使用して、この操作のより詳細なメソッドを呼び出します.
    $ cleos push action eosio.token create '{"issuer":"eosio", "maximum_supply":"1000000000.0000 EOS", "can_freeze":0, "can_recall":0, "can_whitelist":0}' -p eosio.token
    executed transaction: 0e49a421f6e75f4c5e09dd738a02d3f51bd18a0cf31894f68d335cd70d9c0e12  260 bytes  1000 cycles
    #   eosio.token <= eosio.token::create          {"issuer":"eosio","maximum_supply":"1000000000.0000 EOS","can_freeze":0,"can_recall":0,"can_whitelis...

    このコマンドは、小数点以下4桁の精度を持つEOSという新しいtokenを作成し、最大供給量は100000000000.0000 EOSです.
    このtokenを作成するにはeosioが必要です.token契約アカウントのライセンスは、tokenシンボルネーミングスペース(例えば、「EOS」)を「所有しているためです.本契約の将来のバージョンでは、他のアカウントがtokenシンボル名を購入することを許可する場合があります.だから、私たちは-p eosio.tokenはこの呼び出しを許可します.
    八、口座「User」にTokenを発行する
    EOSという名前のtokenを作成し、発行者は以前に作成したuserアカウントに新しいtokenを発行することができます.
    シーケンス化パラメータ方式を使用してアクションを呼び出します(または、名前付きパラメータ方式を使用します).
    $ cleos push action eosio.token issue '[ "user", "100.0000 EOS", "memo" ]' -p eosio
    executed transaction: 822a607a9196112831ecc2dc14ffb1722634f1749f3ac18b73ffacd41160b019  268 bytes  1000 cycles
    #   eosio.token <= eosio.token::issue           {"to":"user","quantity":"100.0000 EOS","memo":"memo"}
    >> issue
    #   eosio.token <= eosio.token::transfer        {"from":"eosio","to":"user","quantity":"100.0000 EOS","memo":"memo"}
    >> transfer
    #         eosio <= eosio.token::transfer        {"from":"eosio","to":"user","quantity":"100.0000 EOS","memo":"memo"}
    #          user <= eosio.token::transfer        {"from":"eosio","to":"user","quantity":"100.0000 EOS","memo":"memo"}

    今回の出力には、1回の発行(issue)と3回の振替(transfer)といういくつかの異なる操作が含まれています.私たちが実行する唯一の操作はissueですが、このissue操作は「インラインtransfer」を実行し、「インライン振替」は送信者と受取人の口座に通知します.出力内容は、動作中に呼び出されたすべてのプロセッサが呼び出される順序と、その生成されたすべての出力を示す.
    技術的にはeosiotoken契約では、「インライン送金」inline transferステップをスキップし、残高の直接変更を選択できます.しかし、eosio.token契約では、token振替の慣例に従っています.すなわち、すべての口座の残高が、それらの振替行為の合計を参照することによって導出されることが要求されています.また、預金と引き出しを自動的に処理できるように、資金の送信者と受取人に通知する必要があります.
    トランザクション(transaction)がブロードキャストされる実際の状況を見たい場合は、-d-jオプションを使用して「ブロードキャストしない」と「json形式でトランザクション実行状況に戻る」を表すことができます.
    $ cleos push action eosio.token issue '["user", "100.0000 EOS", "memo"]' -p eosio -d -j
    {
      "expiration": "2018-04-01T15:20:44",
      "region": 0,
      "ref_block_num": 42580,
      "ref_block_prefix": 3987474256,
      "net_usage_words": 21,
      "kcpu_usage": 1000,
      "delay_sec": 0,
      "context_free_actions": [],
      "actions": [{
          "account": "eosio.token",
          "name": "issue",
          "authorization": [{
              "actor": "eosio",
              "permission": "active"
            }
          ],
          "data": "00000000007015d640420f000000000004454f5300000000046d656d6f"
        }
      ],
      "signatures": [
        "EOSJzPywCKsgBitRh9kxFNeMJc8BeD6QZLagtXzmdS2ib5gKTeELiVxXvcnrdRUiY3ExP9saVkdkzvUNyRZSXj2CLJnj7U42H"
      ],
      "context_free_data": []
    }

    九、口座「Tester」に振り込む
    今userアカウントにtokenがあります.いくつかのtokenをアカウントtesterに振り替えます.認証パラメータ-p userを使用して、userがこの操作を許可したことを示します.
    $ cleos push action eosio.token transfer '[ "user", "tester", "25.0000 EOS", "m" ]' -p user
    executed transaction: 06d0a99652c11637230d08a207520bf38066b8817ef7cafaab2f0344aafd7018  268 bytes  1000 cycles
    #   eosio.token <= eosio.token::transfer        {"from":"user","to":"tester","quantity":"25.0000 EOS","memo":"m"}
    >> transfer
    #          user <= eosio.token::transfer        {"from":"user","to":"tester","quantity":"25.0000 EOS","memo":"m"}
    #        tester <= eosio.token::transfer        {"from":"user","to":"tester","quantity":"25.0000 EOS","memo":"m"}

    十、Exchange契約の配置
    上記の例と同様に、通貨の作成と取引の機能を提供するexchange契約を導入できます.以前と同様に、次のコマンドはEOSIOソースコードのルートディレクトリから実行されると仮定します.
    $ cleos create account eosio exchange  EOS7ijWCBmoXBi3CgtK7DJxentZZeTkeUnaSDvyro9dq7Sd1C3dC4 EOS7ijWCBmoXBi3CgtK7DJxentZZeTkeUnaSDvyro9dq7Sd1C3dC4
    executed transaction: 4d38de16631a2dc698f1d433f7eb30982d855219e7c7314a888efbbba04e571c  364 bytes  1000 cycles
    #         eosio <= eosio::newaccount            {"creator":"eosio","name":"exchange","owner":{"threshold":1,"keys":[{"key":"EOS7ijWCBmoXBi3CgtK7DJxe...
    
    $ cleos set contract exchange build/contracts/exchange -p exchange
    Reading WAST...
    Assembling WASM...
    Publishing contract...
    executed transaction: 5a63b4de8a1da415590778f163c5ed26dc164c960185b20fd834c297cf7fa8f4  35172 bytes  10000 cycles
    #         eosio <= eosio::setcode               {"account":"exchange","vmtype":0,"vmversion":0,"code":"0061736d0100000001f0023460067f7e7f7f7f7f00600...
    #         eosio <= eosio::setabi                {"account":"exchange","abi":{"types":[{"new_type_name":"account_name","type":"name"}],"structs":[{"n...

    十一、Eosioを配置する.msig契約
    eosio.msig契約は、複数の非同期で単一の取引に署名することを許可します.基本的な機能として、EOSIOはマルチ署名(multisig)のサポートを提供していますが、このチャネルでデータを転送して署名する同期側チャネルが必要です.Eosio.msigはユーザーに対してより友好的な方法であり、非同期で多方面の同意を提出し、承認し、最終的に発表する取引である.
    次の手順はeosioの導入に用いることができる.msig契約.
    $ cleos create account eosio eosio.msig  EOS7ijWCBmoXBi3CgtK7DJxentZZeTkeUnaSDvyro9dq7Sd1C3dC4 EOS7ijWCBmoXBi3CgtK7DJxentZZeTkeUnaSDvyro9dq7Sd1C3dC4
    #         eosio <= eosio::newaccount            {"creator":"eosio","name":"eosio.msig","owner":{"threshold":1,"keys":[{"key":"EOS7ijWCBmoXBi3CgtK7DJ...
    
    $ cleos set contract eosio.msig build/contracts/eosio.msig -p eosio.msig
    Reading WAST...
    Assembling WASM...
    Publishing contract...
    executed transaction: a113a7db8c878dfd894671792770b59a04efb3aa8295f5b3d585daf89c314ec9  8964 bytes  10000 cycles
    #         eosio <= eosio::setcode               {"account":"eosio.msig","vmtype":0,"vmversion":0,"code":"0061736d0100000001bd011b60047f7e7e7f0060047...
    #         eosio <= eosio::setabi                {"account":"eosio.msig","abi":{"types":[{"new_type_name":"account_name","type":"name"},{"new_type_na...