
验证签名检查什么
验证签名的核心,是判断某个签名是否与指定公钥及被签署的数据相匹配。私钥用于产生签名,公钥用于验证;验证者不需要取得私钥。签名为交易授权提供密码学依据,但不能单独证明签署者的现实身份,也不能证明其理解了交易内容。
入门还需要区分哈希与签名。哈希把数据转换为摘要;签名则把密钥控制能力与特定数据关联起来。交易哈希可以用于识别交易,仅有交易哈希并不能证明交易获得了授权。
比特币:理解输出的解锁条件
Bitcoin Developer Guides 的交易说明以传统 P2PKH 为例:输入引用先前的交易输出,并提供签名与公钥。验证时,脚本先检查公钥哈希是否符合该输出的条件,再检查签名是否匹配应签署的交易数据。
这里有两个独立问题:提供的公钥是否符合授权条件,以及签名是否对相应数据有效。只通过其中一项不足以完成解锁。这一例子适用于理解 P2PKH,不能把它的字段位置和脚本结构套用于所有比特币交易类型。
以太坊:理解账户授权与交易字段
ethereum.org 的交易说明将交易描述为经过密码学签名的指令。对于普通外部账户交易,签名用于验证发送方授权;交易还包含 nonce、接收方、金额、输入数据和费用相关字段。不同交易类型具有不同的编码规则。
理解这类验签时,需要把交易字段、编码格式和签名联系起来。面向人的展示信息与实际编码数据属于不同层次,验证过程必须以协议规定的数据为准。合约调用还需要解释输入数据,才能理解签名所授权的操作。
适用条件:明确签名覆盖的数据
验签双方必须遵循相同的数据构造、摘要和签名规则。字段含义相同,并不意味着不同编码得到的字节相同。入门时应先确定链、交易类型和签名规则,再讨论如何验证。
签名保护的是规则规定的覆盖范围。被覆盖的数据发生变化,会使原签名无法通过相应验证;不能据此笼统断言,任何签名都保护交易中的所有字段。
常见问题:验签通过是否代表交易成功
验签通过只是交易验证的一部分。比特币还需要检查被引用输出等条件;以太坊还涉及账户 nonce、余额及执行所需资源。授权检查通过,不等于交易已经进入区块,也不等于合约执行一定成功。
排查验签失败时,应分别核对公钥或发送方、签名格式、交易类型以及待签署数据。把授权验证、交易有效性检查和执行结果分开理解,才能准确判断问题发生在哪一层。