李萬(wàn)勝聊區(qū)塊鏈2018-04-26 20:38:20
以太坊概述:
整個(gè)以太坊其實(shí)就是一個(gè)狀態(tài)機(jī)挖诸,每一筆的轉(zhuǎn)賬發(fā)生斧吐,意味著某一個(gè)賬號(hào)發(fā)生了變化召锈,也意味著整個(gè)以太坊的狀態(tài)放生了變化渐扮。
上圖中公式1表示一個(gè)交易T,在當(dāng)前時(shí)刻t的狀態(tài)σ的情況下,通過(guò)交易狀態(tài)變更函數(shù)Υ將狀態(tài)轉(zhuǎn)向了一個(gè)新的狀態(tài)柑贞,這里面需要注意的是這個(gè)狀態(tài)的變更只有在交易T被打包到區(qū)塊中,并被全網(wǎng)共識(shí)之后孔厉,才會(huì)改變整個(gè)以太坊的狀態(tài)拯钻。
公式2表示在某一時(shí)刻t,以太坊將一個(gè)區(qū)塊B撰豺,通過(guò)區(qū)塊狀態(tài)變更函數(shù)Π將以太坊的狀態(tài)轉(zhuǎn)向了一個(gè)新的狀態(tài)粪般。
公式3表示區(qū)塊內(nèi)數(shù)據(jù)實(shí)質(zhì)就是將多個(gè)交易T0,T1…打包的數(shù)據(jù)
公式4表示,一個(gè)以太坊的全局狀態(tài)變更郑趁,就是先根據(jù)當(dāng)前的區(qū)塊的多個(gè)交易改變以太坊的塊內(nèi)狀態(tài)刊驴,然后把狀態(tài)變更施加在本區(qū)塊之前的所有區(qū)塊上,然后形成當(dāng)前的最終狀態(tài)寡润。
因此以太坊區(qū)塊鏈?zhǔn)且粋€(gè)嚴(yán)謹(jǐn)?shù)目梢杂脭?shù)公式表達(dá)的狀態(tài)機(jī)。在狀態(tài)的遷移過(guò)程中舅柜,執(zhí)行了曠工獎(jiǎng)勵(lì)梭纹,token轉(zhuǎn)賬,智能合約指令等任務(wù)致份。
全局狀態(tài):整個(gè)以太坊的全局狀態(tài)可以通過(guò)公式5來(lái)描述变抽,公式5的意思是當(dāng)前的全局狀態(tài)是一個(gè)所有賬號(hào)與賬號(hào)狀態(tài)的對(duì)應(yīng)關(guān)系的集合,并且賬號(hào)狀態(tài)不能是空集合。公式6中就是對(duì)單個(gè)賬號(hào)與賬號(hào)狀態(tài)的對(duì)應(yīng)關(guān)系的描述绍载,其中對(duì)應(yīng)關(guān)系的key是賬號(hào)的KEC
hash值诡宗,20個(gè)字節(jié),對(duì)應(yīng)關(guān)系的value是一個(gè)集合的RLP序列化击儡。
賬號(hào)狀態(tài)是4個(gè)元素的集合:
nonce:是一個(gè)標(biāo)量塔沃,表示從這個(gè)賬號(hào)轉(zhuǎn)出的交易的個(gè)數(shù)或者智能合約創(chuàng)建個(gè)數(shù),表達(dá)式為公式7
balance:以Wei為單位的賬號(hào)的余額阳谍,表達(dá)式為公式8
storageRoot:存儲(chǔ)樹(shù)的根節(jié)點(diǎn)蛀柴。賬號(hào)內(nèi)的數(shù)據(jù)會(huì)以Merkle Patricia樹(shù)的形式存儲(chǔ)。表達(dá)式為公式10
codeHash:本賬號(hào)EVM 代碼的hash值矫夯,這個(gè)代碼創(chuàng)建之后就無(wú)法修改鸽疾,當(dāng)本賬號(hào)收到一個(gè)消息之后會(huì)執(zhí)行該代碼。代碼存儲(chǔ)在狀態(tài)機(jī)數(shù)據(jù)庫(kù)中训貌,codeHash就是這個(gè)代碼在數(shù)據(jù)庫(kù)中的索引制肮。
賬號(hào)狀態(tài)的代碼表示如下:我選用的是go語(yǔ)言版本的以太坊的源碼,有興趣的同學(xué)可以下載源碼研究一下递沪。
你會(huì)發(fā)現(xiàn)以太坊使用stateObject這個(gè)結(jié)構(gòu)體來(lái)表示賬號(hào)的狀態(tài)實(shí)體豺鼻,這個(gè)在黃皮書(shū)中并沒(méi)有明確的定義,由此說(shuō)明根據(jù)以太坊的技術(shù)黃皮書(shū)区拳,大家可以實(shí)現(xiàn)自己的以太坊公鏈拘领,曾經(jīng)有位大牛就是用C++實(shí)現(xiàn)了一個(gè)新版本的以太坊全節(jié)點(diǎn)代碼。以太坊的黃皮書(shū)只是一個(gè)架構(gòu)設(shè)計(jì)樱调,具體的實(shí)現(xiàn)語(yǔ)言只是技術(shù)選型而已约素。
我們今天只概括性的講一下以太坊的狀態(tài)遷移函數(shù)和狀態(tài)表達(dá)函數(shù),里面的很多子函數(shù)的講解笆凌,留在下一節(jié)詳細(xì)展開(kāi)圣猎,你會(huì)發(fā)現(xiàn)最后以太坊的狀態(tài)表達(dá)和狀態(tài)變遷可以細(xì)化到一個(gè)個(gè)數(shù)學(xué)公式。而大家可以使用不同的代碼乞而,根據(jù)數(shù)學(xué)公式來(lái)實(shí)現(xiàn)屬于自己的區(qū)塊鏈公鏈送悔。我們當(dāng)前正在設(shè)計(jì)開(kāi)發(fā)的公鏈,就是將以太坊的狀態(tài)機(jī)區(qū)塊鏈和IPFS這樣的存儲(chǔ)協(xié)議組合起來(lái)爪模,解決當(dāng)前公鏈無(wú)存儲(chǔ)能力的問(wèn)題欠啤,同時(shí)將公鏈應(yīng)用于細(xì)分的領(lǐng)域。
好了屋灌,下一節(jié)我們將講解公式中6中使用到的RLP封裝函數(shù)洁段,至于REC這個(gè)hash函數(shù),屬于一個(gè)比較基礎(chǔ)的知識(shí)共郭,不僅僅是以太坊獨(dú)有的函數(shù)祠丝,因此大家請(qǐng)自行檢索材料疾呻,應(yīng)該會(huì)有很多相關(guān)的資料。