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 のバージョンが新しければ使ってよいということである。