おふとんの中から寝言をつぶやく

ビットコインなどの暗号(仮想)通貨関連の話題を中心に雑多に書きます。

Rubyでethereumを送る方法

Ruby gemの

https://rubygems.org/gems/ethereum

を使ってEth(Nuko)を送信することに成功したので、悩んだ場所とその解決方法を書きます。

 

結論だけ言うと、送信数を指定するときに、to_twos_complementを使ってweiの値をHEX化する必要がありました。

 

gist.github.com

 

 全体的にはホストとポートの指定方法がわかれば使いやすいGemかなと思いましたが、send_transactionのパラメータの指定方法がわかりませんでした。

 

普通に

res = client.send_transaction('from'=> from_addr, 'to'=>to_addr, 'value'=> wei)

とやってしまうと、

{"jsonrpc"=>"2.0", "id"=>8, "error"=>{"code"=>-32602, "message"=>"invalid argument 0: cannot unmarshal non-string as hex data"}}

というエラーが出てしまい、送信出来ずにいたのです。

 

get_balanceで受け取ったデータがHEXだったので、ここで渡すパラメータもHEXにしないといけないのだろうと言うところまではわかったのですが、どうにも数字をHEX化するメソッドを見つけられずにいました。

ずっとformatter.rbの中をto_* とかfrom_*をながめていたつもりだったのですが、hexとasciiしかみていなくて、数日ほど悩みました。

ふと、引数にnumberを取るものという視点で探し始めて目についたのがto_twos_complementというメソッドでした。

そしてうまくいきました。

そういうわけで、ここに貼り付けたソースリストの22行目が今回の肝でした。

 

なお、ノードを立ち上げるときに--rpcapiにpersonalを含めないと

{"jsonrpc"=>"2.0", "id"=>8, "error"=>{"code"=>-32601, "message"=>"The method personal_unlockAccount does not exist/is not available"}}

というエラーが出ます。

 

英語でも情報がなかった感じだったので記録として残すことにしました。