CoinEx研究院丨你不能不知道的 ETH 基礎概念

買賣虛擬貨幣

作者:coinex smart chain(csc)研發人員劉同學



本文將從什麼是區塊、什麼是交易、智慧合約是怎麼一回事、erc20 轉賬的本質以及 eth 與 erc20 轉賬的區別幾個角度系統地介紹 eth。


什麼是區塊



首先來討論下什麼是區塊。相信大家對於區塊還是有一定了解的,區塊鏈嘛,就是一個一個區塊像一條鏈子一樣連線起來。


那麼 eth 的區塊是由什麼組成的呢?



這邊列舉了我們作為一個 eth 的使用者,應該知道的一些 eth 區塊的組成部分。像是這個區塊的所在高度、唯一的 hash 值、父區塊的 hash 值、區塊出塊那一瞬間的時間戳、挖出這個區塊的礦工地址、這個區塊的區塊大小、一共消耗了多少的 gas 等等,這些概念都很簡單,看他們的名字就能知道是什麼意思,這裡就不多贅述了。


接下來將著重介紹以下挖礦收益與叔塊地址的概念。


1.1 關於挖礦收益


首先是挖礦收益,各個礦工們不停地耗費大量電費去計算下一個區塊就是為了得到每個區塊出塊時的獎勵,這些都是貨真價實的 eth,礦工們再透過出售挖出來的 eth 獲利。



這裡每個區塊出塊時的獎勵主要由三部分組成,分別是出塊獎勵、手續費收益以及叔塊獎勵。


1.2 出塊獎勵


出塊獎勵就是每產生一個新的區塊時,挖出這個區塊的礦工所能獲得獎勵(爆塊獎勵)。這個收益具體多少是寫在共識裡的,修改這個固定收益需要硬分叉升級。



截止到目前為止,這個固定收益已經變化了三次,首先是代號“邊疆”的初始 eth 主網版本,從 0 高度開始,每塊的出塊獎勵為 5eth。


到了第四百三十七萬塊的高度時,隨著代號“拜占庭”的硬分叉升級,每塊的出塊獎勵從 5eth 降低到了 3eth。


最近一次變化是第七百二十八萬塊高度的“君士坦丁堡”硬分叉升級,每塊的出塊獎勵從 3eth 降低到了 2eth。截止到目前為止,每塊的出塊獎勵一直都是 2eth。



其次,還有手續費收益。這一部分的定義就簡單多了,就是這個區塊內所有交易手續費的總和。


1.3 叔塊獎勵


最後一部分就是叔塊獎勵,這裡需要了解的就是,每個區塊最多可以包含兩個叔塊,當然也可以一個都不包含。



並且每包含一個叔塊,就可以獲得 1/32 的出塊獎勵,以現在每個區塊的出塊獎勵為 2eth 為例,那麼每包含一個叔塊,就可以得到 2 的 1/32,也就是 0.0625 個 eth。如果包含兩個叔塊的話,就是 0.125 個 eth。


1.4 叔塊地址


介紹完挖礦收益,我們來了解一下剛才提到的叔塊概念。這裡放了一張圖,能夠比較清晰的幫助大家理解叔塊的概念。



eth 目前是 pow 的挖礦模式,就有可能發生在極短時間內兩個礦工同時得到新區塊的情況,這時其中的一個新區塊將因為慢了一點點,或者節點連線不好沒有及時廣播出去而作廢。


在 btc 網路中,這個作廢的新區塊被稱為孤塊,btc 中的孤塊是沒有收益的。而 eth 的出塊速度要比 btc 高很多,也就是發生孤塊的概率要高很多,為了避免礦工過多的發生辛苦挖出的區塊變成孤塊而沒有收益的情況發生,eth 引入了叔塊的概念。


如圖所示,在 1 高度的區塊之後產生了兩個 2 高度的區塊,其中綠色的區塊成為了真正的 2 高度區塊,而黃色的區塊將面臨被拋棄的危險。這時,後面的 3 高度區塊就將這個黃色的區塊包含為自己的叔塊。叔塊這個名字也非常的形象,叔叔就是自己父親的兄弟。3 高度區塊將因為包含了一個叔塊而獲得額外的叔塊獎勵。



同時這個叔塊的礦工地址也將收到獎勵,具體的獎勵數額與出塊高度和叔塊高度有關,公式是叔塊高度加 8(這個字元是 8 不是日),減去出塊高度,再乘上每塊的出塊獎勵,最後除以 8。以剛才那個圖展示的情況為例,叔塊高度為 2,出塊高度為 3,也就是 2 加 8 減 3 再乘以 2,最後除以 8,得到 1.75 個 eth。透過這個公式可以看出,叔塊最多隻能是上述 8 個高度以內的區塊。


什麼是交易



瞭解完區塊,接著來認識一下交易。交易就是區塊鏈這個去中心化賬本中具體的一條條記錄。


它主要由這筆交易的 hash、所在的區塊高度、時間戳、from 和 to 地址以及這筆交易涉及的 eth 金額組成,其次還有 input、nonce 以及交易手續費等屬性。



