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