hiro99ma blog

Something technical

btc: JSON-RPC では by-name も OK

2025/02/25

bitcoin-cli はコマンドによって引数が違う。
複数の引数がある際、省略して良いものと良くないものが混在している。

例えば sendtoaddress(v28.1)は 11個の引数を取ることができる。 宛先アドレスと送金額だけ指定するなら引数を 2つ書けば良いのだが、 feerate を指定しようと思ったら 10番目の引数なのでその間をデフォルト値を調べて埋めていた。

$ bitcon-cli sendtoaddress $addr 0.01 "" "" false true 1 "unset" true 1

それが最近(でもないのだが) -named というオプションが増えた。
順番に列挙する形ではなく、引数の名前を使うようにする。

$ bitcon-cli -named sendtoaddress address=$addr amount=0.1 fee_rate=1

bitcoin-cli はよいけど JSON-RPC で制御する分には関係ないと思っていたのだが、 ブログを書いていたので tcpdump を使って -named のときに bitcoin-cli が送信しているデータを確認した。
そうすると、params[] ではなく {} で JSON の key-value を送信しているではないか!

ならば curl などでもできるはず・・・できた。

$ curl --user user:pass --data-binary '{"jsonrpc": "2.0", "id": "curltest", "method": "sendtoaddress", "params": {"address":"$addr", "amount": 0.001, "fee_rate": 1 }}' -H 'content-type: application/json' http://127.0.0.1:18443/
{"jsonrpc":"2.0","result":"084f7bf4e4b94152a4ef232bea08cba630f7b98cfecc7ae42cbc69a61ea43721","id":"curltest"}

rpc/client.cpp にそれっぽい構造体があったので、 てっきり bitcoin-cli-named を JSON配列に置き換えているものだと思っていたのだ。

どれでも使えるのか?

ただ、これは help に書いていない。 少なくとも sendtoaddress には curl での例も載ってない。 なので、どのコマンドでも使えるのかは自信がない。

ドキュメントがあった。

Bitcoin Core v25.0 のリリースノート に new named parameter ということでリンクされていた。 “JSON-RPC server” が by-position と by-name の両方に対応したのだ。
つまり bitcoind の方なので JSON-RPC として名前パラメータの方も使ってよいのだ。 もちろん by-position もいままで通り使えるし、なんと混在までできるようだ。 -named を付けたら全部名前付きにしないといけないと思っていたが、そうではないのね。

というわけで、Bitcoin Core のバージョンが新しければ使ってよいということである。


 < Top page


コメント(Google Formへ飛びます)

GitHub

X/Twitter

Homepage