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-ethereum
の solc
コマンドで行うか、 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が不足していなければ、デキるはず。