LoginSignup
8
7

More than 5 years have passed since last update.

JSON-RPC経由でEthereumのContractを作る

Posted at

Ethereumのブロックチェインにプログラムからアクセスする場合、 web3.js とか Node.js用ライブラリとかのJavaScriptAPI(https://github.com/ethereum/wiki/wiki/JavaScript-API) を使うのが一般的だ(Ethereum自体がまだそれほど一般的ではないのは置いておいて・・・)。documentも結構が充実しているし、分かりやすい構造なので、とりあえずEthereumに繋げられればいいやというときには、もうこの一択。

んが、使用言語など、作る際の制約が制約が色々出てくると、JSON-RPC(https://github.com/ethereum/wiki/wiki/JSON-RPC ) 経由でのアクセスが必要となってくる。

JavaScriptAPIも、JSON-RPCをJavaScriptが持つキャッチーかつフニャフニャな衣で包んでるだけなので(内部は完全にJSON-RPC)、そっちでできることは、全てJSON-RPCでも出来る。

まずは Contract を作らないと始まらないということで、とりあえず今回は、 Contract を作る方法を書き殴ります。

準備

Contractのコードを書く

コンストラクタにパラメータがある場合のアクセスにもの凄く苦戦したので、

  • コンストラクタ無し
  • パラメータ付きのコンストラクタあり

の2つの Contract 準備したものとして説明する。下はサンプル。言語は Solidity

contract Nassy {
    // ... functionとか変数とか
}

contract Ariinu {
    function Ariinu(int nanika, address dokoka) {
        // ... 何かの処理
    } 
    // ... functionとか変数とか
} 

コードをゲット

で、こいつをコンパイル。コンパイルは、 cpp-ethereumsolc コマンドで行うか、 JavaScriptAPIの、 web3.eth.compile.solidity() ファンクション( https://github.com/ethereum/wiki/wiki/JavaScript-API#web3ethcompilesolidity )から行う。

で、出来上がった、0からfの文字が繰り返される諸行無常(ZAZEN-BOYSを聴きながら書いてる・・・)のコードを退避。自分は、solcの実行からできたコードをGO言語のソースコードにまで落としこむスクリプトを作って、どっからでもかかってこい状態にしている。

ブロックチェイン上に作成

コンストラクタなし

コンストラクタなし(または、パタメータなしコンストラクタ)の方は、割とスムーズに作成できた記憶がある。

こんな感じ。

{"jsonrpc":"2.0","method":"eth_sendTransaction","params":[

{
  "from": "0xb60e8dd61c5d32be8058bb8eb970870f07233155",// 作成アカウントアドレス(左記はテキトー)
  "gas": "0x76c0", // 作成に使っていい最大GAS値,
  "data": "0xd46e8dd6..." // ゲットしたコード
}


], "id":(どのコールのレスポンスかを判別するためのテキトーな番号)}

よし、これで行ってみよう。GASが不足していなければ、デキるはず。

パラメータ付きコンストラクタあり

とりあえず、パラメータありコンストラクタのコードを書いてみたものの、これ、使う時、コンストラクタのパラメータ、どこで指定すんの?? と、JSON-RPCの説明を片っ端から読み漁ったけど、書いていない。

仕方なく、24時間体制でCRYPTOジャンキー野郎の吹き溜まりと化しているGITTER( https://gitter.im/orgs/ethereum/rooms )で、ルー大柴ばりの英語で質問すると、1時間以上放置された後(多分誰もわからないんじゃ・・・)、こーやんじゃねーの的な回答が。

"params":[

{
  "from": "0xb60e8dd61c5d32be8058bb8eb970870f07233155",// 作成アカウントアドレス(左記はテキトー)
  "gas": "0x76c0", // 作成に使っていい最大GAS値,
  "data": "0xd46e8dd6..." // ゲットしたコード   
},
{
  "data":(パラメータ値)
}
]

やってみたけど、出来ない。色んなパラメータ追加したりしてみたけど、全くできない。
ちなみに下の素っ気ないメッセージが出る。

{"code":-32602,"message":"insufficient params, want 1 have 2"}

仕方なく、 web3.js を解析・・・・

そして試した結果、こうすることが分かった。

"params":[

{
  "from": "0xb60e8dd61c5d32be8058bb8eb970870f07233155",// 作成アカウントアドレス(左記はテキトー)
  "gas": "0x76c0", // 作成に使っていい最大GAS値,
  "data": "0xd46e8dd6..." // ゲットしたコード + パラメータ
}
]

コンパイルしたコードの後にパラメータ値をペタッとくっつけるのだ。このパラメータ値は、ルールに則って0からfの文字で繰り返す諸行無常加工をする。(そのルール:https://github.com/ethereum/wiki/wiki/Ethereum-Contract-ABI#function-selector-and-argument-encoding )

よし、これで行ってみよう。GASが不足していなければ、デキるはず。

8
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
7