第一章
跳過前期區塊鏈介紹等廢話
聲明:我知道hash值是16進制的,所有不應該有g以后的字母,但是我都是亂按鍵盤的,所以請哥哥姐姐們不要在意!
第五課:使用非對稱加密技術確定所有權
一、私鑰
核心:如何在不泄露所有權的情況下證明所有權:非對稱加密
const yourAdress = "2A39cbA2390fDe"
const yourPraviteKey = "GJKGTOUHKJHuiTyihotr"
Hash(Hash(fun("GJKGTOUHKJHuiTyihotr"))) -> "2A39cbA2390fDe" #私鑰可以推地址,而地址不能推私鑰
二:交易的處理流程
交易發起者簽名后廣播至相鄰節點→相鄰節點驗證是否有效→繼續廣播
1.對交易簽名簽名
hash('
{"fromAddress":"2A39cbA2390fDe",
"toAddress":"3aDF789cdjkLcRf",
"sum":"0.8btc"
}'
) -> "8aDb23CDEa6" #對一個交易進行hash運算產生交易摘要
sign("8aDb23CDEa6","GJKGTOUHKJHuiTyihotr") -> "sd7854hctgf9"
#用私鑰對交易摘要進行簽名,返回簽名信息,該操作通常在離線環境下完成
2.簽名后廣播
簽名后廣播(交易信息
+ 簽名信息
)至相鄰節點 ,相鄰節點驗證后保存到本地,然后繼續廣播
#驗證過程:
即:verify("sd7854hctgf9","3aDF789cdjkLcRf") -> "8aDb23CDEa6"
if(verify("sd7854hctgf9","3aDF789cdjkLcRf")
== hash('
{"fromAddress":"2A39cbA2390fDe",
"toAddress":"3aDF789cdjkLcRf",
"sum":"0.8btc"
}'
)):
#寫入賬本,繼續廣播
else:
# 啥都不做
三.補充
- 關于隱私:地址和自然人的對應關系不是公開的
- 關于安全:私鑰只有自己知道
第六課:使用區塊鏈結構高效驗證數據
一、問題
由于數據是分布式存儲的,如果單個節點篡改數據,如何驗證數據真實?
二、方法:驗證賬本的hash值
Hash 函數:Hash(原始信息) = 摘要信息
- 同樣的原始信息使用同一個哈希函數總能得到同樣的摘要信息
- 原始信息的微小變動會使摘要信息面目全非
- 無法從摘要信息逆推出原始信息
三、具體解決方案:
info_need_verify = Hash(Hash(blockFatherId,blockFatherInfo,time),blockId,blockInfo,timenow) = "7875Agc"
#即對上一個區塊的Hash值,當前區塊id,當前區塊的賬本信息,時間戳共4個參數進行hash運算得到hash值
#只需對info_need_verify進行校驗即可,效率賊高!
#由于每個區塊的info_need_verify都含有上一個區塊的信息,可以依次向前驗證
第七課:使用工作量證明進行挖礦
一、記賬的規則
- 一段時間內只有一個人可以記賬成功
- 通過解決密碼學難題(pow)競爭獲得唯一記賬權
- 其他節點復制記賬結果
- 記賬可以獲得比特幣獎勵,即對記賬的激勵
二、工作量證明
# 普通的記賬過程
Hash(Hash(blockFatherId,blockFatherInfo,time),blockId,blockInfo,timenow) = "7875Agc"
#加入工作量證明的記賬過程
#通過在Hash函數里面加入隨機數參數增加難度,要求生成前x位為0的Hash值。x越大,難度越高。
#簡單來說,該過程沒有任何技巧可言,如果希望盡快找到解,除堆積算力外沒有其他方法
const x = 24 #根據目前參與挖礦的算力的大小選擇合適的x設定挖礦難度
Hash(Hash(blockFatherId,blockFatherInfo,time,random()),blockId,blockInfo,timenow,random()) = "0" * x +"495CD6FH"
完成上述過程后:
- 收集廣播中還沒有被記錄到賬本的交易
- 驗證收集的交易的有消息
- 添加一筆"fromAddress" == Null & "toAddress" == yourself 的交易,作為挖礦的獎勵
三、工作量證明的計算量到底有多大
Hash值為16進制的字符串,則1個為0的概率為1/16,如果需要前x位同時為0,概率為(1/16)^x
第八課:共識機制
一、為什么節點要遵守協議?
- 節點的工作量只有在其他節點認可的時候才是有效的
二、如何解決分叉問題?
在產生一個新的區塊時,第二個節點挖到礦時還沒有覆蓋超過50%的節點
(信息的傳播是需要時間的,離得越近傳播的越快)
- 每個節點獨立選擇,在選擇是同時將另外一個區塊作為備胎
- 每個正常的節點都會選擇延長最長鏈,且只認可最長鏈(所以在短的鏈上面繼續挖礦單純浪費算力)
第九課:p2p網絡的節點如何連接
- 節點會記住連接信息,即連接過一次后,節點會保存這部分連接的信息
- 節點加入后會向相鄰的節點廣播,相鄰節點會繼續向他們的相鄰節點廣播
- 節點加入后會向鄰居節點索要其連接信息,即節點之前相互引薦
- 若節點加入時沒有任何已知節點可以相連,則會連接至種子節點(網絡內保存活躍的節點),然后重復上述3條
第十課:智能合約的革命性
一、背景:
比特幣的智能合約編程是圖靈不完備的,基于比特幣的區塊鏈開發需要下載比特幣的源碼,然后在其中修改加密算法、共識機制等,相對復雜且局限。
二、以太坊:
下一代智能合約和去中心化應用平臺,類似android、ios等
特點:
- 支持高級語音編程(智能合約)
- 每15s出一個區塊,更快的區塊確認時間,更多的每秒交易量
- tulingwanb無總量限制(比特幣的上限是2100萬)
三、智能合約
- 以太坊上的程序,是代碼和數據(狀態)的集合,是消息驅動的
- Code is Law,其執行像法律一樣,執行不受任何人的干擾
- (準)圖靈完備
第十一課:不一樣的區塊鏈-EOS
一、背景
以太坊的局限性:交易的確認時間和交易的吞吐量很小(TPS)
二、EOS:Enterprise Operation System
致力于打造可以承載商業級區塊鏈的平臺,但是共識機制是DPOS,不是真正意義的去中心化。
特點:
-
使用石墨烯技術提高TPS
石墨烯技術:跟石墨烯本人沒有關系,只是將共識機制改為了DPOS,交易確認速度更快,
TPS已經接近MySql的量級。
有完整的賬號系統,即有字符串形式的賬號作為地址,而不是一串"2A39cbA2390fDe"。
在鏈上的讀寫操作無需消耗代幣,但是需要抵押代幣來獲得資源,再用資源去進行操作。