C Oracle Blockchain PlatformでのEVMを使用したSolidityスマート・契約の実行

Oracle Blockchain PlatformにチェーンコードとしてデプロイされたEthereum仮想マシン(EVM)を使用して、Solidityスマート・コントラクトを実行できます。

EVMは、Ethereumネットワークでスマート・コントラクトを実行します。EVMはHyperledger Burrowプロジェクトを介して作成され、Hyperledger Fabricに統合されました。このプロジェクトでは、Hyperledger Fabric許可ブロックチェーン・プラットフォームを使用して、SolididityなどのEVM互換言語で記述されたEthereumスマート・コントラクトと対話できます。詳細は、Hyperledger Fabric EVMチェーンコードを参照してください。

次のステップでは、プロビジョニングされたOracle Blockchain PlatformでSolidityスマート・コントラクトを実行するプロセスの概要を示します。
  1. EVMチェーンコード・パッケージをOracle Blockchain Platformにアップロードします。
  2. EVMチェーンコードをチャネルにデプロイします。
  3. Remix IDEを使用して、Solidityスマート・コントラクトのバイトコードを生成します。
  4. スマート・コントラクト・バイトコードをデプロイ済のEVMチェーンコードにデプロイします。デプロイメントから返されたアドレスを使用してトランザクションを送信します。
このトピックのステップは、fabric-chaincode-evm:release-0.4でテストされており、他のリリースでは動作しない可能性があります。

EVMチェーンコード パッケージの設定

スマート・コントラクトをデプロイする前に、EVMチェーンコード・パッケージを準備する必要があります。チェーンコード・パッケージ・フォルダを作成するには:

  1. Hyperledger Fabric EVMチェーンコードのGitHubリポジトリからEVMチェーンコード・パッケージ(.zipファイル)をダウンロードします。
  2. ダウンロードしたファイルfabric-chaincode-evm-release-0.4.zipを抽出します。
  3. 抽出されたファイルで、fabric-chaincode-evm-release-0.4/evmccにナビゲートします。
  4. go.sumファイルおよびvendorディレクトリを削除します。
  5. go modコンマンを使用して、すべての依存Goモジュールをベンダー化します。
    go mod tidy
    go mod vendor
  6. fabric-chaincode-evm-release-0.4/emvcc/vendor/github.com/hyperledgerにナビゲートします。
  7. /hyperledgerディレクトリにディレクトリfabric-chaincode-evm/evmccを作成します。
  8. 次のフォルダをfabric-chaincode-evm-release-0.4/evmccディレクトリからfabric-chaincode-evm-release-0.4/evmcc/vendor/github.com/hyperledger/fabric-chaincode-evm/evmccディレクトリに移動します:
    • /address
    • /event
    • /eventmanager
    • /mocks
    • /statemanager
    完了すると、ディレクトリ構造は次のようになります。
    前の手順で説明した変更したディレクトリ構造を示すスクリーンショット。

  9. 最上位のfabric-chaincode-evm-release-0.4/evmccフォルダを.zip形式で圧縮し、名前を変更します。次の例は、evmcc.zipを使用します。

Oracle Blockchain PlatformでのEVMチェーンコードのデプロイ

EVMチェーンコード・パッケージを作成したら、Oracle Blockchain Platformにデプロイします。

  1. Oracle Blockchain Platformコンソールにログインします。
  2. 「チェーンコード」タブで、「新規チェーンコードのデプロイ」をクリックします。
  3. 「クイック・デプロイメント」を選択し、次の情報を入力します:
    • パッケージ・ラベル:チェーンコード・パッケージの説明を入力します。
    • チェーンコード言語: GoLang
    • チェーンコード名:チェーンコードの名前を入力します。たとえば、solidityccと入力します。
    • バージョン: v1
    • 開始- 必須:これを選択解除したままにします。
    • チャネル:チェーンコードをインストールするチャネルを選択します。
    • チェーンコード・ソース:前述のステップで作成したevmcc.zipパッケージをアップロードします。
    クイック・デプロイメント・ウィザードの詳細および「パッケージ・ラベル」「チェーンコード名」などのフィールドの制限は、「クイック・デプロイメントの使用」を参照してください。

情報を送信すると、EVMチェーンコードが「チェーンコード」タブに表示され、インストール対象として選択した各チャネルにデプロイされたチェーンコードとしてリストされます。

