原文: 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)、驗證等,需要找一篇更詳細的實現研究一下。