以太坊漫談(一)
2018-8-12 19:04
來源:
兄弟連教育
以太坊狀態轉換函數
以太坊的狀態轉換函數:APPLY(S,TX) -> S',可以定義如下:
檢查交易的格式是否正確(即有正確數值)、簽名是否有效和隨機數是否與發送者賬戶的隨機數匹配。如否,返回錯誤。
計算交易費用:fee=STARTGAS * GASPRICE,并從簽名中確定發送者的地址。從發送者的賬戶中減去交易費用和增加發送者的隨機數。如果賬戶余額不足,返回錯誤。
設定初值GAS =STARTGAS,并根據交易中的字節數減去一定量的瓦斯值。
從發送者的賬戶轉移價值到接收者賬戶。如果接收賬戶還不存在,創建此賬戶。如果接收賬戶是一個合約,運行合約的代碼,直到代碼運行結束或者瓦斯用完。
如果因為發送者賬戶沒有足夠的錢或者代碼執行耗盡瓦斯導致價值轉移失敗,恢復原來的狀態,但是還需要支付交易費用,交易費用加至礦工賬戶。
否則,將所有剩余的瓦斯歸還給發送者,消耗掉的瓦斯作為交易費用發送給礦工。 例如,假設合約的代碼如下:
需要注意的是,在現實中合約代碼是用底層以太坊虛擬機(EVM)代碼寫成的。上面的合約是用我們的高級語言Serpent語言寫成的,它可以被編譯成EVM代碼。假設合約存儲器開始時是空的,一個值為10以太,瓦斯為2000,瓦斯價格為0.001以太并且64字節數據,第一個三十二字節的塊代表號碼2和第二個CHARLIE的交易發送后,狀態轉換函數的處理過程如下:
檢查交易是否有效、格式是否正確。
檢查交易發送者至少有2000*0.001=2個以太幣。如果有,從發送者賬戶中減去2個以太幣。
初始設定gas=2000,假設交易長為170字節,每字節的費用是5,減去850,所以還剩1150。
從發送者賬戶減去10個以太幣,為合約賬戶增加10個以太幣。
運行代碼。在這個合約中,運行代碼很簡單:它檢查合約存儲器索引為2處是否已使用,注意到它未被使用,然后將其值置為CHARLIE。假設這消耗了187單位的瓦斯,于是剩余的瓦斯為1150 - 187 = 963。
向發送者的賬戶增加963*0.001=0.963個以太幣,返回最終狀態。 如果沒有合約接收交易,那么所有的交易費用就等于GASPRICE乘以交易的字節長度,交易的數據就與交易費用無關了。另外,需要注意的是,合約發起的消息可以對它們產生的計算分配瓦斯限額,如果子計算的瓦斯用完了,它只恢復到消息發出時的狀態。因此,就像交易一樣,合約也可以通過對它產生的子計算設置嚴格的限制,保護它們的計算資源。

版權申明:本內容來自于互聯網,屬第三方匯集推薦平臺。本文的版權歸原作者所有,文章言論不代表鏈門戶的觀點,鏈門戶不承擔任何法律責任。如有侵權請聯系QQ:3341927519進行反饋。