原文: https://medium.com/@vanflymen/learn-blockchains-by-building-one-117428612f46
repo: https://github.com/dvf/blockchain
重点:
1. 区块链(blockchain)是由一连串块(block)组成的,块是有序的,且无法改变;块的内容可以包含交易信息、文件、图片、或者任何数据;
2. 块与块之间通过哈希值(hash)串联起来。
这个简易的python+flask实现版,有几个思想需要注意:
1. 一套服务(意思就是部署一个blockchain.py)称为一个节点(node);
2. 每个节点都在记录着自己的一套chain(里面都是block),节点之间通过一致性算法来互相同步,找到block最多(chain最长)的节点,把自己的
chain换成较长的(权威的)chain;
3. 块包含的内容示例:
index就是这个块的序号,transactions是块内的实际内容,这里里面记录的是交易记录(可以有多条);
previous_hash是上个块的哈希值,proof即证明,这个proof是用来挖矿用的(改操作称为工作量的证明),
大意是通过上个块的proof拼这个块的proof,拼出来的字符串进行sha256算哈希值,算出来的十六进制数看前面有几个0,
如果程序规定是4个0,且刚好算出来这个哈希值是4个0开头,那么就算对了,意思是找到了这个块的proof,挖到矿了,
此时会给挖到矿的节点奖励一个比特币,然后把当前记录的内容(transactions)打包进块。
block = { 'index': 1, 'timestamp': 1506057125.900785, 'transactions': [ { 'sender': "8527147fe1f5426f9dd545de4b27ee00", 'recipient': "a77f5cdfa2934df3954a5c7c7da5df1f", 'amount': 5, } ], 'proof': 324984774000, 'previous_hash': "2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824" }
4. 状态
节点运行后: 创建一个空白的块,块里面唯一有用的信息就是那个proof,要用来挖矿用的;
此时,可以进行交易,即增加transactions的操作,比如一个账户(节点)给另一个账户转账。这些操作都会暂存起来,直到节点挖到矿了。
挖到矿的节点会对暂存的内容进行打包(自身获得比特币奖励),比如把积攒起来的transactions写到一个块里面(暂存区会清空)。这个新的块的proof,就是刚才挖矿时算出来的那个proof
5. 如何保证去中心化、一致性
区块链的中心思想是去中心化,如果是一个去中心化的网络,如何才能让所有节点上的链(chain)都相同呢。其实就是通过注册节点,获取到网络上所有的节点,每次去查所有节点,找到链最长
的那个,把自己的链替换了。
其他:这个python实现太简单了,没有涉及交易(transactions)、验证等,需要找一篇更详细的实现研究一下。