以太幣(Ethereum)官網(wǎng)、錢包、礦池及交易平臺全方位介紹
以太坊的目的是基于腳本、競爭幣和鏈上元協(xié)議(on-chain meta-protocol)概念進(jìn)行整合和提高,使得開發(fā)者能夠創(chuàng)建任意的基于共識的、可擴(kuò)展的、標(biāo)準(zhǔn)化的、特性完備的、易于開發(fā)的和協(xié)同的應(yīng)用。以太坊通過建立終極的抽象的基礎(chǔ)層-內(nèi)置有圖靈完備編程語言的區(qū)塊鏈-使得任何人都能夠創(chuàng)建合約和去中心化應(yīng)用并在其中設(shè)立他們自由定義的所有權(quán)規(guī)則、交易方式和狀態(tài)轉(zhuǎn)換函數(shù)。域名幣的主體框架只需要兩行代碼就可以實(shí)現(xiàn),諸如貨幣和信譽(yù)系統(tǒng)等其它協(xié)議只需要不到二十行代碼就可以實(shí)現(xiàn)。智能合約-包含價(jià)值而且只有滿足某些條件才能打開的加密箱子-也能在我們的平臺上創(chuàng)建,并且因?yàn)閳D靈完備性、價(jià)值知曉(value-awareness)、區(qū)塊鏈知曉(blockchain-awareness)和多狀態(tài)所增加的力量而比比特幣腳本所能提供的智能合約強(qiáng)大得多。
以太坊賬戶
在以太坊系統(tǒng)中,狀態(tài)是由被稱為“賬戶”(每個(gè)賬戶由一個(gè)20字節(jié)的地址)的對象和在兩個(gè)賬戶之間轉(zhuǎn)移價(jià)值和信息的狀態(tài)轉(zhuǎn)換構(gòu)成的。以太坊的賬戶包含四個(gè)部分:
隨機(jī)數(shù),用于確定每筆交易只能被處理一次的計(jì)數(shù)器
賬戶目前的以太幣余額
賬戶的合約代碼,如果有的話
賬戶的存儲(默認(rèn)為空)
以太幣(Ether)是以太坊內(nèi)部的主要加密燃料,用于支付交易費(fèi)用。一般而言,以太坊有兩種類型的賬戶:外部所有的賬戶(由私鑰控制的)和合約賬戶(由合約代碼控制)。外部所有的賬戶沒有代碼,人們可以通過創(chuàng)建和簽名一筆交易從一個(gè)外部賬戶發(fā)送消息。每當(dāng)合約賬戶收到一條消息,合約內(nèi)部的代碼就會被激活,允許它對內(nèi)部存儲進(jìn)行讀取和寫入,和發(fā)送其它消息或者創(chuàng)建合約。
消息和交易
以太坊的消息在某種程度上類似于比特幣的交易,但是兩者之間存在三點(diǎn)重要的不同。第一,以太坊的消息可以由外部實(shí)體或者合約創(chuàng)建,然而比特幣的交易只能從外部創(chuàng)建。第二,以太坊消息可以選擇包含數(shù)據(jù)。第三,如果以太坊消息的接受者是合約賬戶,可以選擇進(jìn)行回應(yīng),這意味著以太坊消息也包含函數(shù)概念。
以太坊中“交易”是指存儲從外部賬戶發(fā)出的消息的簽名數(shù)據(jù)包。交易包含消息的接收者、用于確認(rèn)發(fā)送者的簽名、以太幣賬戶余額、要發(fā)送的數(shù)據(jù)和兩個(gè)被稱為STARTGAS和GASPRICE的數(shù)值。為了防止代碼的指數(shù)型爆炸和無限循環(huán),每筆交易需要對執(zhí)行代碼所引發(fā)的計(jì)算步驟-包括初始消息和所有執(zhí)行中引發(fā)的消息-做出限制。STARTGAS就是限制,GASPRICE是每一計(jì)算步驟需要支付礦工的費(fèi)用。如果執(zhí)行交易的過程中,“用完了瓦斯”,所有的狀態(tài)改變恢復(fù)原狀態(tài),但是已經(jīng)支付的交易費(fèi)用不可收回了。如果執(zhí)行交易中止時(shí)還剩余瓦斯,那么這些瓦斯將退還給發(fā)送者。創(chuàng)建合約有單獨(dú)的交易類型和相應(yīng)的消息類型;合約的地址是基于賬號隨機(jī)數(shù)和交易數(shù)據(jù)的哈希計(jì)算出來的。
消息機(jī)制的一個(gè)重要后果是以太坊的“頭等公民”財(cái)產(chǎn)-合約與外部賬戶擁有同樣權(quán)利,包括發(fā)送消息和創(chuàng)建其它合約的權(quán)利。這使得合約可以同時(shí)充當(dāng)多個(gè)不同的角色,例如,用戶可以使去中心化組織(一個(gè)合約)的一個(gè)成員成為一個(gè)中介賬戶(另一個(gè)合約),為一個(gè)偏執(zhí)的使用定制的基于量子證明的蘭波特簽名(第三個(gè)合約)的個(gè)人和一個(gè)自身使用由五個(gè)私鑰保證安全的賬戶(第四個(gè)合約)的共同簽名實(shí)體提供居間服務(wù)。以太坊平臺的強(qiáng)大之處在于去中心化的組織和代理合約不需要關(guān)心合約的每一參與方是什么類型的賬戶。
以太坊狀態(tài)轉(zhuǎn)換函數(shù)
以太坊的狀態(tài)轉(zhuǎn)換函數(shù):APPLY(S,TX) -> S',可以定義如下:
檢查交易的格式是否正確(即有正確數(shù)值)、簽名是否有效和隨機(jī)數(shù)是否與發(fā)送者賬戶的隨機(jī)數(shù)匹配。如否,返回錯誤。
計(jì)算交易費(fèi)用:fee=STARTGAS * GASPRICE,并從簽名中確定發(fā)送者的地址。從發(fā)送者的賬戶中減去交易費(fèi)用和增加發(fā)送者的隨機(jī)數(shù)。如果賬戶余額不足,返回錯誤。
設(shè)定初值GAS = STARTGAS,并根據(jù)交易中的字節(jié)數(shù)減去一定量的瓦斯值。
從發(fā)送者的賬戶轉(zhuǎn)移價(jià)值到接收者賬戶。如果接收賬戶還不存在,創(chuàng)建此賬戶。如果接收賬戶是一個(gè)合約,運(yùn)行合約的代碼,直到代碼運(yùn)行結(jié)束或者瓦斯用完。
如果因?yàn)榘l(fā)送者賬戶沒有足夠的錢或者代碼執(zhí)行耗盡瓦斯導(dǎo)致價(jià)值轉(zhuǎn)移失敗,恢復(fù)原來的狀態(tài),但是還需要支付交易費(fèi)用,交易費(fèi)用加至礦工賬戶。
否則,將所有剩余的瓦斯歸還給發(fā)送者,消耗掉的瓦斯作為交易費(fèi)用發(fā)送給礦工。 例如,假設(shè)合約的代碼如下:
if !self.storage[calldataload(0)]: self.storage[calldataload(0)] = calldataload(32)
需要注意的是,在現(xiàn)實(shí)中合約代碼是用底層以太坊虛擬機(jī)(EVM)代碼寫成的。上面的合約是用我們的高級語言Serpent語言寫成的,它可以被編譯成EVM代碼。假設(shè)合約存儲器開始時(shí)是空的,一個(gè)值為10以太,瓦斯為2000,瓦斯價(jià)格為0.001以太并且64字節(jié)數(shù)據(jù),第一個(gè)三十二字節(jié)的快代表號碼2和第二個(gè)代表詞CHARLIE。的交易發(fā)送后,狀態(tài)轉(zhuǎn)換函數(shù)的處理過程如下:
檢查交易是否有效、格式是否正確。
檢查交易發(fā)送者至少有2000*0.001=2個(gè)以太幣。如果有,從發(fā)送者賬戶中減去2個(gè)以太幣。
初始設(shè)定gas=2000,假設(shè)交易長為170字節(jié),每字節(jié)的費(fèi)用是5,減去850,所以還剩1150。
從發(fā)送者賬戶減去10個(gè)以太幣,為合約賬戶增加10個(gè)以太幣。
運(yùn)行代碼。在這個(gè)合約中,運(yùn)行代碼很簡單:它檢查合約存儲器索引為2處是否已使用,注意到它未被使用,然后將其值置為CHARLIE。假設(shè)這消耗了187單位的瓦斯,于是剩余的瓦斯為1150 - 187 = 963。 6. 向發(fā)送者的賬戶增加963*0.001=0.963個(gè)以太幣,返回最終狀態(tài)。 如果沒有合約接收交易,那么所有的交易費(fèi)用就等于GASPRICE乘以交易的字節(jié)長度,交易的數(shù)據(jù)就與交易費(fèi)用無關(guān)了。另外,需要注意的是,合約發(fā)起的消息可以對它們產(chǎn)生的計(jì)算分配瓦斯限額,如果子計(jì)算的瓦斯用完了,它只恢復(fù)到消息發(fā)出時(shí)的狀態(tài)。因此,就像交易一樣,合約也可以通過對它產(chǎn)生的子計(jì)算設(shè)置嚴(yán)格的限制,保護(hù)它們的計(jì)算資源。
代碼執(zhí)行
以太坊合約的代碼使用低級的基于堆棧的字節(jié)碼的語言寫成的,被稱為“以太坊虛擬機(jī)代碼”或者“EVM代碼”。代碼由一系列字節(jié)構(gòu)成,每一個(gè)字節(jié)代表一種操作。一般而言,代碼執(zhí)行是無限循環(huán),程序計(jì)數(shù)器每增加一(初始值為零)就執(zhí)行一次操作,直到代碼執(zhí)行完畢或者遇到錯誤,STOP或者RETURN指令。操作可以訪問三種存儲數(shù)據(jù)的空間:
堆棧,一種后進(jìn)先出的數(shù)據(jù)存儲,32字節(jié)的數(shù)值可以入棧,出棧。
內(nèi)存,可無限擴(kuò)展的字節(jié)隊(duì)列。
合約的長期存儲,一個(gè)秘鑰/數(shù)值的存儲,其中秘鑰和數(shù)值都是32字節(jié)大小,與計(jì)算結(jié)束即重置的堆棧和內(nèi)存不同,存儲內(nèi)容將長期保持。
代碼可以象訪問區(qū)塊頭數(shù)據(jù)一樣訪問數(shù)值,發(fā)送者和接受到的消息中的數(shù)據(jù),代碼還可以返回?cái)?shù)據(jù)的字節(jié)隊(duì)列作為輸出。
EVM代碼的正式執(zhí)行模型令人驚訝地簡單。當(dāng)以太坊虛擬機(jī)運(yùn)行時(shí),它的完整的計(jì)算狀態(tài)可以由元組(block_state, transaction, message, code, memory, stack, pc, gas)來定義,這里block_state是包含所有賬戶余額和存儲的全局狀態(tài)。每輪執(zhí)行時(shí),通過調(diào)出代碼的第pc(程序計(jì)數(shù)器)個(gè)字節(jié),當(dāng)前指令被找到,每個(gè)指令都有定義自己如何影響元組。例如,ADD將兩個(gè)元素出棧并將它們的和入棧,將gas(瓦斯)減一并將pc加一,SSTORE將頂部的兩個(gè)元素出棧并將第二個(gè)元素插入到由第一個(gè)元素定義的合約存儲位置,同樣減少最多200的gas值并將pc加一,雖然有許多方法通過即時(shí)編譯去優(yōu)化以太坊,但以太坊的基礎(chǔ)性的實(shí)施可以用幾百行代碼實(shí)現(xiàn)。
區(qū)塊鏈和挖礦
雖然有一些不同,但以太坊的區(qū)塊鏈在很多方面類似于比特幣區(qū)塊鏈。它們的區(qū)塊鏈架構(gòu)的不同在于,以太坊區(qū)塊不僅包含交易記錄和最近的狀態(tài),還包含區(qū)塊序號和難度值。以太坊中的區(qū)塊確認(rèn)算法如下:
檢查區(qū)塊引用的上一個(gè)區(qū)塊是否存在和有效。
檢查區(qū)塊的時(shí)間戳是否比引用的上一個(gè)區(qū)塊大,而且小于15分鐘。
檢查區(qū)塊序號、難度值、 交易根,叔根和瓦斯限額(許多以太坊特有的底層概念)是否有效。
檢查區(qū)塊的工作量證明是否有效。
將S[0]賦值為上一個(gè)區(qū)塊的STATE_ROOT。
將TX賦值為區(qū)塊的交易列表,一共有n筆交易。對于屬于0......n-1的i,進(jìn)行狀態(tài)轉(zhuǎn)換S[i+1] = APPLY(S[i],TX[i])。如果任何一個(gè)轉(zhuǎn)換發(fā)生錯誤,或者程序執(zhí)行到此處所花費(fèi)的瓦斯(gas)超過了GASLIMIT,返回錯誤。
用S[n]給S_FINAL賦值, 向礦工支付區(qū)塊獎勵。 8 檢查S-FINAL是否與STATE_ROOT相同。如果相同,區(qū)塊是有效的。否則,區(qū)塊是無效的。
這一確認(rèn)方法乍看起來似乎效率很低,因?yàn)樗枰鎯γ總€(gè)區(qū)塊的所有狀態(tài),但是事實(shí)上以太坊的確認(rèn)效率可以與比特幣相提并論。原因是狀態(tài)存儲在樹結(jié)構(gòu)中(tree structure),每增加一個(gè)區(qū)塊只需要改變樹結(jié)構(gòu)的一小部分。因此,一般而言,兩個(gè)相鄰的區(qū)塊的樹結(jié)構(gòu)的大部分應(yīng)該是相同的,因此存儲一次數(shù)據(jù),可以利用指針(即子樹哈希)引用兩次。一種被稱為“帕特里夏樹”(“Patricia Tree”)的樹結(jié)構(gòu)可以實(shí)現(xiàn)這一點(diǎn),其中包括了對默克爾樹概念的修改,不僅允許改變節(jié)點(diǎn),而且還可以插入和刪除節(jié)點(diǎn)。另外,因?yàn)樗械臓顟B(tài)信息是最后一個(gè)區(qū)塊的一部分,所以沒有必要存儲全部的區(qū)塊歷史-這一方法如果能夠可以應(yīng)用到比特幣系統(tǒng)中,經(jīng)計(jì)算可以對存儲空間有10-20倍的節(jié)省。
ETH官網(wǎng):https://www.ethereum.org/
ETH錢包下載:https://geth.ethereum.org/downloads/
交易平臺:http://www.qukuaiwang.com.cn/pingtai.html(找適合自己的)
礦池:https://www.bw.com/
https://www.f2pool.com/
https://www.antpool.com/