Solidityスマート・契約の作成およびコンパイル

  1. ブラウザベースのRemix IDE (https://remix.ethereum.org/)を開きます。
  2. Solidityスマート・契約がすでに記述されている場合は、Remixにインポートします。
  3. Solidityスマート・契約が作成されていない場合は、RemixでSolididityファイル(.sol)を作成し、次のいずれかを実行します:
    • Solidityに慣れている場合は、独自のスマート契約ファイルを作成できます。
    • Solidityドキュメント(Solidity: スマート契約の概要)に記載されているSimple Storageサンプル・コードを使用できます
    • この例で使用されているサンプル・コードを使用すると、入力としてstring nameを使用し、set(name)およびget()を使用して出力文字列と同じ内容を出力できます:
      pragma solidity ^0.4.0;
      contract Myname {
          string public yourName;
      
          function set(string name) public {
              yourName = name;
          }
          function get() public view returns (string) {
              return yourName;
          }
      }
      
    デフォルトのコンパイラ・バージョンが、スマート契約で指定したバージョンと一致しないというエラー・メッセージが表示される場合があります。
  4. スマート契約をコンパイルします。Remixで「Solidity Compiler」パネルを開き、スマート・コントラクト・タブが開いてコンパイル対象のファイルとして選択されていることを確認して、コンパイラのバージョンを最新の4に設定します。Xバージョンで、「コンパイル」をクリックします。
    「リモート・コンパイラ」ビューのテストSolidityスマート・契約の画面キャプチャ。

  5. ファイルのコンパイル後、「Bytecode」アイコンをクリックして、バイトコードとしてJSONドキュメントをクリップボードにコピーします。
  6. コピーしたバイトコードをテキスト・エディタに貼り付けて保存します。

Smart Contractのデプロイ

コピーされたバイトコードでは、必要なセクションは"object"フィールドです。これは、サンプル・スマート・契約のEVMバイトコードです。
"object": "608060405234801561001057600080fd5b50610410806100206000396000f30060
8060405260043610610057576000357c0100000000000000000000000000000000000000000000000000000000900463
ffffffff1680634ed3885e1461005c5780636d4ce63c146100c5578063d97d663014610155575b600080fd5b34801561
006857600080fd5b506100c3600480360381019080803590602001908201803590602001908080601f01602080910402
602001604051908101604052809392919081815260200183838082843782019150505050505091929192905050506101
e5565b005b3480156100d157600080fd5b506100da6101ff565b60405180806020018281038252838181518152602001
91508051906020019080838360005b8381101561011a5780820151818401526020810190506100ff565b505050509050
90810190601f1680156101475780820380516001836020036101000a031916815260200191505b509250505060405180
910390f35b34801561016157600080fd5b5061016a6102a1565b60405180806020018281038252838181518152602001
91508051906020019080838360005b838110156101aa57808201518184015260208101905061018f565b505050509050
90810190601f1680156101d75780820380516001836020036101000a031916815260200191505b509250505060405180
910390f35b80600090805190602001906101fb92919061033f565b5050565b6060600080546001816001161561010002
03166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615
6101000203166002900480156102975780601f1061026c57610100808354040283529160200191610297565b82019190
6000526020600020905b81548152906001019060200180831161027a57829003601f168201915b505050505090509056
5b60008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190
818152602001828054600181600116156101000203166002900480156103375780601f1061030c576101008083540402
83529160200191610337565b820191906000526020600020905b81548152906001019060200180831161031a57829003
601f168201915b505050505081565b828054600181600116156101000203166002900490600052602060002090601f01
6020900481019282601f1061038057805160ff19168380011785556103ae565b828001600101855582156103ae579182
015b828111156103ad578251825591602001919060010190610392565b5b5090506103bb91906103bf565b5090565b61
03e191905b808211156103dd5760008160009055506001016103c5565b5090565b905600a165627a7a72305820a990d4
0b57c66329a32a18e847b3c18d6c911487ffadfed2098e71e8cafa0c980029",
一般に、EVMには次の2つの引数が必要です:
  • toアドレス。
  • イーサリアム・トランザクションで必要なinput

スマート・契約をデプロイする場合、toフィールドはゼロ・アドレスで、inputは契約のコンパイル済EVMバイトコードです。したがって、invokeコマンドには2つの引数があります。最初の引数は、従来はチェーンコード内の関数名でしたが、現在は0000000000000000000000000000000000000000になり、2番目の引数はSolidityスマート・契約バイトコードです。

  1. Solidityスマート・契約をOracle Blockchain Platformにデプロイするには、RESTプロキシ・エンドポイントを使用して、これらの2つの引数でデプロイされたEVMチェーンコードを起動します。
    
    --data-raw '{"chaincode":"<chaincodename>","args":["<zeroaddress>","<EVMbytecode>"]}'
    
    次の例では、cURLを使用して、Solidityスマート・契約をsolidityccという名前のOracle Blockchain Platformにデプロイします。
    curl -L -X POST 'https://<hostname>:443/restproxy/api/v2/channels/<channelname>/transactions' \
    -H 'Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=' \
    -H 'Content-Type: application/json' \
    --data-raw '{"chaincode":"soliditycc","args":["0000000000000000000000000000000000000000","608060405234801561....152d2820d3b5d784b3711119691d0029"],"timeout":0,"sync":true}'
  2. トランザクションのレスポンスpayloadは、デプロイされたコントラクトのアドレスです。この住所をコピーして保存します。契約住所は、スマート・契約機能の実行時に使用されます。
    ペイロード応答フィールドにスマート・契約アドレスが表示されたAPIコールおよびレスポンスの画面キャプチャ。
    この例では、スマート・契約住所は66b92979bb66d645371b3247177e4b2513cb9834です。

スマート・契約の操作

スマート・コントラクト住所を取得したら、次のコールを使用して、RESTプロキシを介してデプロイされたスマート・コントラクトと対話できます。

関数を実行するには、呼出しトランザクションと問合せトランザクションをそれぞれのパラメータとともに使用します。サンプル契約には、getsetの2つの関数が含まれています。

これらのトランザクションでは、toフィールドはコントラスト・アドレスで、inputフィールドは必要な引数のいずれかと連結された関数実行ハッシュです。

トランザクションを実行するには、関数実行のハッシュを取得する必要があります。これを行うには、Remix IDEで関数を実行し、トランザクション・ログからハッシュをコピーします:

  1. Remix IDEで、「Deploy and Run Transactions」パネルを開きます。「Contract」フィールドでcontractが選択されていることを確認し、「Deploy」をクリックします。
    デプロイしようとしているSolidityコントラクトの画面キャプチャ。

    デプロイメントが完了すると、コントラクトが「Deployed Contracts」リストに表示されます。
  2. 「Deployed Contracts」リストでcontractを展開します。スマート契約機能がリストされます。
  3. トランザクションを実行します。表示された例では、oracleと入力し、「set」をクリックします。
  4. ターミナル・ウィンドウにトランザクション・ログが表示されます。トランザクション・ログが最小化されている場合は、ログをクリックして展開します。inputフィールド(ファンクション実行ハッシュ)の横にあるアイコンをクリックして、その値をコピーします。この値をコントラクトのアドレスと同じ場所に保存し、先頭の0xを削除します。
    完了したトランザクションおよびフィールド値が表示され、関数実行ハッシュ値を含む入力フィールドを指しているデプロイメント・ページの画面キャプチャ。

  5. 関数実行ハッシュおよび契約アドレスを取得した後、RAWデータ引数としてハッシュおよびアドレスを使用して、Oracle Blockchain Platformでセット・トランザクションを実行できます。
    
    --data-raw '{"chaincode":"<chaincodename>","args":["<contractaddress>","<setfunctionexecutionhash>"]}'
    
    たとえば、cURLを使用すると、次のようになります。
    curl -L -X POST 'https://<hostname>:443/restproxy/api/v2/channels/<channelname>/transactions' \
    -H 'Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=' \
    -H 'Content-Type: application/json' \
    --data-raw '{"chaincode":"soliditycc","args":["66b92979bb66d645371b3247177e4b2513cb9834","4ed3885e000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000066f7261636c650000000000000000000000000000000000000000000000000000"]}'
    
  6. Oracle Blockchain Platformコンソールを開き、トランザクションがレジャーにリストされていることを確認します。

スマート・コントラクトのget関数を使用して問合せなどの別のトランザクションを実行するには、Remixで関数実行ハッシュを生成し、それをコントラクトのアドレスと組み合せます:

  1. Remixの「Deploy and Run Transactions」パネルで、コントラクトが「Deployed Contracts」の下にまだリストされていることを確認します。そうでない場合は、再デプロイします。
  2. 「取得」をクリックします。setトランザクションの場合と同様に、トランザクションから取得して保存し、先頭の0xを削除します。
    入力フィールドに必要な関数実行ハッシュが含まれていることを示すRemixのgetトランザクションのス画面キャプチャ。

  3. このトランザクション・ハッシュおよびコントラスト・アドレスを使用して、Oracle Blockchain Platformにデプロイされたチェーンコードに対して問合せトランザクションを実行できます。
    
    --data-raw '{"chaincode":"<chaincodename>","args":["<contractaddress>","<getfunctionexecutionhash>"]}'
    
    たとえば、cURLでは次のようになります。
    curl -L -X POST 'https://<hostname>:443/restproxy/api/v2/channels/<channelname>/chaincode-queries' \
    -H 'Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=' \
    -H 'Content-Type: application/json' \
    --data-raw '{"chaincode":"soliditycc","args":["66b92979bb66d645371b3247177e4b2513cb9834","6d4ce63c"]}'
    
    返されるペイロードには、問合せ対象のアセット(この例の場合、文字列oracle)が含まれます。