科普:以太坊交易的生命周期?
ETH(Ethereum)以太坊錢(qián)包基本概念介紹:http://www.dbjr.com.cn/blockchain/801260.html
了解以太坊交易是如何生成并在網(wǎng)絡(luò)中廣播的
交易是以太坊區(qū)塊鏈(或任何類(lèi)似的區(qū)塊鏈)的核心。在與以太坊區(qū)塊鏈進(jìn)行交互之時(shí),你是在執(zhí)行交易并更新其狀態(tài)。你有沒(méi)有想過(guò)要了解當(dāng)你在以太坊執(zhí)行交易之時(shí)到底發(fā)生了什么?讓我們通過(guò)一則交易例子來(lái)解答這一問(wèn)題。本文包括如下內(nèi)容。
以太坊交易的端到端遍歷,即從你的瀏覽器/控制臺(tái)出發(fā)進(jìn)入以太坊網(wǎng)絡(luò),然后再回到你的瀏覽器/控制
了解當(dāng)你使用 Metamask 或 Myetherwallet 等插件,而非運(yùn)行自己的節(jié)點(diǎn)之時(shí),交易是如何進(jìn)行的
如果你比較偏執(zhí)多疑,不信任任何插件,想自己執(zhí)行交易,該怎么做?
本文讀者需要對(duì)以太坊及其組成部分,如賬戶、gas 和合約等具備基礎(chǔ)性了解。關(guān)于這些概念的詳細(xì)解釋可以參見(jiàn)這篇文章(編者注:中譯本見(jiàn)文末《以太坊中的賬戶、交易、Gas和區(qū)塊Gas Limit》超鏈接)。如果你是一個(gè)不熟悉以太坊的開(kāi)發(fā)者,這篇文章或許對(duì)你很有幫助。你也可以從這篇文章中學(xué)習(xí)如何構(gòu)建簡(jiǎn)單的分布式應(yīng)用。如果你已經(jīng)有過(guò)執(zhí)行交易的親身經(jīng)歷,本文對(duì)你的意義會(huì)更大。例如,可以是將一些以太幣發(fā)送給另一個(gè)人或合約的交易。再比如,還可以是在與分布式應(yīng)用進(jìn)行交互的情況下,如果你在這個(gè)網(wǎng)站上買(mǎi)了一些代幣,這就是一筆交易。如果你為一位候選人投票,這也是一筆交易。
一. 以太坊交易的端到端綜述
讓我們以下列合約調(diào)用為例,并遍歷該函數(shù)調(diào)用/交易是如何執(zhí)行及永久存儲(chǔ)在區(qū)塊鏈上的整體流程。點(diǎn)擊此處可了解整個(gè)合約。從較高層次來(lái)說(shuō),這是一個(gè)投票合約,其中你可以預(yù)置一些候選人在選舉中進(jìn)行角逐,任何人都能為他們投票。這些投票將會(huì)記錄在區(qū)塊鏈上。
Voting.deployed().then(function(instance) { instance.voteForCandidate('Nick', {gas: 140000, from: web3.eth.accounts[0]}).then(function(r) { console.log("Voted successfully!") }) })
假設(shè)你在自己的計(jì)算機(jī)上本地運(yùn)行了一個(gè)以太坊客戶端(Geth 或 Parity),你的計(jì)算機(jī)連接到了某個(gè)以太坊網(wǎng)絡(luò)(測(cè)試網(wǎng)絡(luò)或是主網(wǎng)),你有權(quán)訪問(wèn)該合約地址和 ABI,從而執(zhí)行該交易。
如果你構(gòu)建過(guò)分布式應(yīng)用,應(yīng)該對(duì)上述代碼并不陌生。這是一個(gè)名為“Voting(投票)”的合約,已經(jīng)部署在了區(qū)塊鏈上。我們以該合約為例,執(zhí)行一個(gè)叫作 voteForCandidate 的函數(shù),輸入候選人的姓名、該交易的gas上限和執(zhí)行該交易的賬戶。從名稱(chēng)中可以看出,該函數(shù)能夠用來(lái)為候選人投票,選票記錄在區(qū)塊鏈上。在下文,我們將嘗試解構(gòu)該調(diào)用,了解你在執(zhí)行該 javascript 函數(shù)時(shí)會(huì)發(fā)生的一切。
1. 構(gòu)建原始交易對(duì)象
如下圖所示,voteForCandidate 函數(shù)調(diào)用首先被轉(zhuǎn)化成了原始交易(rawTxn)。Web3js庫(kù)被用來(lái)構(gòu)建原始交易對(duì)象。
txnCount = web3.eth.getTransactionCount(web3.eth.accounts[0]) var rawTxn = { nonce: web3.toHex(txnCount), gasPrice: web3.toHex(100000000000), gasLimit: web3.toHex(140000), to: '0x633296baebc20f33ac2e1c1b105d7cd1f6a0718b', value: web3.toHex(0), data: '0xc7ed014952616d6100000000000000000000000000000000000000000000000000000000' };
讓我們?cè)囍私庀略撛冀灰讓?duì)象中的所有字段,以及它們是如何設(shè)置的。
nonce(隨機(jī)數(shù)):每個(gè)以太坊賬戶都有一個(gè)叫做 nonce 的字段,來(lái)記錄該賬戶已執(zhí)行的交易總數(shù)。Nonce 的值隨著每個(gè)新交易的執(zhí)行不斷增加,這能讓網(wǎng)絡(luò)了解執(zhí)行交易需要遵循的順序。Nonce 也被用來(lái)進(jìn)行重放保護(hù)。
gasPrice(gas價(jià)格):即你愿為該交易支付的每單位 gas 的價(jià)格。如果你正在主網(wǎng)上執(zhí)行交易,ETH Gas Station上正好有一個(gè)網(wǎng)站,你可以參照其建議為你的交易設(shè)定 gas 價(jià)格,以便交易在一定時(shí)間內(nèi)成功執(zhí)行。Gas 價(jià)格目前以 GWei 為單位,其范圍是0.1->100+Gwei。下文會(huì)進(jìn)一步介紹 gas 價(jià)格及其影響。
gasLimit(gas上限):即你愿為該交易支付的最高 gas 總額。該上限能確保在出現(xiàn)交易執(zhí)行問(wèn)題(比如陷入無(wú)限循環(huán))之時(shí),你的賬戶不會(huì)耗盡所有資金。一旦交易執(zhí)行完畢,剩余所有 gas 會(huì)返還至你的賬戶。
to:即該函數(shù)調(diào)用被送往的地址。0x633296baebc20f33ac2e1c1b105d7cd1f6a0718b 是我們的案例中投票合約的地址。
Value(值):即你打算發(fā)送的以太幣總量。當(dāng)我們執(zhí)行voteForCandidate函數(shù)時(shí),我們根本沒(méi)有發(fā)送以太幣,因此 value 為零。如果你要執(zhí)行一個(gè)交易,向另一個(gè)人或合約發(fā)送以太幣,你會(huì)需要設(shè)置 value 值。
data(數(shù)據(jù)):讓我們來(lái)看看data字段是如何計(jì)算出來(lái)的。
你先從 voteForCandidate(bytes32 candidate)(32字節(jié)的候選人)的 ABI 中獲取函數(shù)簽名,并得出它的哈希值。
> web3.sha3('voteForCandidate(bytes32 candidate)') '0xc7ed014922ff9493a686391b70ca0e8bb7e80f91c98a5cd3d285778ab2e245b3'
取該哈希值的前4個(gè)字節(jié),即:0xcc9ab267。
然后將參數(shù)‘Nick’轉(zhuǎn)化為32字節(jié),得到52616d6100000000000000000000000000000000000000000000000000000000
將二者結(jié)合,得到數(shù)據(jù)有效載荷。
2.簽署交易
如果你記得的話,你使用了web3.eth.accounts[0]來(lái)執(zhí)行該交易。以太坊網(wǎng)絡(luò)需要知道你確實(shí)是該賬戶的所有者,從而確保其他人不能以你的名義執(zhí)行該交易。要向網(wǎng)絡(luò)證明這點(diǎn)的方法是使用該賬戶的相應(yīng)私鑰簽署交易。簽署過(guò)后的交易如下圖所示:
const privateKey = Buffer.from('e331b6d69882b4ab4ea581s88e0b6s4039a3de5967d88dfdcffdd2270c0fd109', 'hex') const txn = new EthereumTx(rawTxn) txn.sign(privateKey) const serializedTxn = txn.serialize()
3. 交易經(jīng)由本地驗(yàn)證
簽署過(guò)后的交易會(huì)提交至你的本地以太坊節(jié)點(diǎn)。然后你的本地節(jié)點(diǎn)會(huì)驗(yàn)證已簽名的交易,確保它真的是由這個(gè)賬戶地址簽署過(guò)的。
4. 交易被廣播至網(wǎng)絡(luò)
已簽署交易經(jīng)由你的geth/parity節(jié)點(diǎn)廣播至其對(duì)等節(jié)點(diǎn),這些對(duì)等節(jié)點(diǎn)再將該交易廣播給它們的對(duì)等節(jié)點(diǎn),以此類(lèi)推。一旦交易被廣播至網(wǎng)絡(luò),你的本地節(jié)點(diǎn)也會(huì)輸出該交易的id,你可以用它來(lái)追蹤你的交易的狀態(tài)。該交易id就是已簽署交易對(duì)象的哈希值。
transactionId = sha3(serializedTxn)
如果你是在公共的以太坊網(wǎng)絡(luò)上執(zhí)行該交易的話,追蹤你的交易狀態(tài)的最佳方式是通過(guò)etherscan.io。如上圖所示,你是否注意到了有幾個(gè)節(jié)點(diǎn)被標(biāo)記為 Etherscan 節(jié)點(diǎn)。Etherscan 的團(tuán)隊(duì)運(yùn)行了幾個(gè)節(jié)點(diǎn),并將一個(gè)很棒的前端網(wǎng)絡(luò)應(yīng)用連接到了 Etherscan上。如果你的交易被他們的節(jié)點(diǎn)選中,你可以在他們的網(wǎng)站上查看自己的待定交易。
還要記住的一點(diǎn)是,并非所有節(jié)點(diǎn)都會(huì)接受你的交易。其中一些節(jié)點(diǎn)可能被設(shè)置成了只接受 gas 價(jià)格超過(guò)某一最低值的交易。如果你設(shè)置的 gas 價(jià)格低于該下限,則節(jié)點(diǎn)會(huì)忽略你的交易。
5. 礦工節(jié)點(diǎn)接受交易
正如圖中所示,以太坊網(wǎng)絡(luò)同時(shí)擁有礦工節(jié)點(diǎn)和非礦工節(jié)點(diǎn)??赡苣阋仓?,礦工的職責(zé)是將你的交易包含到區(qū)塊上。礦工是交易池的維護(hù)者,你的交易先是被添加進(jìn)交易池,再由礦工進(jìn)行開(kāi)始評(píng)估。
從上圖中你會(huì)注意到礦工將所有交易存儲(chǔ)在根據(jù) gas 價(jià)格分類(lèi)的池中。gas 價(jià)格越高,該交易就越有可能被添加進(jìn)下一個(gè)區(qū)塊。這是礦工節(jié)點(diǎn)的常見(jiàn)設(shè)定(為得到更高的報(bào)酬進(jìn)行優(yōu)化)。不過(guò),礦工可以將自己的節(jié)點(diǎn)設(shè)置成根據(jù)自己的喜好對(duì)交易進(jìn)行分類(lèi)(例如,他們?yōu)榱藥椭W(wǎng)絡(luò)只挖掘gas價(jià)格低的交易)。
從上圖中,你看出我們的 voteForCandidate 交易是如何沉入礦池底端的嗎?一旦所有g(shù)as價(jià)格高的交易都被挖出來(lái)包含進(jìn)區(qū)塊之后,礦工將挖掘我們的交易。
還有要注意的一點(diǎn)是,礦池可以容納的交易數(shù)是有限的。比如,一場(chǎng)眾籌正在火熱進(jìn)行中或是一個(gè)非常流行的分布式應(yīng)用(如加密貓)橫空出世。人們提交了 gas 價(jià)格高的交易,希望礦工能最先選中他們的交易。如果 gas 價(jià)格高的交易填滿了礦池,gas 價(jià)格低的交易就會(huì)被放棄。我們的候選人 Nick 在一段時(shí)間內(nèi)就別想收到任何選票了。在這種情況下,我們甚至得重新廣播我們的交易。
另一個(gè)能讓你的交易在礦池里上升的技巧是重新提交你的交易,提高 gas 價(jià)格并維持 nonce 值不變。這樣一來(lái),當(dāng)?shù)V工接收到新交易時(shí),gas 價(jià)格更高的新交易會(huì)覆蓋之前的交易。如果改變了 nonce 值,重新提交的交易就會(huì)被認(rèn)為是不同的交易(最后會(huì)為Nick舉行兩次投票)。這里推薦一篇很好的文章(編者注:中譯本見(jiàn)文末《科普 | 釋放阻塞的以太坊交易》超鏈接),作者Jim McDonald 對(duì)此做出了深入的解釋。
6. 礦工節(jié)點(diǎn)找到一個(gè)有效區(qū)塊并將它廣播至網(wǎng)絡(luò)
礦工最后選中了我們的交易,與其他交易一起包含進(jìn)區(qū)塊。礦工只能選擇一定量的交易添加進(jìn)區(qū)塊,因?yàn)橐蕴灰呀?jīng)設(shè)置了單個(gè)區(qū)塊 gas 上限,換言之,交易的所有 gas 上限總數(shù)不能超過(guò)區(qū)塊 gas 上限。你可以在 ethstats.net 上查看當(dāng)前 gas 上限。
一旦礦工選擇將交易包含進(jìn)區(qū)塊,這些交易將被驗(yàn)證并包含進(jìn)一個(gè)待處理區(qū)塊,工作量證明開(kāi)始。某個(gè)礦工節(jié)點(diǎn)(通過(guò)解決工作量證明難題)最終會(huì)找到一個(gè)有效的區(qū)塊,并將這一區(qū)塊添加到區(qū)塊鏈上。就像經(jīng)由你的本地節(jié)點(diǎn)廣播的原始交易會(huì)被其他節(jié)點(diǎn)接收那樣,礦工節(jié)點(diǎn)也會(huì)將這一有效區(qū)塊廣播給其他節(jié)點(diǎn)。
7. 本地節(jié)點(diǎn)接收/同步新區(qū)塊
最終,你的本地節(jié)點(diǎn)將接收這個(gè)新區(qū)塊,并同步區(qū)塊鏈在本地的副本。一旦接收到這個(gè)新區(qū)塊,本地節(jié)點(diǎn)就會(huì)執(zhí)行區(qū)塊里的所有交易。
如果你使用 truffle 執(zhí)行你的交易, truffle 會(huì)不斷測(cè)驗(yàn)區(qū)塊鏈以求確認(rèn)。一旦它發(fā)現(xiàn)交易被確認(rèn),就會(huì)執(zhí)行 then() 區(qū)塊中的代碼,并打?。ㄎ覀兠總€(gè)例子的)控制臺(tái)日志函數(shù)。
二. 使用Metamask而非本地節(jié)點(diǎn)
如果你安裝了 MetaMask 瀏覽器插件,你就能在你的瀏覽器中管理你的賬戶。密鑰只會(huì)存儲(chǔ)在你的瀏覽器上,因此你是唯一一個(gè)有權(quán)訪問(wèn)你的賬戶和私鑰的人。當(dāng)你在瀏覽器上執(zhí)行交易之時(shí),插件會(huì)將你的函數(shù)調(diào)用轉(zhuǎn)化成原始交易,并用你的私鑰簽署交易。 Metamask 運(yùn)行自己的節(jié)點(diǎn),并且使用這些節(jié)點(diǎn)來(lái)廣播你的交易(Metamask 使用的是Infura 運(yùn)營(yíng)的節(jié)點(diǎn))。如此一來(lái),你就沒(méi)必要運(yùn)行自己的以太坊節(jié)點(diǎn)了。
三. 線下簽名
如果你不喜歡用插件,或者擔(dān)心你的本地 geth 節(jié)點(diǎn)有可能受損(遭篡改),該怎么辦呢?要解決這一問(wèn)題有一個(gè)安全之策。
你是否注意到了,前兩個(gè)步驟根本不需要聯(lián)網(wǎng)。如果你想確保自己的交易絕對(duì)不會(huì)受到篡改,你可以使用一臺(tái)沒(méi)有聯(lián)網(wǎng)的計(jì)算機(jī)將這一函數(shù)調(diào)用轉(zhuǎn)換成原始交易,并使用你的私鑰簽署該交易。之后,你可以復(fù)制已簽署交易串,并使用聯(lián)網(wǎng)的計(jì)算機(jī)將其廣播至網(wǎng)絡(luò)。你可以使用 Etherscan 和 Infura 等服務(wù)將你已簽署的交易廣播至網(wǎng)絡(luò)。
另一個(gè)安全之策是使用 Ledger 或 Trezor 等硬件錢(qián)包。這類(lèi)錢(qián)包存儲(chǔ)了你的私鑰,而簽署交易的密鑰已經(jīng)編程進(jìn)了硬件本身。它們需要聯(lián)網(wǎng)的原因只是為了發(fā)布你的已簽署交易。
以上就是科普:以太坊交易的生命周期?的詳細(xì)內(nèi)容,更多關(guān)于以太坊的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
你可能感興趣的文章
-
ETH(Ethereum)以太坊錢(qián)包基本概念介紹
這篇文章主要介紹了ETH(Ethereum)以太坊錢(qián)包基本概念介紹的相關(guān)資料,希望這篇關(guān)于以太坊錢(qián)包基本概念介紹的文章,能夠幫助各位朋友對(duì)以太坊錢(qián)包有個(gè)更加深入的了解?!?/p> 2021-12-08
-
以太坊代幣錢(qián)包MyEtherWallet使用教程
這篇文章主要介紹了MyEtherWallet使用教程的相關(guān)資料,希望這篇關(guān)于MyEtherWallet使用教程的文章,能夠幫助到大家更深入的了解MyEtherWallet?!?/p> 2021-12-07
-
以太坊智能合約及大部分Token都在用的ERC標(biāo)準(zhǔn)是什么?
這篇文章主要介紹了以太坊智能合約,以及大部分Token都在用的ERC標(biāo)準(zhǔn)是什么?的相關(guān)資料,希望這篇關(guān)于以太坊智能合約和ERC標(biāo)準(zhǔn)是什么的文章,能夠幫助各位朋友對(duì)ERC有個(gè)更加…
2021-12-02 -
以太坊科普:Eth2驗(yàn)證者如何生成和保護(hù)取款密鑰
這篇文章主要介紹了以太坊科普:Eth2驗(yàn)證者如何生成和保護(hù)取款密鑰的相關(guān)資料,希望這篇關(guān)于Eth2驗(yàn)證者如何生成和保護(hù)取款密鑰的文章,能夠幫助各位投資者對(duì)Eth2有一個(gè)更加…
2021-11-30 -
以太坊合約交易怎么玩?以太坊合約交易教程
這篇文章主要介紹了以太坊合約交易怎么玩?以太坊合約交易教程的相關(guān)資料,需要的朋友可以參考下,以太坊合約交易是指交易雙方,在交易所通過(guò)買(mǎi)賣(mài)以太坊合約,并根據(jù)約定在…
2021-11-29 -
科普:以太坊轉(zhuǎn)賬手續(xù)費(fèi)怎么算?教你省錢(qián)的方法
這篇文章主要介紹了科普:以太坊轉(zhuǎn)賬手續(xù)費(fèi)怎么算?的相關(guān)資料,希望這篇關(guān)于以太坊轉(zhuǎn)賬手續(xù)費(fèi)怎么算的文章,讓大家都能明白以太坊轉(zhuǎn)賬手續(xù)費(fèi)的算法,下面一起來(lái)看看吧!…
2021-11-10 -
如何轉(zhuǎn)移以太坊ETH錢(qián)包數(shù)據(jù)?以太坊C盤(pán)數(shù)據(jù)轉(zhuǎn)移教程
這篇文章主要介紹了如何轉(zhuǎn)移以太坊ETH錢(qián)包數(shù)據(jù)?以太坊C盤(pán)數(shù)據(jù)轉(zhuǎn)移教程的相關(guān)資料,需要的朋友可以參考下,首先以太坊的數(shù)據(jù)保存在user用戶名當(dāng)中需要在硬盤(pán)的位置,一是可…
2021-11-10 -
怎么注冊(cè)以太坊錢(qián)包?以太坊(ETH)錢(qián)包下載,教你快速申請(qǐng)以太坊ETH錢(qián)包
這篇文章主要介紹了怎么注冊(cè)以太坊錢(qián)包?以太坊(ETH)錢(qián)包下載,教你快速申請(qǐng)以太坊ETH錢(qián)包的相關(guān)資料,需要的朋友可以參考下今天這篇文章我們講一講以太坊錢(qián)包的注冊(cè)流程 ?!?/p> 2021-11-10
-
支持HECO火幣生態(tài)鏈錢(qián)包有哪些?如何設(shè)置PC端以太坊錢(qián)包?
這篇文章主要介紹了支持HECO火幣生態(tài)鏈錢(qián)包有哪些?如何設(shè)置PC端以太坊錢(qián)包?的相關(guān)資料,希望這篇關(guān)于如何設(shè)置PC端以太坊錢(qián)包的文章,能讓投資者深入的了解HECO火幣生態(tài)鏈錢(qián)…
2021-11-10 -
一文弄懂區(qū)塊鏈和以太坊智能合約的由來(lái)和運(yùn)行原理
這篇文章主要介紹了一文弄懂區(qū)塊鏈和以太坊智能合約的由來(lái)和運(yùn)行原理的相關(guān)資料,希望這篇關(guān)于區(qū)塊鏈和智能合約的文章,讓大家能夠深入的了解區(qū)塊鏈和以太坊智能合約的由來(lái)…
2021-11-08