简化后的公钥恢复流程如下:
Q? 是地址用来签名的私钥所对应的公钥。我们可以通过公钥计算出一个地址,并检查该地址是否与已提供地址相符。如果相符,则签名有效。 恢复标识符(“v”) v 是签名的最后一个字节,而且不是 27 (0x1b) 就是 28 (0x1c)。恢复标识符非常重要,因为我们使用的是椭圆曲线算法,仅凭r 和 s 可计算出曲线上的多个点,因此会恢复出两个不同的公钥(及其对应地址)。v 会告诉我们应该使用这些点中的哪一个。 在大多数实现中,v 在内部只是 0 或 1,而 27 是在签署比特币消息时加上的任意数。以太坊也接受了这一点。 从 EIP-155 开始,我们还使用链 ID 来计算 v 值。这可以防止跨链重放攻击:以太坊上签署的交易无法在以太坊经典上使用,反之亦然。目前,恢复标识符只用来签署交易而非消息。 签署交易 目前为止,我们主要讨论了针对消息的签名。就像消息一样,交易在发送前也需要签名。如果你使用 Ledger 和 Trezor 之类的硬件钱包,签名过程会在硬件内部发生。如果使用私钥(或 keysotre 文件、助记词),可以直接在 MyCrypto 上完成签名。签署交易所使用的方法与签署消息非常相似,只不过交易的编码方式略有不同。 要签署的交易先用 RLP 编码方式编码,包含了所有交易参数(nonce、gas price、gas limit、to、value、data)和签名(v, r, s)。签过名的交易如下所示: 0xf86c0a8502540be400825208944bbeeb066ed09b7aed07bf39eee0460dfa261520880de0b6b3a7640000801ca0f3ae52c1ef3300f44df0bcfd1341c232ed6134672b16e35699ae3f5fe2493379a023d23d2955a239dd6f61c4e8b2678d174356ff424eac53da53e17706c43ef871 如果我们在 MyCrypto 的已签名交易广播页面上输入该交易,我们就会看到所有交易参数: - MyCrypto 的已签名交易广播页面上的交易参数概览 - 签过名的交易的第一组字节包含 RLP 编码后的交易参数,最后一组字节包含签名 {r, s, v}。我们可以通过以下方式对签名交易进行编码:
|