钱包的统一出口:send 命令如何合并选币、费率与 OP_RETURN 图 1
钱包的统一出口:send 命令如何合并选币、费率与 OP_RETURN · 图 1

比特币核心的钱包 RPC 里有一族名字相近的命令:sendtoaddresssendmanysendall,以及一个单字母气质完全不同的成员——send。它从 0.21 起进入版本说明,定位是”语法接近 walletcreatefundedpsbt、支持自动选币与自定义费率”的统一出口;到了 v31.0,它在 src/wallet/rpc/spend.cpp 里的定义仍顶着 EXPERIMENTAL 标注。本文把它逐个参数拆开,说明它凭什么能把几条老命令的活合到一张调用里。

骨架:outputs 加四个位置参数

最外层是 send "outputs" ( conf_target estimate_mode fee_rate options )。outputs 有两种写法:地址到金额的字典,或者数组形式——数组形式多一种能力,允许用 data 键给十六进制数据,它会被编译成一个 OP_RETURN 输出。也就是说,“付钱”和”钉一小段数据”可以在同一笔里完成,前提是你清楚 OP_RETURN 的标准性上限并知道数据永久上链。紧跟的三个是费率三件套:确认块数目标、估算模式(大小写不敏感,economical 与 conservative 的分工在交易可替换时用前者)、或者直接给 fee_rate 以聪每虚拟字节定价——给了 fee_rate 就不再看前两个。最后一个可选的位置参数是交易版本,v30 起这族命令允许标准版本 1 到 3。

钱包的统一出口:send 命令如何合并选币、费率与 OP_RETURN 图 2
钱包的统一出口:send 命令如何合并选币、费率与 OP_RETURN · 图 2

options 对象:细粒度全在这里

options 里藏着一整面控制面板。选币侧:add_inputs 控制缺额时是否自动补币(显式给 inputs 时默认不补);inputs 手动锁死用哪几枚 UTXO,每笔还能声明 weight 帮费用估算少猜;minconfmaxconf 给自动选币加确认数上下界;include_unsafe 允许动用”不安全”输入(别人未确认交易的钱币),代价是上游一旦消失交易可能作废,文档对此有明确警告。输出侧:change_address 指定找零去处,或用 change_position 调整找零位置,或 change_typebech32m 等格式选找零样式;subtract_fee_from_outputs 按下标让指定输出平摊费用——给交易所或退款场景用,收款人实际到账会少于填写金额,使用前要三思。记账侧:add_to_wallet 设假就不入钱包,配合 psbt=true 直接返回 PSBT,把签名环节交给离线机器;lock_unspents 顺手把选中的币锁住,防并发重复花费;max_tx_weight 给交易体积封顶,凑不出来就失败而不是塞成巨型交易。曾经负责看门地址的 include_watching 已标注弃用、不再使用。

返回值与”下一步”语义

返回对象有三种形状:complete 为真且交易入钱包并广播时给 txid;add_to_wallet 为假时给 hex;还差签名或走 PSBT 路线时给 psbt。对账脚本按这三个字段分支即可,不存在”既返回 txid 又返回 hex”的中间态。

和邻居们的分工

sendtoaddress 单收款人、参数最薄;sendmany 多收款人;sendall 把选定 UTXO 一次扫空;send 用 outputs 字典天然覆盖多收款人,用 data 键覆盖 OP_RETURN,用 options 覆盖选币与找零的全部细节——它是这一族里唯一把”出资、签名、广播、返回半成品”四种模式都装进一个入口的。选择逻辑其实很朴素:需要控制选币或输出结构时用 send;只想无脑付款时用老命令少打字;要清灰归集用 sendall。还有一条历史注脚:曾经的全局手动费率 -paytxfeesettxfee 在 v30 被标记弃用、到 v31 彻底删除,官方口径是费率要么靠估算要么按笔指定,sendfee_rate 正是”按笔指定”的标准落点。

一条可跟做的最小命令

在 regtest 上试一次就有体感:send '{"地址A":0.001,"地址B":0.0005}' 6 economical 让钱包按 6 块目标自动选币付款;接着 send '{"地址C":0.0003,"data":"6a0d68656c6c6f2d6175673439"}' null unset null '{"subtract_fee_from_outputs":[0]}' 把一笔付款与一段 OP_RETURN 钉在同一笔交易里,并由地址C那条输出承担全部费用。两条命令的返回都先看 complete 与 txid/psbt 哪个字段在场,再决定去链上找 txid 还是继续走签名流程。命令实验只在 regtest 或极小金额上做,OP_RETURN 的字节会永久留在链上,写完就没有撤回这回事。

还值得记住一个边界:send 的实验性标注在帮助文本里始终没有摘掉,跨大版本升级时它的返回形状可能继续演变,脚本里应当用字段存在性而不是固定位置来解析结果。把它当成”把三条老命令接进同一个入口”的过渡形态来对待,兼容性策略就简单了:老命令能用就用老命令,需要选币控制或数据输出时才轮到 send 出场。

风险提示:本文是钱包命令的参数机制说明,不构成任何投资建议;涉及真实转账请先用极小金额验证参数组合再批量操作。