与原论文顺序有些出入,但基本原理已讲述清楚,欢迎指正
1. 概念:
transaction:转账、交易记录、账单记录
block:上面这个概念的数据组成的块
proof of work:工作量证明、可理解为防攻击机制
double spending:再次消费(一种针对去中心化货币的攻击手段,在BTC之前很多电子货币都是因为防御不了这一点而终告失败)
2. 转账【转账日志的记录方式】:
首先,本笔交易发生时,钱包的所有者(owner)会用公钥生成全网可见的HASH,并且自己的私钥生成一个签名(signature)【不理解和同学可以了解一下“非对称加密”的概念,简单说就是私钥用于生成签名,公钥用于验证签名是否有效】。
然后记录到数据块(block)中。
然后如果再发生一笔交易,或者收到P2P网络别的节点广播来的交易数据,当前节点会用转账发起账户的公钥验证数据中转账发起账户的签名,如果有效,就把数据记录进block的上笔交易记录的位置的后面。
理解的重点:
(1). 记录的每笔交易付款方生成的签名、付款方的公钥、转账金额、交易HASH(相当于ID)等数据。
(2). 并未记录转账前和转账后每个账户有多少余额。
3. block 交易数据块
block储存着若干条交易记录(transaction,图上的item项目指的就是每一条交易记录),每个block有自己的block hash(相当于block的ID)。
关于block的产生,我们留在下一节:proof of work工作量证明中去讲述。
4.proof of work(工作量证明、挖矿、比特币的发行)
block是储存交易记录的数据块,网络上的矿工的扩矿的工作就是为了全网新的block的产生而计算所必需的一个参数nonce。
在上面我们有提到,每一个block块都有一个hash,而挖矿的时候,矿工们需要计算一个nonce,来满足prev hash(前一块block的hash)。
因为算法的不可逆性,计算这个nonce经过算法运算后值等于HASH的难度是全网动态调节的以让一块新的block产生的时间无穷接近于10分钟,具体做法是调整hash前面0的位数,
举例:
假如上一块block的哈希是000000000000000030934429665e0ae5348ea22a95cadeccf310a515a1f6ec8e,在5分钟后被人解了nonce,原因可能是啥?极可能是1.网络某矿工或者某矿池的算力加大了;还有小部分可能是2.运气太好了;
而在5分钟就算出了nonce产生了新的block,这时所有节点在写这个新生成的block的时候都达成了算法共识,要在新生成的block的hash前面的0多留一位。
这样,在后面矿工计算的时候,难度就加大了(固定长度时,0的位数据越多的hash越难解)。
因此,比特币保证了接近每10分钟产生一块新的块。
那么挖矿的时候,成功解出nonce的矿工怎么得到奖励的呢?
在尝试猜nonce,并且成功后,这个矿工第一个生成新的block的,然后才把数据广播给邻近节点的;在生成新的block的时候,第一笔交易被记录了进去,这里面包含了造物主转账N个比特币给了这位矿工;
N在最初设定为50,并且在每产生166554个block后N减半,每4年减半的说法来源于此。
由此,比特币的逻辑总量最终控制在了2100万枚左右,如果计算上钱包丢失,总量应该小于2100万枚。
*.(1).创世块、第一块block是中本聪挖到的,所以,中本聪至少拥有50枚比特币。
5.double spending(【解决】双重消费的问题)
在没有中央发行机构的P2P货币市场中,如果保证钱包用户不双重消费一直是让密码学家们头疼的问题,在比特币诞生之前很多密码学家的尝试最终均死于无法防止double spending攻击。
比特币的算法协议设定很巧妙地解决了这个问题,全局账单(所有节点都有一份)上只记录交易转账日志,不记录具体每个地址账户余额是多少。
当Jim给Bob转5 btc时,所有节点确认数据承认之前,是这样运算的:
[1] 收到签名来自Jim的转账广播请求;
[2] 使用Jim的公钥验证Jim的签名;如果不通过就无视掉.
[3] 从全局账单中读取所有关于Jim的账户的所有资金流动记录,比如在前两天,Jim挖矿得到了25 btc,在昨天上午,X-Sir给Jim转了4 btc,在昨天下午,Jim给King转了20btc (需要扣交易税,所以支付总额超过20Btc),然后算一下汇总,Jim的账户余额剩下的足够扣除需要支付给Bob的5 Btc,然后Jim此笔交易就获得这台验证主机节点的确认了,这台主机在验证通过后把数据加进block,然后广播到更远的地方去;
假如在两天过后,Jim再次尝试给别人转1 Btc时,别的主机在确认时发现Jim的余额不够支付,于是这笔交易不受到P2P网络承认,然后这笔交易就是无效的,写不进全局Block。
所以,Btc的全局账单非常巧妙地解决掉了double spending问题。
有个彩蛋,Btc发生过双花,未受到确认但写进了Block。
有兴趣研究的同学可以自行Google "Success to double spending in bitcoin".。