以太坊-帳戶交易消息挖礦以太幣

概念

以太坊是一個可編程區塊鏈,那麼允許用戶創建屬於他們自己的複雜的操作,且作為一個去中介化的平臺,提供不同的區塊鏈應用服務。

區塊鏈去中介化的系統,驗證區塊是否有效是最為關鍵的一個環節。這裡會有一個“狀態”的概念,狀態的改變來記錄區塊的一種現狀,狀態不以編碼的方式寫進區塊鏈中,而是去中介化系統中,每個節點來驗證後的一種抽象的表現,這個表現從創世區塊開始,一個個串聯的區塊進行安全的驗證計算,保證每一次交易的正常。

從區塊鏈鼻祖比特幣來看,比特幣中通過以下的模式來檢查區塊的正常:

  • 檢查上一個區塊是否存在且是有效的
  • 檢查時間戳是否大於上一個區塊,且在2個小時之內
  • 檢查工作量證明
  • 檢查最後的區塊的狀態
  • 檢查區塊內的交易

那麼以太坊能做的不單單只是交易,允許用戶創建複雜操作,核心為以太坊虛擬機(EVM),實現圖靈完備,開發者使用編程語言來創建應用,且通過P2P的網絡模式,全網節點進行確保一致性的計算,去中介化的強容錯,也實現了永不宕機(只要有節點運行)。

效率問題:應該很多人聽過把以太坊比作是一臺“世界計算機”,那麼其實全網進行大規模的並行計算,並沒有提高運算效率,為了保證全網絡中節點狀態的一致性,效率和成本和之前的計算機還是有差距的。

賬戶、交易、消息

以太坊有兩種類型的賬戶:

  • 外部賬戶 外部賬戶沒有代碼,可以通過創建和簽名一筆交易從一個外部賬戶發送消息。簡稱EOA,私鑰控制。
  • 合約賬戶 與外部擁有的賬戶不同,合約賬戶不能自行發起新的交易,合約帳戶只能觸發交易以響應其他交易。每當合約賬戶收到一條消息,合約內部的代碼就會被激活,允許它對內部存儲進行讀取和寫入,和發送其它消息或者創建合約。

通俗點理解,用戶通過私鑰掌握外部賬戶,那麼合約賬戶由合約代碼來控制,用戶通過外部賬戶可通過代碼來控制合約賬戶,實現智能合約。通過把代碼部署到區塊鏈中創建一個新合約,也就是外部賬戶創建了一個新的合約賬戶。

外部賬戶與合約賬戶的比較:

  • 一個外部擁有賬戶可以通過創建和用自己的私鑰來對交易進行簽名,來發送消息給另一個外部擁有賬戶或合約賬戶。
  • 在兩個外部擁有賬戶之間傳送的消息只是一個簡單的價值轉移。
  • 從外部擁有賬戶到合約賬戶的消息會激活合約賬戶的代碼,允許它執行各種動作。
  • 不像外部擁有賬戶,合約賬戶不可以自己發起一個交易。相反,合約賬戶只有在接收到一個交易之後(從一個外部擁有賬戶或另一個合約賬戶接),為了響應此交易而觸發一個交易。
  • 因此,在以太坊上任何的動作,總是被外部控制賬戶觸發的交易所發動的。

賬戶狀態

以太坊的賬戶包含四個部分:

  • nonce:用於確定每筆交易只能被處理一次的隨機數。如果賬戶是一個外部擁有賬戶,nonce代表從此賬戶地址發送的交易序號;如果賬戶是一個合約賬戶,nonce代表此賬戶創建的合約序號
  • balance:賬戶目前的以太幣餘額
  • storageRoot:Merkle樹的根節點Hash值。Merkle 樹會將此賬戶存儲內容的Hash值進行編碼,默認是空值
  • codeHash:此賬戶EVM代碼的hash值,對於合約賬戶,就是被Hash的代碼並作為codeHash保存;對於外部擁有賬戶,codeHash域是一個空字符串的Hash值

交易

以太坊的交易最直觀解釋:從外部賬戶發送到區塊鏈上的另一個賬戶的消息和簽名的數據包。

包含如下內容:

  • 發送者的簽名
  • 接收的地址
  • 轉移的數字貨幣數量等內容

