在前面第2课,我们粗略引入了比特币网络中账号的概念。在此课,我将对账号相关的几个概念,做更深入的阐释,这部分也是整个区块链技术的基础。
有兴趣朋友也可以进一步关注公众号“架构之道与术”, 获取原文。
或扫描如下二维码:
一、公/私钥
公/私钥的基本思路是:每个用户生成1对公/私钥,相当于账号与密码。
A给B转账,先用A的私钥签名,再把钱打入B的公钥,只有B能用自己的私钥解密。
这里有2个关键点:(1)这笔交易是公开的,其他人都可以看到,但只有B有私钥,可以解锁这笔钱。(2)A的公钥也是公开的,虽然B不知道A的私钥,但B可以用A的公钥来验证,这笔交易的签名用的是A的公钥对应的私钥,证明了这笔钱是A转给B的,而不是C转给B的。
反之亦然,B给A转账,先用B的私钥签名,再把钱打入A的公钥。A收到这笔交易,同样的可以验证上面的2点。
二、比特币地址(钱包地址)
在上面呢,通俗的介绍了公/私钥的大致思路。但在比特币网络里,实际是有4个概念:
私钥(Private Key)
公钥(Public Key)
公钥Hash (Public Key Hash)
钱包地址(Bitcoin Address)
下面这张图展示了这4个概念之间的关系,以及生成机制:
Private Key:随机生成的1长串数字
Public Key: 通过椭圆曲线函数,由私钥生成公钥。
Public Key Hash: 由Public Key,经过Hash160的计算得到。所谓Hash160,是指先进行1次SHA256运算,再进行1次RIPEMD160运算,最后算出来的Public Key Hash是160 bits。
Bitcoin Address: 把Public Key Hash,经过Base58Check编码,得到Bitcoin Address,也就是交易转账最终用的地址。
这里面有几个关键点:
(1)由箭头可以看出,前2个转换是单向的,不可逆。公钥是公开的,但没办法通过公钥反算出私钥;也没办法通过Public Key Hash 反算出Public Key。
(2)最后1个是可逆的,一个Encode/Decode的过程。
所以你可以认为,Public Key Hash 和 Bitcoin Address本质是一个东西,只是编码方式不一样。
(3)那为什么不直接拿Public Key当Bitcoin Address,而要再加1层 Public Key Hash呢?
这就涉及到1个抽象的问题。在比特币网络中,Bitcoin Address是一个抽象的概念,在这个场景中,背后代表的是Public Key;在其他场景中,可能是一个Script Hash,而不是Public Key Hash。
关于用Script Hash做比特币地址,是个很关键的话题,后面会专门讲述。
三、签名
签名公式如下:
Sig = Fsig(Fhash(transaction), private key)
也就是,先对Transaction进行1次Hash运算,把这个Hash值 + private key,经过一个签名函数的计算,得到签名值。
关键点:签名是用私钥来签的,以此来证明转账的钱,是来自“我”。
四、基本交易类型 P2PKH
有了比特币地址,其实也就是Public Key Hash,就有了一个最常见的交易类型,叫做P2PKH(Pay to Public Key Hash),付款给对方的Public Key Hash。
另外一个交易类型,就是P2SH(Pay to Scirpt Hash),后面会专门讲述。
五、总结
任何时候,A给B转账的一笔交易,都会先用A的私钥签名,再发给B的公钥(这里是Public Key Hash,而不是直接是Public Key)。
以此,达到2个目的:(1)证明了这笔钱的确是来自A (2)这笔钱,只有B能解锁,能使用。
A的私钥签名,叫做scriptSig;发给B的公钥,叫做scriptPubKey。
这2个东西非常关键,后面会详细讲解他们的运作机制。