前三個 hash、高度與時間戳比較好理解,看名字就能知道是什麼意思。因此接下來著重介紹一下後面的幾個概念。


2.1 from、to 地址以及 eth 金額


作為一個去中心化的賬本,轉賬是最基本的功能,我們可以把每一筆交易當成是一筆 eth 的轉賬,而一筆轉賬就是由傳送方、接收方以及轉賬金額組成,這裡對應的就是 from、to 地址以及 eth 金額。


from 地址就是主動發出這筆交易的地址,to 地址可以是一個普通的使用者地址,也可以是一個合約地址,如果是普通使用者地址時這筆交易就是一個簡單的 eth 轉賬,如果是一個合約地址,那就是相對複雜一點的合約呼叫,最後的 eth 金額,就是這筆 eth 轉賬涉及到的轉賬金額。



作為一個支援智慧合約的公鏈,eth 可以在傳送交易時額外填入 input 資料,這裡的 input 資料就是呼叫合約時的呼叫引數。當然如果這是一筆普通的 eth 轉賬交易,那麼 input 空著就好了。理論上這裡的 input 的內容可以隨便填,只要前面的一部分資料能正確的呼叫合約即可。



在開發專案時有一個邀請返傭的功能,為了最大程度的降低使用者的感知,透過在傳送 swap、下單等交易時,在正確的 input 內容最後,新增使用者的邀請碼的方式來實現了這個功能。


下面來介紹nonce,所謂 nonce 就是 from 地址的交易順序,本質上就是這個 from 地址傳送的已打包的交易總數。同一個 from 地址的交易必須按照 nonce 的順序打包。



這裡就產生了一個問題,如果前面的 nonce 沒有被打包的的話,後面的 nonce 將永遠不會被打包。因為這個使用者前面傳送的交易的手續費給的太低了,導致這筆交易遲遲沒有被打包,而使用者還不斷的傳送新的交易,然後使用者就會感到疑惑,為什麼我發的交易手續費給這麼高還是打包不了。原因就在這裡,使用者前面的交易手續費太低了,阻塞了後面所有的交易。這時應該將前面阻塞的交易加速或者取消掉,後面被阻塞的交易就會依次被打包。


這裡提到的交易加速和取消的功能也是透過 nonce 來實現的,在一筆交易沒有被打包前,其中的 nonce 可以重複傳送,只要新傳送的交易的 gas price 比原來的高就可以將原來的交易覆蓋掉,通常新交易的 gas price 要比原來的高 10%以上,具體要求高多少是由節點配置決定的。


2.2 如何計算交易手續費


在闡述如何計算交易手續費之前,先來介紹幾個基本概念。



首先是 gas,gas是 evm 在執行指令時所需要消耗的資源。gas limit 和 gas used 則分別表示使用者在傳送這筆交易時,預計需要消耗的 gas 數量,以及這筆交易在執行時實際消耗的 gas 數量,當一筆交易還沒執行完就把 gas limit 消耗完時,這筆交易將會失敗。最後是 gas price,表示這個使用者願意以多少 eth 的價格,來購買 1 個單位的 gas。


瞭解完這些基本概念,就能得出每筆交易的手續費是怎麼來的了,計算方式也很簡單,就是 gas used 乘以 gas price。



舉個例子,一筆 eth 轉賬需要消耗 21000gas,而使用者願意出 120 的價格,這裡 120 的單位是 gwei,1 個 gwei 是 10 的-9 次方個 eth,那麼完成這筆 eth 轉賬交易使用者就需要支付 21000 乘以 120 再除以 10 的- 9 次方,也就是 0.00252 個 eth。


需要特別說明的是,越複雜的合約呼叫所需要消耗的 gas 就越高,而礦工們將優先打包手續費更高的交易。


智慧合約是什麼回事



3.1 以太坊虛擬機器


介紹智慧合約之前,需要先了解一下 evm,即以太坊虛擬機器,我們知道 eth 是一條區塊鏈,這是一個去中心化的專案,那麼可以把 evm 理解成是執行在 eth 這個去中心化專案中的一臺超級計算機,負責向使用者收取 gas,然後執行區塊上儲存的程式碼。



這裡提到的區塊上儲存的程式碼,就是智慧合約。


eth可以實現各種各樣的邏輯。例如coinex去年投資的oneswap就是基於eth實現的一個去中心化交易所。在計算機的世界,想要實現各種各樣的邏輯,就需要編寫出各種各樣的程式碼,而這裡的程式碼,就是智慧合約。


3.2 智慧合約


智慧合約是儲存在區塊上的,而智慧合約的地址就相當於是這段儲存在區塊上的程式碼的呼叫入口,透過合約地址,就能方便的透過交易呼叫想呼叫的智慧合約來實現預期的功能。




這裡拿手機做個類比,btc網路就相當於是一臺功能機,從最初的設計上來看只能實現轉賬這樣的特定功能,而eth網路就相當於是一臺智慧手機,可以透過不同的智慧合約實現各種各樣的功能,而這裡的智慧合約就相當於是eth這臺智慧手機上的一個個app。