以太坊上的交易都是需要支付費用,和比特幣以比特幣來支付一定的交易費用不同,以太坊上固定了這個環節,那麼這個間接理解是以太坊的一種安全防範錯誤,防止了大量的無意義的交易,保證一定的安全性,特別是智能合約的創建、執行、調用都需要消耗費用,那麼也保證了整個系統的穩定性,防止了一些鏈上無意義的惡意行為。


交易手續費

以太坊的核心是EVM,以太坊虛擬機,那麼在EVM中執行的字節碼都是要支付費用。也就是經常看到的Gas、Gas limit、Gas Price這幾個概念。

  • Gas:字面理解就是汽油,以太坊和日常的汽車一樣需要Gas才能運行。Gas是一筆交易過程中計算消耗的基本單位。有一個列表可以直觀看到在以太坊中操作的Gas消耗量:

操作Gas消耗具體內容step1執行週期的默認費用。stop0終止操作是免費的。suicide0智能合約賬戶的內部數據存儲空間,當合約賬戶調用suicide()方法時,該值將被置為null。sha320加解密sload20在固定的存儲器中去獲取sstore100輸入到固定的存儲器中balance20賬戶餘額create100創建合約call20初始化一個只讀調用memory1擴充內存額外支付的費用txdata5交易過程中數據或者編碼的每一個字節的消耗transaction500交易費用contract creation53000homestead中目前從21000調整到53000

所以有些公司或者個人覺得區塊鏈技術去中介化,不需要中心服務器,這種開發模式是比較便宜的,但是事實上區塊鏈的開發不比之前的那些傳統軟件開發來的便宜。

  • Gas Price:字面理解汽油價格,這個就像你去加油站,95#汽油今天是什麼價格。一個Gas Price就是單價,那麼你的交易費用=Gas*Gas Price,然後以以太幣來ether來支出。當然你覺得我不想支付費用,你可以設置Gas Price為0,但是選擇權在礦工手中,礦工有權選擇收納交易和收取費用,那麼最簡單的想想很難讓一個礦工去接收一個價格很低的交易吧。另外提一句,以太坊默認的Gas Price是1wei。
  • Gas Limit:字面理解就是Gas的限制,限制是必要的,沒有限制就沒有約束。這個Gas Limit是有兩個意思的。首先針對單個交易,那麼這個表示交易的發起者他願意支付最多是多少Gas,這個交易發起者在發起交易的時候需要設置好。還有一個是針對區塊的Gas Limit,一個單獨的區塊也有Gas的限制。

假設幾個場景來說明Gas的使用

  • 用戶設置Gas Limit,那麼在交易過程中,如果你的實際消耗的Gas used < Gas Limit,那麼礦工只會收取你實際消耗的Gas used。在交易結束後返回 Gas Limit-Gas Used。
  • 用戶設置Gas Limit,那麼交易過程中,如果你的實際消耗的Gas used > Gas Limit,那麼礦工肯定發現你的Gas不足,這個交易就無法執行完成,這個之後會回滾到執行之前的狀態,這個時候礦工會收取Gas Price*Gas Limit。
  • 區塊的Gas Limit,區塊中有一個Gas上限,收納的交易會出現不同的用戶指定的Gas Limit。那麼礦工就會根據區塊限制的Gas Limit來選擇,“合理”選擇打包交易。

具體交易

以太坊上交易可以是簡單的以太幣的轉移,同時也可以是智能合約的代碼消息。列個表格看下交易的具體內容:

代碼內容from交易發起者的地址、不能為空,源頭都沒有不合理。to交易接收者的地址(這個可以為空,空的時候就表示是一個合約的創建)value轉移的以太幣數量data數據字段。這個字段存在的時候表示的是,交易是一個創建或者是一個調用智能合約的交易Gas Limit字面理解就是Gas的限制,限制是必要的,沒有限制就沒有約束。這個Gas Limit是有兩個意思的。首先針對單個交易,那麼這個表示交易的發起者他願意支付最多是多少Gas,這個交易發起者在發起交易的時候需要設置好。還有一個是針對區塊的Gas Limit,一個單獨的區塊也有Gas的限制。Gas Price一個Gas Price就是單價,那麼你的交易費用=Gas*Gas Price,然後以以太幣來ether來支出。以太坊默認的Gas Price是1wei。nonce用於區別用戶發出交易的標識。hash交易ID,是由上述的信息生成的一個hash值r、s、v交易簽名的三部分,交易發起者的私鑰對hash簽名生成。

