ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Zcash 1.1.1-rc1 实践指南:zcash-cli 参数隐私保护与 scriptSig SIGHASH 类型解码

Zcash 1.1.1-rc1 实践指南:zcash-cli 参数隐私保护与 scriptSig SIGHASH 类型解码 Zcash 1.1.1-rc1 实践指南zcash-cli 参数隐私保护与 scriptSig SIGHASH 类型解码【免费下载链接】zcashZcash - Internet Money项目地址: https://gitcode.com/GitHub_Trending/zc/zcash本文基于 Zcash 发行说明 release-notes-1.1.1-rc1.md 整理而成聚焦该候选版本中两个对开发者与运维人员最直接可感知的变更zcash-cli -stdin标准输入参数模式以及交易输出中scriptSig.asm的 SIGHASH 类型解码。读完本文你将掌握如何安全地通过zcash-cli传递私钥、助记词等敏感信息理解签名哈希类型在反序列化输出中的呈现方式并能结合本仓库源码定位这两项能力的底层实现与测试依据。版本背景Sapling 升级前夜的 1.1.1-rc11.1.1-rc1 是 Zcash 1.1.x 系列的第一个候选发布版本Release Candidate处于 Overwinter 激活之后、Sapling 网络升级落地之前的关键开发窗口。从该文档收录的 Changelog 看本版本承载了大量 Sapling 相关的基础设施工作包括Sapling v4 交易解析器与SpendDescription/OutputDescription数据结构由 Jack Grigg 主导共 50 项提交Sapling 签名哈希算法 ZIP 243 的实现Sapling 默克尔树、锚点anchor共识规则与valueBalance净额校验Groth16 证明的验证与生成集成Sean Bowe 共 49 项提交涉及 librustzcash 升级与测试向量更新。在这些面向共识层的重大工作之外该版本还包含两项面向普通用户与 RPC 调用方的实用性改进即下文两个小节的主题。zcash-cli-stdin从标准输入读取 RPC 参数为什么要从标准输入读参数在命令行上直接书写walletpassphrase、私钥等敏感数据存在一个普遍的安全隐患命令行参数通常可以通过系统进程表process table被系统上任何用户读取。也就是说即便在单机环境下其他本地用户也可能通过ps等工具窥探到你刚才敲入的密码或密钥。为此1.1.1-rc1 为 RPC 命令行客户端zcash-cli增加了-stdin开关启用后客户端会从标准输入逐行读取额外的命令参数每行一个直到 EOF文件结束或 Ctrl-D 为止。使用方法与示例文档给出的典型用法是调用walletpassphrase$ src/zcash-cli -stdin walletpassphrase mysecretcode 120 ^D (Ctrl-D)执行过程解读-stdin之后的第一个非开关参数walletpassphrase是 RPC 方法名随后的每一行标准输入都会被追加为该方法的参数在上例中mysecretcode成为钱包口令、120成为解锁时长秒相当于执行walletpassphrase mysecretcode 120输入结束后按^DUnix 下为 Ctrl-DWindows 下为 Ctrl-Z表示 EOF客户端随即组装请求并发送给节点。文档特别建议对于私钥等敏感信息应始终使用该模式传递。源码级实现细节在 src/bitcoin-cli.cpp 中可以找到完整实现。帮助文本定义于第 45 行-strdin Read extra arguments from standard input, one per line until EOF/Ctrl-D (recommended for sensitive information such as passphrases). If first extra argument is walletpassphrase then the first line(password) will not be echoed.核心逻辑位于CommandLineRPC函数第 341 行起。当GetBoolArg(-stdin, false)为真时第 352 行客户端进入标准输入读取分支std::vectorstd::string args std::vectorstd::string(argv[1], argv[argc]); if (GetBoolArg(-stdin, false)) { bool hide false; if (args.size() 0 args[0] walletpassphrase) { if (!SetStdinEcho(false)) throw std::runtime_error(unable to set terminal to non-echoing); hide true; } // Read one arg per line from stdin and append std::string line; while (std::getline(std::cin,line)) { args.push_back(line); if (hide) { if (!SetStdinEcho(true)) throw std::runtime_error(unable to set terminal back to echoing); hide false; } } }两点值得注意隐藏回显的自动处理若首个额外参数恰好是walletpassphrase客户端会调用SetStdinEcho(false)关闭终端回显第 306–339 行给出了 Win32 与 POSIX 两套实现分别基于SetConsoleMode与termios并在读取到第一行后立即恢复回显。这意味着输入口令时屏幕上不会显示明文进一步降低被旁观者或屏幕记录工具窃取的风险。非终端场景容错如果标准输入不是终端例如从管道重定向SetStdinEcho会通过errno ENOTTY判断并静默放行——管道本身不会回显因此这不是错误。读取完成后参数经ConvertValues转换为 JSON 数组第 374–375 行再通过CallRPC发送给zcashd。与其它安全实践的配合若节点尚未完成启动预热可组合-rpcwait选项第 378 行让客户端在收到RPC_IN_WARMUP错误时自动重试便于脚本化使用。在自动化脚本中同样可以使用该模式printf passphrase\n120\n | zcash-cli -stdin walletpassphrase从而避免敏感信息出现在脚本进程的命令行参数中。scriptSig 的 asm 表示SIGHASH 类型解码变更内容在此之前交易输入scriptSig的汇编asm表示中DER 编码的 ECDSA 签名末尾的签名哈希类型字节只是一个无意义的十六进制后缀。1.1.1-rc1 起asm属性会对每个具有合法已定义哈希类型的签名追加解码后的类型标注。例如一个输入此前呈现为304502207fa7a6d1e0ee81132a269ad84e68d695483745cde8b541e3bf630749894e342a022100c1f7ab20e13e22fb95281a870f3dcf38d782e53023ee313d741ad0cfbc0c509001现在呈现为304502207fa7a6d1e0ee81132a269ad84e68d695483745cde8b541e3bf630749894e342a022100c1f7ab20e13e22fb95281a870f3dcf38d782e53023ee313d741ad0cfbc0c5090[ALL]即末尾的01即SIGHASH_ALL被解码并替换为[ALL]标注其余 DER 签名字节保持不变。受影响的接口文档明确指出以下输出包含 scriptSig 签名的汇编表示因而受本变更影响接口说明RPCgetrawtransaction返回原始交易详情RPCdecoderawtransaction解码原始交易REST/rest/tx/JSON 格式按交易哈希查询REST/rest/block/JSON 格式且包含扩展交易详情时区块内交易详情zcash-tx -json命令行交易工具而RPCdecodescript的输出不变——因为它在设计上专门处理scriptPubKey不会处理scriptSig脚本因此不参与本次解码。底层实现ScriptToAsmStr 与 mapSigHashTypes该功能的实现在 src/core_write.cpp 中。首先定义了哈希类型到名称的映射表第 56–64 行const std::mapunsigned char, std::string mapSigHashTypes boost::assign::map_list_of (static_castunsigned char(SIGHASH_ALL), std::string(ALL)) (static_castunsigned char(SIGHASH_ALL|SIGHASH_ANYONECANPAY), std::string(ALL|ANYONECANPAY)) (static_castunsigned char(SIGHASH_NONE), std::string(NONE)) (static_castunsigned char(SIGHASH_NONE|SIGHASH_ANYONECANPAY), std::string(NONE|ANYONECANPAY)) (static_castunsigned char(SIGHASH_SINGLE), std::string(SINGLE)) (static_castunsigned char(SIGHASH_SINGLE|SIGHASH_ANYONECANPAY), std::string(SINGLE|ANYONECANPAY)) ;可见能够被解码的哈希类型包括SIGHASH_ALL、SIGHASH_NONE、SIGHASH_SINGLE以及它们与SIGHASH_ANYONECANPAY的组合——正好覆盖脚本系统中全部 6 种合法类型。解码入口是ScriptToAsmStr(const CScript script, const bool fAttemptSighashDecode)第 73 行起。该函数按操作码遍历脚本对于长度超过 4 字节的 push 数据且fAttemptSighashDecode为真、脚本并非不可花费IsUnspendable()避免误解析 OP_RETURN 数据时会尝试解码先用CheckSignatureEncoding(vch, SCRIPT_VERIFY_STRICTENC, NULL)校验数据在严格编码规则下是否形如合法签名——这一前置检查也能避免把格式合法的公钥误判为签名pubkey 格式与签名格式在IsCompressedOrUncompressedPubKey的约束下互斥注释中对此有说明通过后取签名最后一个字节vch.back()作为哈希类型若该字节在mapSigHashTypes中命中则在 asm 中追加[...]标注。调用方只需对 scriptSig 开启该标志位对 scriptPubKey 关闭这与decodescript不受影响的说明一致——fAttemptSighashDecode默认参数为false即默认不做解码。测试与测试向量仓库中的测试对该行为有直接断言。在 src/test/script_tests.cpp 第 962 行BOOST_CHECK_EQUAL(derSig [ALL] pubKey, ScriptToAsmStr(CScript() ToByteVector(ParseHex(derSig 01)) vchPubKey, true));即构造一个以01SIGHASH_ALL结尾的 DER 签名 push 数据加上公钥的脚本断言开启fAttemptSighashDecode后输出为derSig [ALL] pubKey。此外src/test/data/tt-delin1-out.json、src/test/data/tt-delout1-out.json、src/test/data/tt-locktime317000-out.json 等比特币交易工具zcash-tx的黄金向量中所有scriptSig.asm均已呈现为...090[ALL] 03...形式——签名解码标注与公钥 push 用空格分隔与 RPC 输出格式完全一致。对使用者的影响调试与审计更直观通过getrawtransaction/decoderawtransaction检查交易时scriptSig.asm中的[ALL]、[SINGLE]、[NONE]等标注可让你快速确认每笔输入签名的覆盖范围以及是否带ANYONECANPAY无需自行解码末尾字节。注意兼容性该变更会改变 asm 字符串内容若你的工具链或监控脚本对scriptSig.asm做了字符串精确匹配需要相应更新基于十六进制原始数据hex字段的解析则不受影响。Changelog 快速导读1.1.1-rc1 还改了什么除上述两项用户可见变更外该版本的 Changelog合计约 170 项提交还可提炼出几条与本仓库源码呼应的脉络Rust 工具链升级依赖系统将 Rust 升级至 1.26 stable并支持未打包的 Rust crate为后续 librustzcash 与 Sapling 电路代码的持续演进铺路Sapling 数据结构落地SpendDescription/OutputDescription、Sapling 空值集合nullifier set、JSOutPoint的js字段改为uint64_t等直接对应 src/primitives 与 src/consensus 下的交易与共识实现交易大小限制调整Sapling 激活后交易大小上限从 100kB 提升MAX_TX_SIZE更名为MAX_TX_SIZE_AFTER_SAPLING并配套了最大合法 Sapling 交易基准测试序列化层重构大量提交来自 Pieter Wuille 的prevector/CSizeComputer系列重构去除了nType/nVersion等过时成员相关实现在 src/prevector.h 与 src/streams.hRPC 细节改进createrawtransaction支持按输入设置nSequence、可选的locktime参数、getblock增加 verbosity 级别、uacomment配置项BIP-0014 用户代理注释等。对于需要逐条核对的读者可直接阅读 release-notes-1.1.1-rc1.md 的完整 Changelog 列表与该版本相邻的 1.1.0 发行说明 则记录了 Overwinter 主网激活高度 347500 与-mempooltxinputlimit弃用等前置背景。总结1.1.1-rc1 的两项 Notable changes 均为小而实用的改进zcash-cli -stdin让敏感参数绕过进程表可读的命令行并在walletpassphrase场景下自动隐藏回显是对节点运维安全实践的重要补充scriptSig.asm的 SIGHASH 类型解码则让交易反序列化输出对审计者更加友好。二者在 src/bitcoin-cli.cpp 与 src/core_write.cpp 中均有完整实现并有 src/test/script_tests.cpp 与 src/test/data 下的黄金向量提供测试保障适合作为理解 Zcash RPC 层与脚本序列化机制的入门切入点。【免费下载链接】zcashZcash - Internet Money项目地址: https://gitcode.com/GitHub_Trending/zc/zcash创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表