公钥、私钥、钱包地址,三者之间的关系
用户手里有一串私钥,通过圆锥曲线算法,可以生成一个公钥,这个计算过程是不可逆的,也就是说,拿到公钥的人,不可能逆向推倒出私钥,否则这个算法也太不安全了。
拿到公钥之后,再进行一次hash运算,得到一个新的值,也就是钱包地址
由此可以得出,我们的钱包地址就是私钥经过两次转换后的值。所以,私钥一定要保存好!!!
交易流程
钱包端(签名生成)
- 原始数据(nonce, to, value 等)经 RLP 编码后,计算哈希得到 hash_to_sign(记为 z)。
- nonce:随机值
- to:收款人的钱包地址
- value:金额
- 私钥 d 对 z 进行 ECDSA 签名,生成 r(点 R 的 x 坐标)、s(由 d, z, r 计算的标量)、v(R 的 y 坐标奇偶性)。
- 钱包将原始数据与 r, s, v 打包为完整交易,发送至节点。
[nonce, to, value, gasPrice, gasLimit, chainId, 0, 0, r, s, v]
原始数据中还包含一个参数:from
发送方的钱包地址
节点端(签名验证)
- 节点收到交易后,提取原始数据(排除 r, s, v),重新编码并计算 hash_to_sign(记为 z)。
- 利用 r, s, v 和 z,通过 ECDSA 算法恢复公钥 P(P = d·G,G 是椭圆曲线基点)。
- 将公钥 P 哈希后得到地址,与交易中发送方的地址对比(from参数):若一致,交易合法。
智能合约
智能合约是区块链上可执行的代码
智能合约
名称由来:智能合约是链上的程序,为什么叫智能合约呢?“合约”是取材自现实中的合约,是想强调链上的程序可以按协议规则执行,就像法律条款一样。“智能” 主要是强调不受干预的可自动执行。