交易分三種類型

  • 轉賬:簡單明瞭的以太坊上的以太幣的轉移,就和比特幣類似,A向B轉移一定數量的以太幣。這種交易包含:交易發起者、接收者、value的數量,其餘類似Gas Limit、hash、nonce都會默認生成。所以你會看到一段代碼:
web3.eth.sendTransaction({ from: "交易發起者地址", to:“交易接收者地址”, value: 數量});
  • 智能合約創建:創建智能合約就是把智能合約部署到區塊鏈上,那麼這個時候to是一個空的字段。data字段則是初始化合約的代碼。所以看到代碼:
web3.eth.sendTransaction({ from: "交易發起者地址",  data: "contract binary code"});
  • 智能合約執行:合約創建部署在區塊鏈上,那麼執行就是會加上to字段到要智能合約執行的地址,然後data字段來指定調用的方法和參數的傳遞,所以看到代碼:
web3.eth.sendTransaction({ from: "交易發起者地址", to:“合約執行者地址”, data:“調用的方法和參數的傳遞”});

以上大致就是交易的類型。


消息

合約之間可以發生“消息”,消息是虛擬對象,不會序列化,存在於以太坊的執行環境中,消息一般包括如下:

  • 發送者
  • 接收者
  • 以太幣數量
  • 可選數據字段
  • 一個startgas

消息類似交易,但是交易是由一個合約產生,在以太坊環境中,但執行某些代碼的合約的時候,在call函數時候,會產生並執行一個消息。消息觸發接收方賬戶運行代碼,理解為合約之間的互相作用。

狀態函數

以太坊中轉移狀態,需要有相關驗證來保證。

  • 檢查交易、簽名是否合法,檢查Gas餘額是否足夠。
  • 交易過程中,賬戶轉移以太幣,那麼接收者賬戶檢查,如果不存在就創建,如果是一個合約,那麼運行合約代碼,正常完成或者等待Gas消耗完。
  • 轉移過程過程中如果Gas消耗完,或者發送者沒有足夠的餘額,那麼就認為轉移失敗,回覆支付費用外的狀態。
  • 執行完成,退還相關剩餘Gas。

舉例

1.交易發生,那麼檢查格式有效性。

2.計算餘額,發送者有足夠支付Gas的以太幣,那麼扣除發送的數值。

3.初始化,計算交易的字節長度,計算相應的Gas。

4.發送者賬戶減去相應發送的金額,或添加至合約賬戶。(如果沒有合約,那麼就是外部賬戶之間的直接交易)

5.運行合約代碼,計算Gas總的消耗,減去計算餘額。

6.返回Gas餘額給發送者。

7.返回結果正常狀態。

以太坊挖礦

以太坊挖礦者在區塊鏈狀態中獲取隨機數據,計算一些從區塊鏈最後的N個區塊中隨機選擇的交易,然後返回結果散列。

先來看看以太坊的挖礦流程:

  • 每一個區塊中,通過區塊頭來生成一個seed,這個seed稱為種子,種子只和當前的區塊有關。
  • 種子產生一個16MB的偽隨機緩存。
  • 基於上述的緩存,那麼再生成一個1GB的DAG數據集。緩存和數據集存在依賴關係,一般來說數據集依賴緩存的某些元素,那麼簡單來說的話,就是隻要有緩存,即可計算出數據集DAG中指定位置的元素。
  • 礦工所做的事情,就是在數據集DAG中隨機去選擇元素,且對其進行散列的一個過程。就個比特幣中區尋找nonce一樣的模式。
  • 那麼對比比特幣的挖礦,以太坊目前只需要驗證者花費一定數量的緩存即可,驗證指定元素的散列是不是小於某個散列值。

緩存和數據集DAG每增加30000個區塊更新一次,故礦工的精力應該是在讀取數據集上而不是去改變。

這種方式的優點,以太坊中的智能合約會有任何種類的計算,這樣ASIC就是一個提供計算的的專門的集成電路。就類似一個全球計算機的CPU。然後挖礦中要求保存全節點完整的區塊鏈。

以太坊在計劃過度到POS機制,那麼以太坊的POS機制先用V神的一段話來說明:POS協議中,每個人都是“礦工”,因此,除非他們選擇通過放棄以太幣來違反規則,否則每個人都必須承擔確認和驗證交易的責任,從本質上來說,這才是去中心化的管理模式,能夠提高利益相關者在網絡中的參與度。

POS有兩種模式:一種是POS、一種是BFT(Byzantine fault tolerant)風格的POS。

