摘要:主要講解以太坊中的一些基本元素,如區塊賬戶狀態交易費用等。所以它表示的是整個以太坊系統所有賬戶當前的狀態。賬戶以太坊中有兩種賬戶外部擁有賬戶,一般指自然人擁有的賬戶??偨Y以上就是以太坊里的一些基礎元素,沒有講到復雜的交易執行等,后續再寫。
本文不講區塊鏈,也就意味著你有一些區塊鏈的基本認知。
主要講解以太坊中的一些基本元素,如:區塊、賬戶、狀態、交易、費用等。因這些概念之間相互緊密聯系,雖描述的時候盡量分出層級,但提醒看官看得時候可以前后翻閱。
對以太坊的解剖按從整體到局部的思路進行:
1、以太坊以太坊可以用幾句話道出其本質:
以太坊是一個基于交易的狀態機。
全球就這一臺單機(但分布存在),【系統狀態】不停的改變。系統狀態是一個術語,即后面講到的world state。
這臺單機主要由區塊鏈組成,區塊鏈上保存著狀態和交易。
當我們與以太坊交互時,其實就是在執行交易、改變系統狀態。
用一個簡潔優美的公式表示就是:
σ′ =Υ(σ,T)
Υ是狀態轉換函數,T是交易,σ是狀態,σ′轉換后的狀態。
借用一張圖吧
從創世區塊開始,無盡的交易不斷的刷新著系統當前狀態,每產生一個區塊就對當前狀態做一次快照(patricia trie根)存入區塊頭中。
patricia trie是merkle tree的變體,請自行了解merkle tree。2、區塊結構
再看一個公式
B≡ (BH,BT,BU)
意思是區塊恒等于(區塊頭,交易列表,叔塊)
所以,區塊是由三大部分組成:
區塊頭,叔塊,交易列表。請看圖:
1)區塊頭由15個字段組成。
2)叔塊其實就是孤塊,因以太坊出塊速度很快平均十幾秒就會打包生成一個塊,所以礦工挖礦的競爭性很高,可能同時產出幾個都合法的區塊,以太坊為了一些安全性起見,允許競爭塊也掛在到主鏈上,同時給與挖出這些孤塊的礦工們少許獎勵增加工作的公平性。這些孤塊最多允許6個高度,這也是6個區塊確認主鏈說法的來源。
3)交易列表,存儲的是本區塊中所有的交易內容。
圖中的公式后面說。
看一下一個實際的區塊信息:
"blocks" : [ { "blockHeader" : { "bloom" : "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "coinbase" : "0x3535353535353535353535353535353535353535", "difficulty" : "0x020000", "extraData" : "", "gasLimit" : "0x05f5e100", "gasUsed" : "0x014fa1", "hash" : "0x39f4659b079e257df8fd7e699528531e97a6b8a442ca0d11200c4a2f7433c483", "mixHash" : "0x7379f33af4ae2db7e293f808a165135d0b1a99572cc96fb9f7d17ef64a751969", "nonce" : "0x8e08d7aabeee8773", "number" : "0x01", "parentHash" : "0xadbef3bf0b3b7b14f6e7b1a45d240ecc863543a279a86c23f60170e8e7a6bcc3", "receiptTrie" : "0xb21660268480338c0cd0613358315359b619bd527d5850949c4863cddaec316b", "stateRoot" : "0xde4ce9b5b2f88ab1680962c64281224b1743bdf94bd6a9e390ea779ff616c1f7", "timestamp" : "0x03e8", "transactionsTrie" : "0x56445ba866f3e41851154fb8700dcec8556a178f1833021e030b8a47b494769d", "uncleHash" : "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" }, "rlp" : "0xf90308f901f9a0adbef3bf0b3b7b14f6e7b1a45d240ecc863543a279a86c23f60170e8e7a6bcc3a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347943535353535353535353535353535353535353535a0de4ce9b5b2f88ab1680962c64281224b1743bdf94bd6a9e390ea779ff616c1f7a056445ba866f3e41851154fb8700dcec8556a178f1833021e030b8a47b494769da0b21660268480338c0cd0613358315359b619bd527d5850949c4863cddaec316bb901000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083020000018405f5e10083014fa18203e880a07379f33af4ae2db7e293f808a165135d0b1a99572cc96fb9f7d17ef64a751969888e08d7aabeee8773f90108f90105460183030d4094c305c901078781c232a2a521c2af7980f8385ee980b8a430c8d1da000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000230644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000001ba021a28cc82b40931239f8653ffa5300e1a506c0ef7fb79a663772cafe6558ab44a075af23441f7f176a2770af41142c77b671391209b15d59144e7a1332179b5e14c0", "transactions" : [ { "data" : "0x30c8d1da000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000230644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000", "gasLimit" : "0x030d40", "gasPrice" : "0x01", "nonce" : "0x46", "r" : "0x21a28cc82b40931239f8653ffa5300e1a506c0ef7fb79a663772cafe6558ab44", "s" : "0x75af23441f7f176a2770af41142c77b671391209b15d59144e7a1332179b5e14", "to" : "0xc305c901078781c232a2a521c2af7980f8385ee9", "v" : "0x1b", "value" : "0x00" } ], "uncleHeaders" : [ ] } ]3、區塊頭
區塊頭包含15個字段,介紹如下:
type Header struct { ParentHash common.Hash //Hp,上一區塊全部內容的hash,區塊因它而成鏈! UncleHash common.Hash //Ho,本區塊的ommers(所有叔塊)列表的hash Coinbase common.Address //Hc,成功挖出本區塊的礦工地址,用于接收礦工費 Root common.Hash //Hr,本區塊所有交易的狀態tree的根hash TxHash common.Hash //Ht,本區塊所有交易tree的根hash ReceiptHash common.Hash //He,本區塊所有交易的收據的tree的根hash Bloom Bloom //Hb,交易收據日志組成的Bloom過濾器 Difficulty *big.Int //Hd,本區塊難度級別 Number *big.Int //Hi,區塊序號,從創世塊0遞增 GasLimit uint64 //Hl,每個區塊當前的gas limit GasUsed uint64 //Hg,本區塊交易消耗的總gas Time *big.Int //Hs,本區塊創建時的Unix時間戳 Extra []byte //Hx,區塊附加數據,<=32字節 MixDigest common.Hash //Hm,256位的hash,與nonce組合證明出塊執行了足夠的計算 Nonce BlockNonce //Hn,64位的hash,與MixDigest組合證明出塊執行了足夠的計算 }
首先,ParentHash是上一個區塊全部內容的hash值,下一個區塊總是包含上一個區塊全部內容的hash值,這就使得區塊成鏈。
再次,有三個特別的字段保存的是patricia trie的根,Root(狀態hash)、TxHash(交易列表hash)、ReceiptHash(收據列表hash)。這個Root就是系統狀態hash。系統狀態就是以太坊整個網絡中所有賬戶的狀態,就是world state,它是一個merkle patricia trie結構。這個樹(包括所有patricia trie)并不存在于區塊,而存在于節點的levelDB中。只有它的根hash存在于區塊頭Root中,每一個區塊頭里的Root都是區塊被挖出確認時的快照,而world state指現在所有賬戶的狀態。
world state是跨塊存在的,另外兩棵樹只存儲本區塊的交易和收據。
4、world state再說一下world state:
world state是一顆全局狀態樹,在以太坊里只有一個,它被持續地更新。
這棵樹包含了以太坊網絡里每一個賬戶的key/value映射。
所以它表示的是整個以太坊系統所有賬戶當前的狀態。
其折疊函數是:
LS(σ) ≡ {p(a) : σ[a]≠ ?}
意味著非空p(a)的集合,p(a)就是patrcia 葉子節點的內容:
p(a) ≡ (KEC(a), RLP((σ[a]n, σ[a]b, σ[a]s, σ[a]c)))
這表示一個葉子節點是一個key/value映射,key是KEC(a)即160位的賬戶地址的哈希(Keccak-256算法),value是賬戶(nonce、balance、storageRoot、codeHash)的RLP格式序列化字節。
5、賬戶以太坊中有兩種賬戶
1、外部擁有賬戶(EOA),一般指自然人擁有的賬戶。
2、合約賬戶(CA),為智能合約分配的賬戶。
看一下賬戶的源碼定義:
type Account struct { Nonce uint64 // σ[a]n ,若為EOA是發送的交易序號,如為CA是合約創建的序號。 Balance *big.Int // σ[a]b ,這個地址的余額。 //merkle root of the storage trie Root common.Hash // σ[a]s ,賬戶自身內容RPL編碼組成的Merkle Trie的根哈希 CodeHash []byte // σ[a]c ,賬戶綁定的EVM Code,賬戶一經創建不可修改。 }
EOA特征
codeHash為空
storageRoot為空
通過私鑰控制
發起交易(轉移以太幣或觸發合約代碼)
CA特征
不能發起交易,可以被觸發執行合約代碼(通過EOA發起的交易或者從其他CA接收的消息調用激活)
怎么判斷一個賬戶是空賬戶?
EMPTY(σ,a)≡ σ[a]c =KEC(()) ∧ σ[a]n =0 ∧ σ[a]b =0
從公式看,一個賬戶的Root為空且nonce為0且余額為0,則說明這是一個空賬戶。
6、交易再回顧一個公式
σ′ =Υ(σ,T)
以太坊是一個基于交易的狀態機。
任意兩個賬戶之間的交易都會引起world state的改變。
兩個相鄰區塊之間的狀態差別很小,patricia trie這種數據結構能高效的處理整個系統賬戶變化的部分。
交易基本定義:【從外部擁有賬戶】發送的加密簽名序列化指令。換句話說交易必須是從EOA發起的才能叫交易,CA之間的通信叫消息也有叫內部交易的,現在是有區別,以后這個區別會不會模糊化不知道。
交易類型有兩種:
1、消息調用(Td)
2、合約創建(Ti)
從EOA到EOA的交易僅是轉賬。
EOA到CA可以激活各種操作。
看交易的源碼定義:
type txdata struct { AccountNonce uint64 //Tn Price *big.Int //Tp GasLimit uint64 //Tg Recipient *common.Address //Tt Amount *big.Int //Tv Payload []byte //Td || Ti V *big.Int R *big.Int S *big.Int // This is only used when marshaling to JSON. Hash *common.Hash }
Tn必須等于發起交易的賬戶的nonce(翻閱前面說法可知,賬戶nonce是該賬戶發起的第幾筆交易的序號,如果是創建合約則代表第幾次創建合約的序號)
Tp是這筆交易消耗的gas單價
Tg是你愿意為這筆交易最多可以支付的上限
Tt是接收賬戶的地址,如果為空說明接受賬戶是一個CA,否則是EOA
Tv是到接收者的額度
Td或Ti,如果交易類型是消息調用則Palload寫為Td,表示輸入數據,例如消息的參數,假設有一個注冊域名的合約服務,則Td就是該服務需要的參數如IP等。如果交易類型是創建合約,則Payload寫為Ti,表示一段代碼,這段代碼用于創建合約賬戶,這段初始化代碼只會被執行一次就丟棄掉,第二次執行的是創建完的合約代碼體。
交易的公式:
可以看到當接收賬戶不同時,區別僅僅是Td和Ti的區別。
另外,一個區塊里交易的順序由裝配這個區塊的礦工決定。
7、費用以太坊網絡里任何計算都要支付gas(燃料),
思考為什么不直接用eth做費用?
答案是用兩個概念gas和eth區別價值和價格,gas是一種固定衡量的價值,而eth是市場上快速變化的價格,很多EVM(以太坊虛擬機)的操作指令都需要消耗固定的費用就用gas來計價,gas的最小單位是wei,1eth = 1018wei = 109gwei。所以eth和gas之間是有匯率的。
GasPrice:燃料單價
GasLimit:愿意支付的燃料上限
GasLimit × GasPrice = 愿意支付的最大費用
10000 × 100gwei = 1015wei = 0.001eth
這圖要說明的是:
一筆交易中,你設置的最大費用如果沒有消耗完,多出的會返回給你。如果最大費用不夠計算的花費,那么交易會終止、已改變的狀態會回滾、但是錢被消耗不會退回了。這些已消耗的費用都獎勵給礦工了。
計算都是有費用的,初次之外還有一些東西需要繳費:
費用的三種不同構成:
1)計算操作的固定費用
2)交易(合約創建或消息調用)費用
3)存儲(內存、存儲賬戶合約數據)費用
著重說一下存儲費用:
存儲收費是因為假如你的合約使得狀態數據庫存儲增大,所有節點都會增加存儲。
以太幣是鼓勵盡量保持少量存儲的。
但是如果有操作是清除一個存儲條目,這個操作的費用不但會被免除,而且由于釋放空間還會獲得退款。
以上就是以太坊里的一些基礎元素,沒有講到復雜的交易執行、EVM等,后續再寫。
下面是一個區塊鏈小程序,供大家參考:
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/24001.html
摘要:是企業與區塊鏈相遇的地方。的框架旨在成為開發區塊鏈解決方案的支柱。以太坊,主要是針對工程師使用進行區塊鏈以太坊開發的詳解。 如果你想將區塊鏈合并到一個Java項目中,現在我們來看看就是這個細分領域中三個最大的OSS玩家。 好的伙計們,我們都聽說過比特幣,以太坊或其他加密貨幣,其中有一些時髦的名字圍繞著我們常見的新聞,但我們作為Java開發人員知道如何輕松地與這些區塊鏈技術進行交互嗎?以...
摘要:我們目前正處于一個新興的區塊鏈開發行業中。,一種在以太坊開發人員中流行的新的簡單編程語言,因為它是用于開發以太坊智能合約的語言。它是全球至少萬開發人員使用的世界上最流行的編程語言之一。以太坊,主要是針對工程師使用進行區塊鏈以太坊開發的詳解。 我們目前正處于一個新興的區塊鏈開發行業中。區塊鏈技術處于初期階段,然而這種顛覆性技術已經成功地風靡全球,并且最近經歷了一場與眾不同的繁榮。由于許多...
摘要:以太坊將成為新互聯網的支柱,我為什么這么說正在以太坊上構建我們的第層,而不是其他區塊鏈平臺這就是原因。以太坊不會犧牲去中心化的原則而下沉權力在區塊鏈方面,有一項稱為可擴展性三難的基本法則。 以太坊將成為新互聯網的支柱,我為什么這么說?Loom Network正在以太坊上構建我們的第2層,而不是其他區塊鏈平臺——這就是原因。 每個月都有其他的公司發布白皮書,聲稱已經解決了以太坊所面臨的可...
摘要:你首先編寫基本智能合約并告知你的新智能合約將從基礎合約繼承。這些函數和狀態變量只能在內部訪問即從當前合約或從中派生的合約中,而其他情況不使用它。私有函數和狀態變量僅對定義它們的智能合約可見,而不是在派生合約中可見。這里是原文語言開發中的繼承 我們已經探索了很多主題,在編寫智能合約時我們發現經常使用相同的模式:例如,智能合約具有在構造函數中設置的所有者,然后生成修改器以便僅讓所有者使用一...
摘要:比特幣區塊鏈無疑是當今業界的最熱門的。目前,每個成功的礦工獲得可能每年更換一次或通過比特幣社區決策作為成功向區塊鏈添加一塊交易的獎勵。填寫其他詳細信息,例如比特幣金額和可選說明。 比特幣區塊鏈無疑是當今業界的最熱門的。通過這篇博客,我將盡力向大家介紹加密貨幣比特幣的概念,以及它如何創造我們稱之為區塊鏈的革命性技術。 這個問題經常引起混淆。這篇文章可以快速解釋和清理這方面的混亂! 什么是...
閱讀 2254·2021-09-26 09:55
閱讀 3584·2021-09-23 11:22
閱讀 2151·2019-08-30 15:54
閱讀 1894·2019-08-28 18:03
閱讀 2593·2019-08-26 12:22
閱讀 3426·2019-08-26 12:20
閱讀 1723·2019-08-26 11:56
閱讀 2245·2019-08-23 15:30