erc20轉賬的本質



我們知道,一個 erc20 token 其實就是一個智慧合約,而 erc20 就是指這一類智慧合約的通用規範。那麼我們現在透過智慧合約的角度來認識一下 erc20 轉賬的本質是什麼。


剛才說了,智慧合約本質上就是儲存在區塊上的程式碼,那麼我們先來看下 erc20 合約的程式碼,這裡只擷取了其中轉賬部分的邏輯,程式碼非常簡單,相信各位非技術朋友也能理解。



首先我們看到第二行,這裡定義了一個 event,中文名稱為事件,它的作用就是用來告知使用者這段程式碼發生了什麼事情。這裡定義的是一個 transfer 事件,顧名思義,它表示了一個轉賬行為的發生。這個 transfer 事件有三個引數,分別用來告知使用者這個轉賬行為的傳送方地址、接收方地址以及轉賬的金額。



再往下就是 erc20 合約轉賬這個功能的完整實現了。這個轉賬函式只有接收方地址和轉賬金額兩個引數而沒有傳送方地址,是因為傳送方地址不需要特別宣告,這個轉賬函式的呼叫者就是傳送方地址,也就是程式碼中的 msg.sender。


首先這個函式會判斷一下這個傳送方的餘額夠不夠,並且要求轉賬金額不能是一個負數,必須是一個大於 0 的數,否則就返回 false 表示這筆轉賬失敗了。


判斷條件透過後就正式開始轉賬邏輯了,邏輯非常簡單,首先把傳送方的餘額減去轉賬金額,然後在給接收方的餘額加上轉賬金額就完成了。erc20 轉賬本質上就這麼簡單,傳送方的餘額減去轉賬金額、接收方的餘額加上轉賬金額。然後再將這個轉賬事件傳送出來,最後返回 true 表示轉賬成功就可以了。


我們來看一下 erc20 合約的轉賬功能怎麼呼叫的,還記得剛才介紹交易的時候有提到,如果這筆交易是一筆合約呼叫的話,那麼交易的 to 地址就是被呼叫的合約地址。還有交易裡面有一個 input 屬性,是呼叫合約時的呼叫引數。



上面的這個圖就是一個 erc20 轉賬功能的呼叫引數,它可以分成三個部分,我這裡用紅色線段隔出來了。最前面的一小段字元表示轉賬這個函式的摘要,一個智慧合約可能有多個函式,而每個函式的摘要都是不同的,因此透過這個摘要就能指定合約中的不同函式。後面這一長串表示一個地址,就是轉賬這個函式的第一個引數——接收方地址。最後的這個長串表示一個數字,就是轉賬的金額。


而下面的這個圖是瀏覽器根據上面的 input 原始資料解析出來的,幫助使用者清楚的看到個這筆交易呼叫了什麼函式,每個引數又是什麼。



這筆 erc20 轉賬的交易被成功打包後,就可以在交易詳情中查詢到這樣一個 transfer 事件,透過這個 transfer 事件,我們可以看到尾號 619 這個地址給尾號 9b0 這個地址轉了這麼多幣,這裡顯示的數字還需要除以 token 的精度才是真實的轉賬金額。這個 token 是 ones,精度是 18 位,因此這個數字表示 7200 個 ones


最後我們就能透過這個 transfer 事件解析出最終的 erc20 轉賬記錄,即一個尾號 619 的地址,給一個尾號 9b0 的地址轉了 7200 個 ones。


以上就是從智慧合約的角度分析的一筆 erc20 轉賬的本質。


eth與erc20轉賬的區別


我們最後來總結一下 eth 轉賬和 erc20 轉賬的區別。



我們前面提到了,每筆交易天然就是一筆 eth 轉賬,即使是一個合約呼叫,也能理解成是一筆 eth 轉賬,只不過接收方地址不是普通的使用者地址,而是一個智慧合約地址,並且轉賬金額有可能是 0。



除此之外,還有一種被稱為內部交易的情況也可能是一筆 eth 轉賬,例如一個智慧合約在執行的時候發生了一個 eth 轉賬行為,就是透過一個內部交易體現的。



而 erc20 轉賬就簡單多了,它本質上就是一個 erc20 合約的一個名為 transfer 的事件。


eth,你學會了麼?


關於coinex smart chain

coinex智慧鏈(csc)是coinex公鏈團隊為去中心化金融打造的去中心化、高效率的公鏈,具有以下特點:

  • 完美相容以太坊生態:csc基於以太坊虛擬機器(evm)構建,開發者可以使用成熟的開發工具,輕鬆的移植dapp到csc上,使用者也可輕鬆接入csc網路。
  • 極高效率和低交易費:csc使用pos共識協議,實現秒級出塊時間,支援極高的tps,同時保持低廉的交易費。
  • 出塊節點無需許可:csc最多支援101個出塊節點,根據cet質押數量排序確定,無需中心化機構稽覈,網路更加去中心化。

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读