POS:基於鏈的POS,那麼在每個時間階段從驗證者集中選擇一個驗證者,給與區塊創建的權力,但必須要求驗證者要指向最多的塊,最長鏈上。

BFT-POS:分配給驗證者一定的權利,那麼他們通過提出塊生成,對提出塊進行投票。就是一個投票機制,每一輪中對一個新塊進行投票,在線的驗證者最後商量塊的生成添加,且這個意見結果不可改變。

當然以太坊的POS機制還是帶有懲罰機制。

以太坊的casper:區塊鏈中難免會出現相互競爭的鏈,那麼為了保證大多數驗證者都在主鏈上去生成區塊,那麼必須要有一個機制來保證,之前的POS機制是沒有懲罰的,一旦出現攻擊者,那麼區塊鏈就存在可能無法共識,甚至沒有出現攻擊者,也有可能因為準主鏈的選擇而會出現分歧。那麼假設在驗證在不同的區塊鏈準主鏈上,在事後的一個時間節點對驗證錯誤行的記錄行為包含在區塊鏈中並給與一定的懲罰,或者直接懲罰驗證者的在錯鏈上出塊的行為,casper採用抵押一定代幣的驗證人,那麼這些驗證人去投票,最後根據投票的結果形成大多數人的意見,對之前投票的人有效用戶給與押金退還且給予獎勵,對那些攻擊或者出錯用戶將沒收押金。

以太幣來源

那麼以太幣的來源包括以下幾部分:

  • 礦前獎勵:預付款給與貢獻者6000萬個以太幣
  • 區塊的獎勵:目前挖出一個區塊獎勵5個以太幣給礦工。
  • 叔塊獎勵:這個和比特幣不同,礦工在挖出一個區塊後,但是並不是在主鏈上,那麼這個區塊叫做叔區。如果這個叔區塊在後續挖礦中作為叔區塊被引用了,那麼挖出這個區塊的礦工獲得7/8的區塊獎勵,也就是4.375個以太幣,且另外引用這個區塊的礦工獲得0.15個以太幣,注意,這裡的引用最多兩個。

比特幣的總量是2100萬個,那麼以太幣也不是無限生成的,每年以太幣發行1800萬。之前筆者文章中有提到過,這個數字貨幣因為密鑰的丟失,所以每年的發行和意外的丟失會達到一個動態的平衡。並不是你看官方數據有多少就真正有多少在流通,這個應該能理解。

以太坊在不久將來會採用casper的機制,這個和目前的GHOST機制不一樣。具體的機制還待看。

礦工角度來看

從礦工的角度來看待以太幣,那麼就分為三塊:

  • 挖礦的獎勵,這個還是5個以太幣。(固定收益)
  • 交易的手續費,之前就有人一直在問萬一哪天比特幣2100萬挖完之後,挖礦如何獲得收益,那麼交易費就是其中的一項收益,以太坊上交易都會帶上交易費用,那麼這個也就是礦工的一部分所得。(動態收益)
  • 叔區塊收益,上文就提到過的,這個區塊如果有叔區塊,那麼從叔區塊中獲得1/32個以太幣也就是0.15個以太幣的收益。且每個區塊至多引用兩個叔區塊,被引用過的區塊不能再被引用。(動態收益)

以太幣的單位:

基本單位為wei,下表具體是各個比例:

單位維度個數 (wei)wei1 wei1000Kwei1e3 wei1000000Mwei1e6 wei1000000000Gwei1e9 wei1000000000000microether1e12 wei10000000000000000milliether1e15 wei10000000000000000000ether1e18 wei10000000000000000000000

叔區塊獎勵

回過頭感覺有必要再說下叔區塊的獎勵:

叔區塊顧名思義是區塊的父區塊的兄弟區塊。那麼區塊鏈只有一條主鏈,故叔區塊不在主鏈上,導致叔區塊的原因,由於是網絡的延遲沒有同步,那麼一個叔區塊如果引用在有效的主鏈上,挖出叔區塊的礦工獲得4.375個以太幣(區塊獎勵的7/8)。上文說到叔區塊的引用獲得獎勵,那麼這個獎勵對挖到叔區塊的礦工也是有一個間隔層數的關係。具體如下:

間隔的層數獲取的比例以太幣

17/84.37526/83.7535/83.12544/82.553/81.87562/81.25

以太坊-賬戶交易消息挖礦以太幣



分享到:


相關文章: