D Oracle Blockchain PlatformでのEVMを使用したSolidityスマート・コントラクトの実行
このトピックでは、Oracle Blockchain PlatformにチェーンコードとしてデプロイされたEVM (Ethereum Virtual Machine)を使用してSolidityスマート・コントラクトを実行する方法について説明します。
Ethereum Virtual Machineは、Ethereumネットワークでスマート・コントラクトを実行します。これはHyperledger Burrowプロジェクトを介して作成され、Hyperledger Fabricに統合されました。このプロジェクトでは、Hyperledger Fabric許可型ブロックチェーン・プラットフォームを使用して、SolidityなどのEVM互換言語で記述されたEthereumスマート・コントラクトと連携できます。関連項目: Hyperledger Fabric EVMチェーンコードに関する項。
- EVMチェーンコードzipをOracle Blockchain Platformにアップロードします。
- Remix IDEによって生成されたバイトコードを使用してデプロイします。
- デプロイメントに応じてスマート・コントラクトのアドレスを取得し、そのアドレスを使用してトランザクションを送信します。
fabric-chaincode-evm:release-0.4
でテストされており、他のリリースでは動作しない可能性があります。
EVMチェーンコードzipファイルの設定
スマート・コントラクトをデプロイする前に、EVMチェーンコードのzipを準備する必要があります。チェーンコードのzipフォルダを作成するには:
- Hyperledger Fabric EVMチェーンコードからEVMチェーンコードzipをダウンロードします。
- ダウンロードした
fabric-chaincode-evm-release-0.4.zip
を解凍します。 - 抽出されたファイルで、
fabric-chaincode-evm-release-0.4/evmcc/vendor/github.com/hyperledger
に移動します。 /hyperledger
ディレクトリにディレクトリfabric-chaincode-evm/evmcc
を作成します。- 次のフォルダを
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
- 最上位の
fabric-chaincode-evm-release-0.4/evmcc
フォルダを圧縮して名前を変更します。次のステップは、evmcc.zip
を名前の例として使用します。
Oracle Blockchain PlatformでのEVMチェーンコードのデプロイ
EVMチェーンコードzipを作成したら、Oracle Blockchain Platformにデプロイする必要があります。
- Oracle Blockchain Platformコンソールにログインします。
- チェーンコード・タブで、新規チェーンコードのデプロイをクリックします。
- 「クイック・デプロイメント」を選択し、次の情報全体を選択します:
- チェーンコード名: 任意の名前を入力します。この例では
soliditycc
を使用しています。 - バージョン:
v0
- チェーンコードのインスタンス化の初期パラメータ: このフィールドは空のままにします
- チャネル: チェーンコードをインストールしてインスタンス化するチャネルを選択します
- チェーンコード・ソース: 前のステップで作成した
evmcc.zip
パッケージをアップロードします。
- チェーンコード名: 任意の名前を入力します。この例では
Solidityスマート・コントラクトの作成およびコンパイル
- ブラウザベースのRemix IDE (https://remix.ethereum.org/)を開きます。
- Solidityスマート・コントラクトがすでに記述されている場合は、Remixにインポートします。
- Solidityスマート・コントラクトが記述されていない場合は、RemixでSolidityファイル(
.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; } }
- スマート・コントラクトをコンパイルします。Remixで「Solidity Compiler」パネルを開き、スマート・コントラクト・タブが開いていることを確認してコンパイル対象のファイルとして選択し、コンパイラのバージョンを最新の4.Xバージョンに設定して、「Compile」をクリックします。
- ファイルがコンパイルされたら、「Bytecode」アイコンをクリックします。これにより、バイトコードがJSONドキュメントとしてクリップボードにコピーされます。
- コピーしたバイトコードをテキスト・エディタに貼り付けて保存します。
スマート・コントラクトのデプロイ
"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",
to
アドレス。- Ethereumトランザクションで必要な
input
。
スマート・コントラクトをデプロイする場合、to
フィールドはゼロ・アドレスで、input
はコントラクトのコンパイル済EVMバイトコードです。したがって、invoke
には2つの引数があります。最初の引数は、従来はチェーンコード内の関数名になっていましたが、現在は0000000000000000000000000000000000000000
になり、2番目の引数はSolidityスマート・コントラクトのバイトコードです。
- 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>:7443/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}'
- トランザクションのレスポンス
payload
は、デプロイされたコントラクトのアドレスです。このアドレスをコピーして保存します。これは、スマート・コントラクト機能の実行時に使用されます。
この例では、スマート・コントラクトのアドレスは66b92979bb66d645371b3247177e4b2513cb9834
です。
スマート・コントラクトの操作
デプロイされたスマート・コントラクトを操作するには、前述の項でコントラクトをデプロイするときにペイロードとして返されるコントラクトのアドレスが必要です。
関数を実行するには、呼出しトランザクションと問合せトランザクションをそれぞれのパラメータとともに使用します。サンプル・コントラクトには、get
とset
の2つの関数が含まれています。
これらのトランザクションでは、to
フィールドはコントラクトのアドレスで、input
フィールドは必要な引数のいずれかと連結された関数実行ハッシュです。
トランザクションを実行するには、関数実行のハッシュを取得する必要があります。これを行う簡単な方法は、Remix IDEで関数を実行し、トランザクション・ログからハッシュをコピーすることです:
- Remix IDEで、「Deploy and Run Transactions」パネルを開きます。「Contract」フィールドでコントラクトが選択されていることを確認し、「Deploy」をクリックします。
デプロイメントが完了すると、コントラクトが「Deployed Contracts」リストに表示されます。 - 「Deployed Contracts」リストでコントラクトを展開します。スマート・コントラクト機能がリストされます。
- トランザクションを実行します。表示された例では、oracleと入力し、「set」をクリックします。
- ターミナル・ウィンドウにトランザクション・ログが表示されます。トランザクション・ログが最小化されている場合は、ログをクリックして展開します。
「input」
フィールド(関数実行ハッシュ)の横にあるアイコンをクリックして、その値をコピーします。この値をコントラクトのアドレスと同じ場所に保存し、先頭の0x
を削除します。 - 関数実行ハッシュおよびコントラクトのアドレスを取得したら、RAWデータ引数として使用して、Oracle Blockchain Platformでsetトランザクションを実行できます。
cURLの使用例:--data-raw '{"chaincode":"<chaincodename>","args":["<contractaddress>","<setfunctionexecutionhash>"]}'
curl -L -X POST 'https://<hostname>:7443/restproxy/api/v2/channels/<channelname>/transactions' \ -H 'Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=' \ -H 'Content-Type: application/json' \ --data-raw '{"chaincode":"soliditycc","args":["66b92979bb66d645371b3247177e4b2513cb9834","4ed3885e000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000066f7261636c650000000000000000000000000000000000000000000000000000"]}'
- Oracle Blockchain Platformコンソールを開きます。トランザクションが台帳にリストされます。
スマート・コントラクトのget
関数を使用して問合せなどの別のトランザクションを実行するには、Remixで関数実行ハッシュを生成し、それをコントラクトのアドレスと組み合せます:
- Remixの「Deploy and Run Transactions」パネルで、コントラクトが「Deployed Contracts」の下にまだリストされていることを確認します。そうでない場合は、再デプロイします。
- 「get」をクリックします。setトランザクションの場合と同様に、トランザクションから入力を取得して保存し、先頭の
0x
を削除します。 - このトランザクション・ハッシュおよびコントラクトのアドレスを使用して、Oracle Blockchain Platformにデプロイされたチェーンコードに対して問合せトランザクションを実行できます。
cURLでの例:--data-raw '{"chaincode":"<chaincodename>","args":["<contractaddress>","<getfunctionexecutionhash>"]}'
返されるペイロードには、問合せ対象のアセット(この例では文字列curl -L -X POST 'https://<hostname>:7443/restproxy/api/v2/channels/<channelname>/chaincode-queries' \ -H 'Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=' \ -H 'Content-Type: application/json' \ --data-raw '{"chaincode":"soliditycc","args":["66b92979bb66d645371b3247177e4b2513cb9834","6d4ce63c"]}'
oracle
)が含まれます。