在前次的帖子 http://8btc.com/thread-29595-1-1.html
里大概说过,比特币的买卖便是如下方法的汇款单,一半是付款信息,给出付款签名和公章,另一半是收款信息,给出金额,目标地址和实现方法
对各个管帐(全节点)来说,接收到这张汇款单时,有两个最重要的安全问题:
第一,如何确保这张汇款单不是假的?
第二,如何确保汇款单上的签名不是假的?
事实上,比特币里第一个问题是确保不了的,也即假如两张不同的汇款单的签名都符合要求,你不知道哪个是真的,这便是大名鼎鼎的据说导致了MTGOX倒闭的买卖延展性问题(transaction malleability)
不过,买卖一旦承认,也便是记录到账簿今后,付款账户便是空的了(比特币每次都是将一个地址中所有的币都花掉),所以从已承认买卖的视点来说,不可能呈现重复花一个地址的币的买卖,这两张汇款单中必然有一张最后要作废
为什么会呈现两张不同的汇款单都有效的状况?这是比特币现在规划上的一个缺点,是一个前史遗留问题,在我下一篇文章中进一步讨论到签名细节的时分,就能够明白为什么了。但现在先看第二个问题,也即签名的安全确保,只要先搞明白这个,才能够答复第一个问题
签名简略比方来说便是盖章
比特币中用了一种方法:刻一个章摔成两半,一半私用,一半公用,私用的一半自己藏着用于买卖的时分盖,而公用的那一半章(公钥)则在买卖时付款信息里盖在空白处并随汇款单发送。公章里暗含有我要花的币的地址(下面有述)。这样,收到汇款单的人只要看到我发布的那一半公章(公钥),就能够验证是否符合我要花的币的地址,并且能够用来和我盖的那一半私章对比,假如中间的裂缝在显微镜下也完美符合,就证明私章是我盖的无疑,但他们却拿不到我的那一半私章(私章盖在文字上今后有许多部分和文字重叠而无法辨认了,无法仿制出来),这样我不忧虑有人会拿着我发布的那一半公章来假冒我授权的买卖
当然,也可能会有解密高手(量子核算机)试图就我发布的公章而假造一个每个裂缝都与之完美符合的私章(也便是通常所说的破解ECDSA椭圆曲线加密)。但假如我不花币,也就不必发送买卖,那么他人光知道我的地址,却不知道公章是什么姿态的,也就无从破解(公钥能够推出地址,有地址却不能推出公钥)
为什么知道地址却算不出公章呢?因为地址是经过核算公章里所有字的总笔画数发生(哈希算法)。能够幻想:假定一个公章包括几百个字,光知道所有笔画的总数是彻底无法知道公章是什么姿态的,而有了公章却能够轻松验证这个总数是否符合。而这个总数便是比特币中的地址 (这仅仅个简化的比如,实际的哈希算法要杂乱的多,不是算总长度,但原理相似,都是对某串文字算出一个仅有的数)
之前说过,比特币转账每次都是彻底把原来账户中的币全部转走,因而只要我不重复使用同一个章,用完就丢掉,就不必忧虑他人拿到我的公章后能干啥:假如高手不能很快的在我发布买卖后根据里边的公章算出私章,一旦买卖完结,公章对应的便是一个空账户了
这便是为什么资深比特币玩家总是建议大家不要重复用同一地址,这是系统安全的第一流确保,有了这一点,即使量子核算机呈现,比特币的买卖也是安全的
了解盖章和数总笔画数这两个概念后,就能了解比特币如何确保签名的正确性了:首先,地址便是公章里包括的总笔画数,假如总笔画数和公章对不上,公章便是无效的,经过这个方法能够确保公章的有效性。其次,公章仅仅一个章的一半,假如公章和私章的合缝对不上,仍然是无效的
联络上面那幅图,再看买卖就好了解多了
买卖甲
付款信息:签名 + 公钥A
收款信息:0.9999 + 59 (地址B) + 实现条件
买卖乙
付款信息:签名 + 公钥B
收款信息:0.9998 + 地址C + 实现条件
整个过程是:乙自己刻一个章B,摔成两半,一半是私章(私钥)B,一半是公章(公钥)B,然后他数了数公章B里包括的总笔画数,得出个数字59,也便是地址B,然后他把这个数字告知甲,让甲给他发0.9999个币
于是甲发布了买卖甲,收款信息里依照乙给他的地址59填入,实现条件里写明按标准盖章方法验证。随后买卖甲被管帐审阅经过,比特币总账簿里就记录了这笔买卖,大家都能够查区块链看到,地址59 包括0.9999个币的余额
可见,要查地址B有多少币,是经过查买卖甲的收款信息而查到的。含有币的地址叫UTXO,也即unspent output(未花买卖)。在比特币中凡见到UTXO,就知道是指含有资金的地址信息,也是一串买卖的最终一站
随后,乙想要花这个币的时分(买卖乙),他就在买卖乙的付款信息里空白处盖上地址B的公章,并另外写一串数(这串数后面解释),并在这串数上盖上他的私章
买卖乙
付款信息:一串数上盖私章(签名) + 公章B (公钥B)
收款信息:0.9998 + 地址C + 实现条件
公章B里的总笔画长度是59,和地址B相同,可证明乙是地址B的公章拥有者,然后乙在那串数上盖的私章的裂缝和公章又彻底符合(管帐经过把他发布的公章盖回到那串数上,以验证两者之间的裂缝是否彻底符合),证明他的公章是他自己的,这样比特币中的付款安全验证就完整了
总结一下:由地址不能得到公章,而由公章也无法得到私章(现有技能下),因而用私章盖章,用公章验证私章的有效性,同时数公章中的总笔画数可验证和地址相符,这就彻底确保了用私章盖章者是该地址的所有者,也便是签名的有效性
上面说到,盖章的时分是盖在一串数上(图中的12345),这是串什么数?这是整个比特币买卖中最杂乱的部分,下次再说