什么是賬戶
以太坊賬戶與我們所知的賬戶概念有一定相似之處,卻又有很大的區別,更不同于比特幣中UTXO。
賬戶分兩類:
- 外部擁有賬戶(EOA),也就是普通賬戶
- 合約賬戶
普通賬戶
所謂的普通賬戶就是我們存放以太幣的賬戶,可以隨意生成,它具有以下特性:
?- 擁有以太幣余額(以太幣存放的地方,與比特幣的UTXO模式不同)的balance。
?- 用于確定每筆交易只能被處理一次的計數器(nonce)。
?- 發送交易(以太幣轉賬、發布合約、調用智能合約)
- 通過私鑰控制
- 沒有相關聯的代碼
合約賬戶
合約賬戶也是最激動人心的概念和底層代碼實現,它是功能和數據的集合,存在于以太坊的特定地址(發布智能合約的地址上),擁有以下特性:
- 擁有以太幣余額
- 有相關聯的代碼
- 通過交易或消息調用的方式觸發并由以太坊虛擬機(EVM)解釋執行
- 當被執行時:
- 運行在隨機復雜度(圖靈完備性)
- 只能操作其擁有的特定儲存,例如可以擁有其永久state
- 可以call其他合約
所有以太坊區塊鏈上的操作都是由各賬戶發起的交易來出發。智能合約賬戶收到一筆交易,交易所帶的參數都會成為代碼的入參。合約代碼會被以太坊虛擬機(EVM)在每一個參與網絡的節點上運行,以作為它們新區塊的驗證。
交易和消息
交易
“交易”術語通俗來講就是一個賬戶向另外一個賬戶發送一筆被簽名的消息數據包的過程,區塊鏈會記錄并存儲相應的數據。延伸一下,調用智能合約改變一個合約賬戶的數據狀態,也是一筆交易,同樣需要花費手續費。
交易包括:?
- 消息的發送者
- 消息的接收者
- 簽名信息,用來證明發送者有意向通過區塊鏈向接收者發送消息
- 價值域,從發送方轉移到接受方的以太幣的數量
- 可選的數據域,用來儲存智能合約或調用智能合約的代碼
- gasLimit,該交易的執行時使用gas的上限
- gasPrice,交易發送者愿意支付的gas費用的價格。一個單位的gas表示了執行一個基本指令,例如一個計算步驟。
消息
合約具有發送”消息”到其他合約的能力。
消息是一個永不串行且只在以太坊執行環境中存在的虛擬對象。它們可以被理解為函數調用(function calls)。曾有人咨詢,智能合約是否可以調用比特幣轉賬,這里的解釋已經給出了明確的答復。
消息包括:
?- 消息發送者
- 消息的接收者
- 可選的數據域,合約實際上的輸入數據 - gasLimit,同交易。
總體來說,一個消息就是一筆交易,除了它不是由外部賬戶生成,而是合約賬戶生成。當合約正在執行的代碼中運行了call 或者delegatecall這兩個命令時,就會生成一個消息。消息有的時候也被稱為”內部交易”。與一個交易類似,一個消息會引導接收的賬戶運行它的代碼。因此,合約賬戶可以與其他合約賬戶發生關系。
什么是gas
以太坊的運行環境,也被稱為以太坊虛擬機(EVM)。每個參與到網絡的節點都會運行EVM作為區塊驗證協議的一部分。每個網絡中的全節點都會進行相同的計算并儲存相同的值。合約執行會在所有節點中被多次重復,而且任何人都可以發布執行合約,這使得合約執行的消耗非常昂貴,所以為防止以太坊網絡發生蓄意攻擊或濫用的現象,以太坊協議規定交易或合約調用的每個運算步驟都需要收費。。這筆費用以gas作為單位計數,也就是俗稱的燃料。
gas和交易消耗的gas
每筆交易都包含gas limit和gas price。礦工可以有選擇的打包這些交易并收取這些費用。gasprice 會影響到該筆交易被打包所需等待的時間。如果該交易的操作所使用的gas數量小于或等于所設置的gas limit,交易會被處理。但如果gas總消耗超過gas limit,所有的操作都會被重置,但手續費依舊會被收取。區塊鏈會顯示這筆交易完成嘗試,但因為沒有提供足夠的gas導致所有的合約命令都被復原。交易完成之后沒有被使用的gas會以以太幣的形式返還給發起者。gas消耗只是一個預估值,所以許多用戶會超額支付gas來保證他們的交易會被接受。
估算交易消耗
交易費由兩部分組成:
gasUsed:該交易消耗的總gas數量
gasPrice:該交易中單位gas的價格(用以太幣計算)
交易費 = gasUsed * gasPrice
gasUsed
每個EVM中的命令都被設置了相應的gas消耗值。gasUsed是所有被執行的命令的gas消耗值總和。如果希望估算gasUsed,可以web3.eth.estimateGas。
gasPrice
用戶可以自行設置的gasPrice的價格。由于網絡擁堵等多種情況,此價格會動態變化,可根據交易字節數和當前區塊中打包的平均值進行大概的預估。
交易案例
可以將gasLimit理解為你汽車油箱的上限。同時將gasPrice理解為油價。
對于一輛車來說,油價可能是2.5(價格)每升(單位)。在以太坊中,就是20GWei(價格)每gas(單位)。為了填滿你的"油箱",需要10升 2.5(價格)每升(單位)。在以太坊中,就是20GWei(價格)每gas(單位)。為了填滿你的"油箱",需要10升2.5(價格)每升(單位)。在以太坊中,就是20 GWei(價格)每gas(單位)。為了填滿你的"油箱",需要 10升2.5的油 = $25。同樣的,21000個20 GWei的gas = 0.00042 ETH。
以太幣單位換算
gas limit
區塊gas limit是單個區塊允許的最多gas總量,以此可以用來決定單個區塊中能打包多少筆交易。
例如,我們有5筆交易的gas limit分別是10、20、30、40和50.如果區塊gas limit是100,那么前4筆交易就能被成功打包進入這個區塊。礦工有權決定將哪些交易打包入區塊。所以,另一個礦工可以選擇打包最后兩筆交易進入這個區塊(50+40),然后再將第一筆交易打包(10)。如果你嘗試將一個會使用超過當前區塊gas limit的交易打包,這個交易會被網絡拒絕,你的以太坊客戶端會反饋錯誤”交易超過區塊gas limit”。
目前使用的gas limit為21000。
區塊的gas limit是由在網絡上的礦工決定的。與可調整的區塊gas limit協議不同的是一個默認的挖礦策略,即大多數客戶端默認最小區塊gas limit為4,712,388。
以太坊網絡上的”DoS”攻擊
最近有些評論表示以太坊網絡正在慢慢減速,變得擁堵甚至無法使用。這些評論把這個減速的過程稱為對以太坊網絡的”DoS”攻擊。當以太坊網絡上持續地出現全滿區塊并且有大量交易在網絡上待處理時就會出現所謂的DoS情況。同時,礦工有權利根據交易費選擇打包哪些交易。如果當時隊列中(交易池中)有上千筆交易正在等待打包,那么就有可能造成幾個小時的非正常交易延遲。DDoS可能是惡意的也有可能是非惡意的。