地基與基礎的概念(你不能不知道的 ETH 基礎概念)
本文將從什么是區塊、什么是交易、智能合約是怎么一回事、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質押數量排序確定,無需中心化機構審核,網絡更加去中心化。