以太坊的主要工作原理就是接受帳戶發出的交易,更新它們的狀態,然後維持該狀態,直到另外的交易更新它們為止。在以太坊上,整個交易接受、執行和寫入的流程分成兩個階段。以太坊接受交易和交易執行並寫入帳本之間是解耦的。對於去中心化和分佈式架構來說,這種解耦才能夠有效地支撐系統正常運行。
區塊鏈主要有以下三種用途。
・信任:區塊鏈可以用於創建去中心化應用,實現數據由多人集體控制,其中的任何一個人都沒有權力去更改或刪除以前的記錄。即使有人確實做到了,他產生的數據也不會被其他參與者接受。
・自治性:對於區塊鏈上的應用來說,沒有唯一的所有者。由於沒有唯一的所有者,也就沒有人能夠單獨控制它,但是每個人卻都可以通過它的行為來參與治理過程,這就有利於建立一個不能被操控或不易誘發腐敗的解決方案。
・去中介化:基於區塊鏈的應用能夠消除現有流程的中間環節。例如在車輛登記、駕照發放等場景中,一般會存在一個中間角色,它承擔著車輛登記和駕照發放的職責。如果基於區塊鏈來設計流程,那麼這個中間角色就沒有存在的必要了,因為區塊鏈上的數據在被確認後,駕照就會自動簽發,車輛就會被自動登記。區塊鏈將開啟一個新的時代,很多業務不再需要中間的權威機構進行背書了。
密碼學是一門科學,它將易懂的、直白的內容轉換成秘密的、隱藏的、無意義的內容,同樣道理,解密就是反過來操作。加密技術有助於傳輸和保存數據,而且不能輕易地解密。
在計算機領域有兩種類型的加密技術:對稱加密和非對稱加密。
・對稱加密和解密:對稱加密指的是在加密和解密過程中使用同一個密鑰。如果使用這種技術交換信息,那麼,這意味著很多人將使用同一個密鑰。
・非對稱加密和解密:在加密和解密過程中使用兩個密鑰。任一密鑰都可以用於加密和解密。使用公鑰加密的信息,可以使用私鑰解密。使用私鑰加密的信息,可以使用公鑰解密。下面用一個例子來說明,Tom 使用 Alice 的公鑰去加密一個信息,然後發送給 Alice,然後 Alice 可以使用她的私鑰解密並從中提取原始信息。簡單地說,使用 Alice 的公鑰加密的信息只能被她自己獨有的私鑰解密,這就是非對稱加密的常見應用場景。非對稱加密還有一個用途就是後面會介紹的數字簽名。
散列是將輸入的數據轉換成一個固定長度的隨機字符串(散列值)的過程,但是不能從結果反向生成或識別出原始數據,因此,散列也被稱為數據指紋。幾乎不可能基於其散列值導出輸入數據哪怕原始數據發生了一點點的變化,也將產生完全不同的散列值,這樣就確保了沒有人敢在原始數據上做手腳。散列還有另外一個特徵:雖然輸入的字符串數據可能長短不同,但產生的散列值長度是固定的。例如,使用 SHA256 散列算法,不論輸入數據的長度大小如何,總會產生一個 256 個字節的散列值。當數據量很大時,這一點就非常有用了,它總能產生一個 256 個字節的散列值,這樣可以保存下來作為證據。以太坊在很多地方使用了散列技術,它會對每一筆交易進行散列,會對兩個交易的散列值進行再次散列,最終為同一区块內的每個交易產生一個根散列值。
散列還有一個重要特徵,就是從數學上來看,兩個不同的輸入數據不會產生同一個散列值。同樣的道理,從計算上和數學上來說都不可能由散列值反推出輸入值。
以太坊使用 Keccak256 作為它的散列算法。
下面的截圖顯示了散列的一個例子。輸入的 Ritesh Modi 產生了一個散列值,如下圖所示:
即使對輸入數據進行輕微的變化 [1],也將產生一個完全不同的散列值,如下圖所示:
[1] 這裡兩個單詞之間去掉了空格。—— 譯者注
非對稱加密,它的一個重要應用就是在數字簽名創建和驗證時使用非對稱密鑰。數字簽名類似於一個人在紙上手寫的簽名。與手寫簽名的作用一樣,數字簽名有助於識別一個人,還有助於確保信息在傳遞過程中不被篡改。讓我們舉個例子來理解數字簽名。
Alice 準備給 Tom 發送一條信息。那麼問題來了,Tom 如何確保收到的信息是由 Alice 發出來的,如何確保信息在傳遞過程中沒有被篡改過?解決方案就是不能發送原始的信息 / 交易,Alice 首先需要取得發送的信息的散列值,然後用她的私鑰對散列值進行加密,最後,她把這個剛產生的數字簽名附加在散列值後發送給 Tom。Tom 收到信息後,他使用 Alice 的公鑰提取出數字簽名並解密,找到原始散列值。同時,他從實際接收到的信息中提取散列值,並對兩個散列值進行比較,如果兩個散列值一致,那麼說明信息在傳遞過程中沒有被篡改過。
數字簽名通常用於資產或加密數字貨幣(例如以太幣)的所有者對交易進行簽名確認。
以太幣是以太坊上的貨幣。以太坊的每次活動都需要消耗以太幣作為費用,成功產生區塊的礦工也會獲得以太幣作為獎勵,以太幣通過交易平台很容易兌換成法定貨幣。
以太幣採用十進制的計量體系,其最小的單位是 wei。下面列出了一些計量單位,可以在網站https://github.com/ethereum/web3.js/blob/0.15.0/lib/utils/utils.js#L40 上查到更多信息。
在以太坊上執行任務需要消耗以太幣。由於以太幣在交易所進行公開買賣,因此它的價格會上下波動。在支付費用時,如果直接使用以太幣,那麼,由於其價格不固定,同一個服務所花費的成本可能會忽高忽低。這樣的話,人們會選擇當以太幣價格處於低谷時再去執行交易。對於一個平台來說,出現這種情況並不理想 [1]。gas(燃料)的作用就是緩解這個問題,它是以太坊當前的內部貨幣。使用 gas 進行計價,用戶能夠預先確定一個交易的執行成本,這就是 gas 成本。採取這種方法,當以太幣價格暴漲時,gas 價格可以適當調低,當以太幣價格暴跌時,gas 價格可以適當提高。例如,使用智能合約裡面的函數去修改一個字符,這個交易將會消耗一定的 gas,由於 gas 的使用成本已經事先確定,因此用戶就可以有規律地執行智能合約了。
[1] 會形成峰谷效應,價格低的時候,執行量過大,平台會超負荷運行。—— 譯者注
區塊鏈是一種包含多個組件的體系結構,區塊鏈獨特的地方在於這些組件的功能和相互作用。重要的組件包括:EVM(Ethereum Virtual Machine 以太坊虛擬機)、礦工、區塊、交易、共識算法、帳戶、智能合約、挖礦、以太幣和 gas。在本章中,我們將介紹這些組件。
一個區塊鏈網絡是由大量的節點構成的,其中一部分是屬於礦工的挖礦節點,另一部分節點不挖礦但會幫助執行智能合約和交易。這些節點統稱為 EVM。網絡上的各個節點之間互相連接,節點之間通過 P2P 協議進行通信,默認情況下使用 30303 端口。
每個節點都維護著一個帳本的實例(副本),包含鏈上的全部區塊。由於網絡上存在大量礦工節點,為了避免節點之間的區塊數據存在差異,這些節點會持續同步區塊,確保帳本數據一致。
在後續的章節中,我們將會更詳細地討論帳本、區塊和交易。
智能合約也運行在 EVM 上。智能合約通過編寫個性化的業務功能擴展以太坊的能力。智能合約執行的時候,是作為交易的一部分按照前面提到的挖礦流程進行的。
在網絡上有帳戶的用戶可以發送信息來完成帳戶之間的以太幣交易,或者發送消息來調用合約中的一個函數。對於以太坊來說,這兩種方式實質上都是交易。在交易確認和更改帳戶餘額時,帳戶所有人必須用私鑰對交易進行數字簽名,這樣才能確定發送者的身份。以太坊的結構如下圖所示。
在區塊鏈和以太坊中,每個區塊都連接著另外一個區塊。兩個區塊之間是一對父子的關係,並且是一對一的關係,這樣首尾相接就組成了一個鏈條。本章後面會講到區塊,在接下來這張圖中,我們用 3 個區塊(區塊 1、區塊 2、區塊 3)來示意。區塊 1 是區塊 2 的父區塊,區塊 2 是區塊 3 的父區塊。在每個區塊的頭部都存儲了父區塊的散列值,這樣就建立了父子關係。
區塊 2 在頭部存儲了區塊 1 的散列值,區塊 3 在頭部存儲了區塊 2 的散列值,那麼,問題來了,第一個區塊的父區塊是誰?以太坊有個創世區塊的概念,它就是第一個區塊。這個區塊是在鏈初次發起時自動創建的。你也可以這樣認為,整個鏈條是由創世區塊(通過 genesis.json 文件來生成)作為第一個區塊而開始啟動的,
知道區塊是互相連接在一起的,你可能想知道交易是如何與區塊綁定在一起的。在以太坊中,交易是存儲在區塊裡面的,交易在執行時需要消耗一定數量的 gas,由於每個區塊都有一個 gas 上限,待執行的交易消耗的 gas 總數不能超過上限,這樣可以避免將所有交易存儲在一個區塊裡面。當達到 gas 上限時,其他交易就不能再寫入這個區塊,此時,節點開始挖礦。
一個交易在產生散列值之後,就被存儲到區塊中,接著,挖礦程序會選取兩個交易的散列值進行再次散列,再產生一個新的散列值。很明顯,區塊裡面的所有交易最終會產生一個唯一的散列值,它就是 Merkle 根散列值,保存在區塊頭上。如果區塊裡面的任何一個交易發生了改變,這個交易的散列值也會隨之變化,最終會導致根交易散列值發生變化。當區塊的散列值發生變化後,由於子區塊保存了父區塊的散列值,因此,它的子區塊的散列值也需要隨之變化,這樣會引發連鎖反應,使得整個區塊鏈都要變化才行,因此,區塊鏈的不可篡改才成為可能。
節點就是計算機,它們之間通過 p2p 協議互相連接,組成了以太坊網絡。
以太坊有兩種類型的節點:
·EVM
・挖礦節點
需要注意的是,這種分類只是為了對概念進行細分,在大多數場景中,並沒有專門的 EVM,相反的是,所有的礦工節點都承擔了 EVM 的職能。
礦工的日常工作與財務會計很相似,會計的主要工作就是在財務帳本上記錄數據,同樣的道理,礦工的主要職責就是向以太坊寫入交易數據。驅動他這樣工作的原因是可以獲得獎勵,礦工的獎勵有兩種:第一種是向區塊鏈寫入區塊的獎勵,第二種是能夠獲得區塊內的交易所支付的 gas 費用。一般情況下,區塊鏈上存在很多礦工,它們之間互相競爭,然而,最終只有一個礦工能夠獲勝並向帳本寫入區塊,其他礦工則無權寫入。判斷礦工獲勝是通過破解一道難題的方式。在挖礦時,每個礦工需要解決的難題是一樣的,礦工們只能通過自己的機器計算能力去破解。第一個解決了這個難題的礦工會把含有交易的區塊寫入自己本地的帳本,然後發送區塊和 Nonce 值 [1] 給其他礦工進行確認,其他礦工接收區塊並驗證該答案是否正確,通過後,區塊就會被礦工寫入到自己的帳本中。在這個過程中,贏得挑戰的礦工也會得到 5 個以太幣的回報。每個節點都維護了一套以太坊帳本的副本,礦工的職責就是通過數據同步使得本地帳本處於最新的狀態,最終各個礦工之間的帳本實現了一致性。
礦工或者挖礦節點有三個重要的功能:
・挖礦或打包交易產生新的區塊並寫入到以太坊帳本
・向其他礦工發送最新的區塊,並通知他們接收
・接收其他礦工的區塊,並更新本地的帳本
挖礦節點指的是那些屬於礦工的節點,它們和 EVM 節點都是整個網絡的一部分。在某一時刻,礦工將產生新的區塊,然後從交易池中收集交易,打包到新創建的區塊中。最終,這個區塊被添加到區塊鏈上。
下面將解釋一些其他概念,如共識和破解難題。
[1] 破解的答案。—— 譯者注
網絡上的全部礦工而言,挖礦程序是相同的,它們需要做的就是按照程序中的規則不斷地執行挖礦任務。礦工一方面拼命計算程序以便挖到新的區塊,另外,也在時刻接侦聽交易池中新的交易,接收、驗證和轉發其他礦工的區塊。正如前面所說,首先礦工創建一個區塊,然後從交易池中收集交易並添加到區塊中,在添加之前,會檢查交易是否已經被其他礦工寫入到了區塊中,如果已經被寫入,就去掉它。
為了獲得挖礦獎勵,礦工需要添加自己的幣基(coinbase)交易(譯者注:區塊中第一筆交易是挖礦的回報交易),接著,產生區塊頭並執行下列步驟:
1. 礦工抓取兩個交易的散列值,進行再次散列並產生一個新的散列值,直到對所有交易完成散列後,將得到唯一的散列值,這就是根交易散列值或 Merkle 根交易散列值,它將被添加到區塊頭。
2. 礦工也需要確定上個區塊的散列值,因為它是當前區塊的父區塊,父區塊的散列值要保存在當前區塊頭中。
3. 礦工計算交易的 state 和 receipts 根散列值 [1],然後寫入區塊頭。
4.Nonce 和時間戳記錄到區塊頭。
5. 產生整個區塊(包括區塊頭和區塊體)的散列值。
6. 挖礦流程開始,礦工持續變換 Nonce 值,直到發現該散列值能夠解決難題為止,需要記住的是,對網絡上的礦工而言,執行過程是一樣的。
7. 很明顯,某一礦工最終能夠找到這個難題的答案,它會將結果發送給網絡上的其他礦工。其他礦工會先確認該答案是否正確,如果是正確的,將開始驗證每個交易,然後接受該區塊,並添加到他們的本地帳本中。
上面的整個挖礦流程,因為礦工提供了經過不斷計算而獲得了解題答案的證明,所以,被稱之為工作量證明(PoW)。另外,還有其他一些算法,如:權益證明(PoS)和權威證明(PoA),由於以太坊沒有用到這些算法,本書暫不展開討論。區塊頭和它的組成部分如下圖所示:
[1] 這裡的 state 和 receipts 指的是另外兩個 Merkle 樹。以太坊有三棵 Merkle 樹,即:交易 Merkle 樹,state Merkle 樹和收據 Merkle 樹。
帳戶是以太坊體系的主要組成部分。以太坊將交易保存到账本上的過程,其實就是帳戶之間進行交互的過程。以太坊有兩種類型的帳戶:外部帳戶和合約帳戶。每個帳戶默認有一個餘額屬性,可以查看該帳戶以太幣的當前餘額。
以太坊上的用戶所擁有的帳戶。在以太坊中,帳戶不能使用名稱來調用。當你在以太坊上創建一個外部帳戶時,會產生一對公鑰和私鑰。私鑰需要你保存在安全的地方,而公鑰就是你對帳戶持有所有權的證明。公鑰一般是 256 個字符,但是以太坊只使用前面 160 個字符來標識身份。
例如,Bob 在以太坊網絡上(無論是公開網絡還是私有網絡)新建一個帳戶,私鑰留給自己使用,而公鑰的前 160 位字符將成為它的身份標識,其他帳戶就可以向這個帳戶發送以太幣或者其他基於以太的加密貨幣。
外部帳戶能夠持有以太幣,但是不能執行任何代碼。它能夠與其他外部帳戶執行交易,也可以借助於智能合約中的函數執行交易。
交易是買方和賣方、供應商和消費者、提供方和消費方之間使用貨幣、加密數字貨幣或者其他資產換取對方的資產、產品或服務的協議。以太坊為交易順利執行提供了保障,下面是以太坊上支持的三種交易類型:
1. 從一個帳戶向另外一個帳戶發送以太幣:這個帳戶可能是外部帳戶或者合約帳戶。下面的場景都可能發生:
・在交易中,一個外部帳戶向另外一個外部帳戶發送以太幣
・在交易中,一個外部帳戶向一個合約帳戶發送以太幣
・在交易中,一個合約帳戶向另外一個合約帳戶發送以太幣
・在交易中,一個合約帳戶向一個外部帳戶發送以太幣
2. 智能合約部署:外部帳戶在 EVM 上部署合約是通過交易的方式實現的。
使用或借助合約內的函數:如果需要執行合約內的函數去改變一個狀態,就需要一個交易,如果執行函數沒有改變任何一個狀態,就不需要交易。
下面介紹與交易有關的一些重要屬性:
From 帳戶屬性說明了這個帳戶是交易的發起方,發送 gas 或以太幣。前面章節我們介紹過以太幣和 gas 的概念。From 帳戶可以是外部帳戶或合約帳戶。
To 帳戶屬性指的是接收以太幣或其他收益的帳戶,它可以是外部帳戶或合約帳戶。如果是部署合約的交易,則 To 字段為空。
Value 帳戶屬性指的是帳戶之間轉移的以太幣數量。Input 帳戶屬性指的是合約編譯後被部署在 EVM 上的字節碼。input 也用於保存有關智能合約函數帶參調用的信息。下圖展示了在典型的以太坊交易中使用智能合約函數的地方,從這個截圖上看,請注意 Input 字段中包含了帶有參數的函數調用。
BlockHash 帳戶屬性指的是該交易所屬的區塊的散列值。
BlockNumber 帳戶屬性指的是交易所屬的區塊序號。
Gas 帳戶屬性指的是交易的發送方支付的 gas 數量。
GasPrice 帳戶屬性指的是發送方支付的 gas 價格,以 wei 為單位(在本章前面介紹以太幣的地方,提到過 wei 的概念)。總的 gas 消耗 = gas 數量 * gas 價格。
Hash 帳戶屬性指的是交易的散列值。
Nonce 帳戶屬性指的是交易的編號,它由發送方在當前交易之前產生。
TransactionIndex 帳戶屬性指的是區塊中當前交易的流水號。
Value 帳戶屬性指的用 wei 計算的傳遞的以太的數量。
V、r 和 s 屬性指的是數字簽名和交易的簽名。
下面是以太坊上的一個常見的交易,外部帳戶向另外一個外部帳戶發送以太幣(注意這裡沒有使用 input 字段)。截圖的交易中轉移了 2 個以太幣,其中的 value 字段就是用 wei 來計量的。
外部帳戶之間轉移以太幣也可以使用下面的代碼來實現,它基於的是 web3 JavaScript 框架,本書後面會介紹。
下圖展示了部署了智能合約的交易,注意 input 字段中包含了合約編譯後的字節碼。
區塊是以太坊的一個重要概念。區塊是交易的容器,它由多個交易組成。因為受區塊的 gas 上限(後面我們會介紹 gas 上限)和區塊大小限制,每個區塊包含的交易數量並不相同。區塊連接在一起形成了區塊鏈,除了第一個區塊(也叫作創世區塊)沒有父區塊外,其他區塊都有一個父區塊,父區塊的散列值存儲在區塊頭上。
下圖顯示了區塊的結構:
區塊有很多屬性,為了便於掌握關鍵內容,下面只介紹一些重要的部分:
Difficulty 屬性指的是礦工為了挖到這個區塊而需要面對的計算難度。
GasLimit 屬性指的是區塊允許的 gas 總量上限。它決定了區塊中能包含多少個交易。
GasUsed 屬性指的是區塊中的交易實際消耗的 gas 數量。
Hash 屬性指的是這個區塊的散列值。
Nonce 屬性指的是一個數字,它是解決難題的答案。
Miner 屬性指的是礦工的帳戶,可以用 coinbase 或 etherbase 的地址。
Number 屬性指的是該區塊在區塊鏈上的序號。
ParentHash 屬性指的是父區塊的散列值。
ReceiptsRoot、stateRoot 和 TransactionsRoot 屬性指的是在前面的挖礦流程中提到的 merkle 樹。
Transactions 屬性指的是區塊中的交易組成的一個數組。
TotalDifficulty 屬性指的是區塊鏈的整體難度。
端到端的交易#
Sam 打算發送一個數字資產(如:美元)給 Mark。首先,Sam 新建了一個交易,裡面包括了 from、to、value 等字段數據,然後發送到以太網絡上,該交易並沒有立即寫入到账本中,而是暫存到交易池中。
挖礦節點新建了一個區塊,然後按照 gas 上限標準,從交易池中提取交易(Sam 的交易也將被提取),並添加到區塊中,網絡上的全體礦工都在執行相同的任務。
接下來,礦工們開始爭先恐後地去計算難題,在一段時間(或幾秒)後,獲勝者(第一個解決難題的人)會發出通知,聲稱他找到了答案,贏得了比賽,需要向區塊鏈寫入區塊,與此同時,獲勝者將答案添加到區塊上並發送給其他礦工。其他礦工收到通知後,首先驗證這個答案,一旦認定該答案確實有效,就立即停止自己的計算,接收這個包含了 Sam 的交易的區塊,然後添加到他們的本地帳本中。這樣下來,就在鏈上產生了一個新的區塊,它將一直跨越時間和空間而永久的存在下去。在這期間,雙方的帳戶餘額都會得到更新,最後,區塊被分發複製到網絡上的全部節點。
什麼是合約#
合約是經過雙方或多方同意,約定立即執行或在將來執行一項交易的法律文件。因為合約是法律文件,所以它具有強制性和可執行性。合約應用的場景很多,例如:一個人和保險公司簽訂合同購買健康險,一個人從另外一個人手裡購買一塊土地,一個公司出售股權給另外一家公司。
什麼是智能合約#
智能合約是按照用戶的需求編寫的代碼,並部署和運行在以太坊虛擬機上。智能合約是數字化的,它在代碼中固化了帳戶之間交易的規則。智能合約有利於通過原子化交易來實現數字資產的轉移,也可以用於存儲重要數據,這些數據可以用來記錄信息、事件、關係、餘額、以及現實世界中的合同中需要約定的信息。智能合約類似於面向對象的 class 類,因此,一個合約可以調用另外一個合約,就像我們可以在類對象之間進行互相調用和實例化。我們也可以這樣認為,智能合約就是由函數構成的小程序。你可以新建一個合約,借助合約裡面的函數去查看區塊鏈上的數據,以及按照一些規則去更新數據。
如何編寫智能合約#
彼特・托德(Peter Todd)是比特幣核心開發者之一。他總結了智能合約(Smart contract)的現狀,認為 “智能合約討論的結論是:沒有人理解智能合約究竟是什麼。如果我們要實施智能合約,應該需要預言機(oracles)”。
確實,要想闡明智能合約的理念和本質並非易事。
我們從智能合約理念的起源開始。“智能合約” 概念由計算機科學家、加密大師尼克・薩博(Nick Szabo)於 1993 年左右提出。1994 年他寫成了《智能合約》(Smart contracts)論文,是智能合約的開山之作。
尼克・薩博對智能合約的闡述以一個自動售貨機的例子開始。我們可以認為智能合約的原始祖先,是不起眼的自動售貨機。在經過潛在的、損失有限的評估後,自動售貨機使錢箱裡的錢遠遠少於破壞者付出的代價。售貨機根據顯示的商品價格收取投幣,通過一個簡單的機制形成了最初的計算機設計科學,並且有限自動、根據投幣金額傳遞變化和產品。自動售貨機是一種搬運合約:任何持有硬幣的人都可以與供應商交易。鎖定錢箱和其他安全機制保護售貨機儲藏的硬幣和貨物不被破壞,從而支撐在各種各樣的區域部署自動售貨機,並且產生盈利。
在自動售貨機概念的基礎上,尼克・薩博給出智能合約的定義如下:
“智能合約超越了自動售貨機中嵌入各種有價屬性的範疇,通過數字方式控制合約。智能合約涉及具有動態性、頻繁主動執行屬性的財產,且提供更好的觀察和驗證點,其中主動積極的措施必須絲毫不差。”
尼克・薩博告訴我們的是,智能合約本質上的抽象概念是在個人、機構和財產之間形成關係的一種公認工具,是一套形成關係和達成共識的協定。智能合約的條款(如抵押品、產權劃分等)可以嵌入到處理硬件和軟件中,以這樣的方式使違約成本非常昂貴(甚至令人望而卻步)。例如,為房屋而設計出的數字保障智能合約,根據智能合約設計策略,持續完善房屋抵押品協議以便其更充分地嵌入到處理合約條款中。根據合約條款,這些協議將使加密密鑰完全控制在具有操作屬性的人手中,而此人也將正当地擁有該房屋財產。最簡單地,為了防止偷竊,使用者需要完成正確的解鎖過程,否則房屋將切換至不可使用狀態,比如門禁失效和設施失效等。在傳統方式中,如果房屋被用作還貸,有一個令債權人頭痛的問題是很難查收賴賬的房屋,需要通過頻繁溝通才能收回房屋鑰匙等。為了解決這一問題,我們可以創建一個智能扣押權協議:如果物主不交費,智能合約調用扣押權協議,把房屋鑰匙的控制權交給銀行。該協議可能會比雇用追債人更便宜、更有效。
同時,尼克・薩博提出了智能合約的三要素:
①一把可以允許業主同時排除非法第三方的鎖;
②一個允許債權人秘密接入的後門;計算機設計科學,並且有限自動、根據投幣金額傳遞變化和產品。自動售貨機是一種搬運合約:任何持有硬幣的人都可以與供應商交易。鎖定錢箱和其他安全機制保護售貨機儲藏的硬幣和貨物不被破壞,從而支撐在各種各樣的區域部署自動售貨機,並且產生盈利。
在自動售貨機概念的基礎上,尼克・薩博給出智能合約的定義如下:
“智能合約超越了自動售貨機中嵌入各種有價屬性的範疇,通過數字方式控制合約。智能合約涉及具有動態性、頻繁主動執行屬性的財產,且提供更好的觀察和驗證點,其中主動積極的措施必須絲毫不差。”
尼克・薩博告訴我們的是,智能合約本質上的抽象概念是在個人、機構和財產之間形成關係的一種公認工具,是一套形成關係和達成共識的協定。智能合約的條款(如抵押品、產權劃分等)可以嵌入到處理硬件和軟件中,以這樣的方式使違約成本非常昂貴(甚至令人望而卻步)。例如,為房屋而設計出的數字保障智能合約,根據智能合約設計策略,持續完善房屋抵押品協議以便其更充分地嵌入到處理合約條款中。根據合約條款,這些協議將使加密密鑰完全控制在具有操作屬性的人手中,而此人也將正当地擁有該房屋財產。最簡單地,為了防止偷竊,使用者需要完成正確的解鎖過程,否則房屋將切換至不可使用狀態,比如門禁失效和設施失效等。在傳統方式中,如果房屋被用作還貸,有一個令債權人頭痛的問題是很難查收賴賬的房屋,需要通過頻繁溝通才能收回房屋鑰匙等。為了解決這一問題,我們可以創建一個智能扣押權協議:如果物主不交費,智能合約調用扣押權協議,把房屋鑰匙的控制權交給銀行。該協議可能會比雇用追債人更便宜、更有效。
同時,尼克・薩博提出了智能合約的三要素:
①一把可以允許業主同時排除非法第三方的鎖;
②一個允許債權人秘密接入的後門;
③後門只在違約且沒有付款的一段時間被打開;最後的電子支付完成後將永久地關閉後門。
從本質上講,這些智能合約的工作原理類似於計算機程序的 if-then 語句。智能合約以這種方式與真實世界的財產進行交互。當一個預先定義的條件被觸發時,智能合約就執行相應的合同條款。尼克・薩博關於智能合約的工作理論遲遲沒有實現,是因為缺乏天生能夠支持可編程合約的數字系統。如果金融機構仍然需要手動批准資產的轉移,那麼智能合約的目標就沒有實現。瑞波實驗室的市場和交易主管菲利・拉波波特(Phil Rapoport)說,“實現智能合約的一大障礙是現在計算機程序不能真正地觸發支付”。區塊鏈技術的出現和被廣泛使用,正在改變阻礙智能合約實現的現狀,從而使尼克・薩博的理念有了實現的機會。智能合約技術現在正建立在區塊鏈基礎之上,因為區塊鏈本身就是一個計算機程序,智能合約能夠與它進行交互,就像它能與其他程序進行交互一樣。
在已提出智能合約理念的基礎上,結合近幾年區塊鏈技術的不斷發展,我們將試圖給出對智能合約更為具體和詳細的闡述。
智能合約是一套以數字形式定義的承諾,承諾控制著數字資產並包含了合約參與者約定的權利和義務,由計算機系統自動執行。
承諾定義了智能合約的本質和目的。以一個銷售合約為例:賣家承諾發送貨物,買家承諾支付合理的貨款。數字形式意味著合約需要被寫入計算機可執行的代碼中,只要參與者達成協定,智能合約建立的權利和義務,就由一台計算機或者計算機網絡執行。
我們舉個簡單的例子,形象化地描述智能合約。
If Event_X_Happened:
Send (愛麗絲,1000$)
Else:
Send (鮑伯,1000$)
意思是:如果事件 X 發生,則合約給愛麗絲發送 1000 美元;否則,給鮑伯發送 1000 美元。
這就是最簡單的合約。
如圖所示是一個智能合約模型示意,其中各組成部分的定義如下。
①合約參與者:執行智能合約的相關參與者。
②合約資源集合:智能合約執行涉及的參與者資源,比如參與各方帳戶、擁有的數字財產等。
③自動狀態機:智能合約下一步執行的關鍵,包括當前資源狀態判斷、下一步合約事務執行選擇等。
④合約事務集合:智能合約的下一步動作或行為集合,控制著合約資產並對接收到的外界信息進行回應。
編寫智能合約的工具有很多種,如:Visual Studio。其中,最簡單和最快速的開發方法是使用基於瀏覽器的開發工具,例如:Remix。打開http://remix.ethereum.org 網頁就可以直接使用。Remix 是一個新名字,以前被叫做 browser-solidity。Remix 提供了豐富的 Solidity 集成開發環境,可以在瀏覽器上進行智能合約的創建、開發、部署和調試。合約維護有關的操作(如:創建、發布、調試)都可以在同一個環境下完成,而不需要切換到其他的窗口或頁面。
有些人不習慣使用 Remix 的在線版本。由於 Remix 是個開源工具,可以從 https//github.com/ethereum/browser-solidy 下載軟件包,經過編譯,Remix 就可以在本地使用。使用本地工具的另外一個好處是它能夠連接到你自己搭建的私有網絡,否則的話,你在網頁上編寫完代碼後,還需要把文件拷貝到本地,經過編譯後才能發布到私有網絡上。下面我們來逐步了解 Remix。
1. 打開 remix.ethereum.org 網址,在瀏覽器中默認打開一個智能合約。
如果你不需要,可以刪掉它。
2. 新建一個合約,選擇左邊菜單欄中的 +。
3. 對這個 Soldiy 文件進行命名,以.sol 作為後綴。輸入合約名字 HelloWorld,點擊 “OK”,就創建了一個空白合約,如下圖所示:
4. 在製作欄內的空白處,輸入下面這段代碼,就能創建你的第一個合約。
合約的細節會在第三章講解。現在,先簡單理解一下,你可以使用關鍵詞 contract 創建合約,聲明全局狀態變量和函數,保存合約為後綴名。是 sol 的文件。在下面的源代碼片段中,當 GetHelloWorld 函數調用 HelloWorld 合約時,將返回 Hello World 字符。
Remix 的右面是操作窗口,有很多標籤頁面:編譯、運行、設置、調試、分析和支持。這些操作用於對合約進行編譯、發布、調試和調用。調試標籤會把合約編譯成字節碼(以太坊能夠理解的代碼),這裡會顯示調試時出現的警告和錯誤信息,對於這些信息,你要足夠重視,解決這些信息會增強合約的健壯性。運行頁面與編寫合約頁面相比,你需要花費更多的時間。在 “環境” 選項中,由於 Remix 在瀏覽器中綁定了以太坊的運行環境,所以允許你使用 JavaScript 虛擬機對合約進行發布,Injected Web3 選項用於使用 Mist 和 MetaMask 工具(下一章會提到),Web3 Provider 選項是在本地使用 Remix 連接私有鏈時使用的。在本章的例子中,默認使用 JavaScript 虛擬機選項。在第三章介紹 Solidity 時,再討論剩下的選項。
5. 然而,發布合約最重要的操作就是使用新建按鈕,如下圖所示:
6. 點擊新建按鈕,就可以在瀏覽器中運行以太坊,在新建按鈕下面顯示了合約內的函數。由於例子中只有唯一的函數 GetHelloWorld,所以这里只有這一個選項。如下圖所示:
7. 點擊 GetHelloWorld 按鈕,就可以調用和執行這個函數。執行的結果顯示在 Remix 下面的欄位,如下圖所示:
恭喜!你的第一個合約已經創建、發布和執行成功了。如果你不喜歡直接敲代碼的話,本章中的 HelloWorld 合約代碼可以拷貝到 Remix 中直接使用。
Remix 讓發布過程變得簡單了,但是系統後台還是執行了很多程序。了解這些步驟有助於我們更好地掌控發布過程。
①自動化維度。智能合約可以自動判斷觸發條件,從而選擇相應的下一步事務;而傳統合約需要人工判斷觸發條件,在條件判斷準確性、及時性等方面均不如智能合約。
②主客觀維度。智能合約適合客觀性請求的場景,傳統合約適合主觀性請求的場景。智能合約中的約定、抵押及懲罰需提前明確;而主觀性判斷指標很難納入合約自動機中進行判斷,也就很難指導合約事務的執行。
③成本維度。智能合約的執行成本低於傳統合約,合約執行權利、義務條件被寫入計算機程序中自動執行,在狀態判斷、獎懲執行、資產處置等方面均具有低成本優勢。
④執行時間維度。智能合約屬於事前預定、預防執行模式;而傳統合約採用的是事後執行,根據狀態決定獎懲的模式。
⑤違約懲罰維度。智能合約依賴於抵押品、保證金、數字財產等具有數字化屬性的抵押資產,一旦違約,參與者的資產將遭受損失;而傳統合約的違約懲罰主要依賴於刑罰,一旦違約,可以採用法律手段維權。
⑥適用範圍維度。智能合約技術可全球採用,適用於全球範圍;而傳統合約受限於具體轄區,不同國際地區的法律、人文等因素均影響著傳統合約的執行過程。
如何部署合約#
第一步是使用 Solidity 編譯器進行合約編譯(下一章我們將介紹如何下載和使用 Solidity 編譯器)。
編譯後主要有兩種輸出物:
・ABI 規範
・合約字節碼
ABI(Application Binary Interface)是一個接口,由帶有參數的外部函數和公共函數組成。合約和其他使用者如果準備調用合約裡面的函數,就可以使用 ABI 來實現。
字節碼是合約的體現形式,它運行在以太坊上面。在發布時,字節碼是必須的,ABI 只有在調用合約裡面的函數時才會用到。你可以使用 ABI 創建一個新的合約實例。
合約的發布本身就是一個交易。因此,為了發布合約,你需要新建一個交易。在發布時,需要提供字節碼和 ABI。由於交易在運行時需要消耗 gas,這些 gas 就需要由合約來提供。一旦交易被打包寫入到區塊鏈上後,你就可以通過合約地址來使用合約了,調用方也可以通過新地址來調用合約裡面的函數。
對區塊鏈和以太坊的工作原理深入理解,會有助於你使用 Solidity 編寫更為健壯、安全和高效的智能合約。本章介紹了區塊鏈的基本概念,解釋了區塊鏈是什麼,區塊鏈為什麼這麼重要,對於構建去中心化和分佈式應用有哪些價值。本章也簡要地介紹了區塊鏈的體系結構,以及一些重要的概念,如:交易、區塊、gas、以太幣、帳戶、密碼學和挖礦。本章也初步涉及智能合約的一些內容,例如使用 Remix 去編寫智能合約,以及如何運行它。本章介紹的比較簡單,因為後面會進一步詳細的闡述,那時候你就能利用 Solidity 開發智能合約了。
你會注意到本章並沒有提及以太坊的一些工具。下一章將介紹安裝以太坊和相關工具,以太坊的生態十分豐富,有很多工具可以利用。我們將選取一些重點進行介紹,如:web3.js、TestRPC、Geth、Mist 和 MetalMask。
智能合約與區塊鏈#
尼克・薩博關於智能合約的工作理論遲遲沒有實現,一個重要原因是因為缺乏能夠支持可編程合約的數字系統和技術。區塊鏈技術的出現解決了該問題,不僅可以支持可編程合約,而且具有去中心化、不可篡改、過程透明可追蹤等優點,天然適合於智能合約。因此,也可以說,智能合約是區塊鏈技術的特性之一。
如果說區塊鏈 1.0 是以比特幣為代表,解決了貨幣和支付手段的去中心化問題,那麼區塊鏈 2.0 就是更宏觀地對整個市場去中心化,利用區塊鏈技術轉換許多不同的數字資產而不僅僅是比特幣,通過轉換創建不同資產的價值。區塊鏈技術的去中心化帳本功能可以被用來創建、確認、轉移各種不同類型的資產及合約。幾乎所有類型的金融交易都可以被改造成在區塊鏈上使用,包括股票、私募股權、眾籌、債券和其他類型的金融衍生品如期貨、期權等。
智能合約看上去就是一段計算機執行程序,滿足可準確自動執行即可,那麼為什麼用傳統的技術很難實現,而需要區塊鏈技術等新技術呢?傳統技術即使通過軟件限制、性能優化等方法,也無法同時實現區塊鏈的特性:一是數據無法刪除、修改,只能新增,保證了歷史的可追溯,同時作惡的成本將很高,因為其作惡行為將被永遠記錄;二是去中心化,避免了中心化因素的影響。
基於區塊鏈技術的智能合約不僅可以發揮智能合約在成本效率方面的優勢,而且可以避免惡意行為對合約正常執行的干擾。將智能合約以數字化的形式寫入區塊鏈中,由區塊鏈技術的特性保障存儲、讀取、執行整個過程透明可跟蹤、不可簒改。同時,由區塊鏈自帶的共識算法構建出一套狀態機系統,使智能合約能夠高效地運行。
智能合約工作原理#
基於區塊鏈的智能合約包括事務處理和保存的機制,以及一個完備的狀態機,用於接受和處理各種智能合約,而且事務的保存和狀態處理都在區塊鏈上完成。事務主要包含需要發送的數據,而事件則是對這些數據的描述信息。事務及事件信息傳入智能合約後,合約資源集合中的資源狀態會被更新,進而觸發智能合約進行狀態機判斷。如果自動狀態機中某個或某幾個動作的觸發條件滿足,則由狀態機根據預設信息選擇合約動作自動執行。
智能合約系統根據事件描述信息中包含的觸發條件,當滿足觸發條件時,從智能合約自動發出預設的數據資源,以及包括觸發條件的事件;整個智能合約系統的核心就在於智能合約以事務和事件的方式經過智能合約模塊的處理,輸出還是一組事務和事件;智能合約只是一個事務處理模塊和狀態機構成的系統,它不產生智能合約,也不會修改智能合約;它的存在只是為了讓一組複雜的、帶有觸發條件的數字化承諾能夠按照參與者的意志,正確執行。
基於區塊鏈的智能合約構建及執行分為如下幾步。
①多方用戶共同參與制定一份智能合約。
②合約通過 P2P 網絡擴散並存入區塊鏈。
③區塊鏈構建的智能合約自動執行。
步驟①“多方用戶共同參與制定一份智能合約” 的過程,包括如下步驟:
A. 用戶必須先註冊成為區塊鏈的用戶,區塊鏈返給用戶一個公鑰和私鑰;公鑰作為用戶在區塊鏈上的帳戶地址,私鑰作為操作該帳戶的唯一鑰匙。
B. 兩個以及兩個以上的用戶根據需要,共同商定了一份承諾,承諾中包含了雙方的權利和義務;這些權利和義務以電子化的形式,編程機器語言;參與者分別用各自私鑰進行簽名,以確保合約的有效性。
C. 簽名後的智能合約,將會根據其中的承諾內容,傳入區塊鏈網絡中。
步驟②“合約通過 P2P 網絡擴散並存入區塊鏈” 的過程,包括如下步驟:
A. 合約通過 P2P 的方式在區塊鏈全網中擴散,每個節點都會收到一份;區塊鏈中的驗證節點會將收到的合約先保存到內存中,等待新一輪的共識時間,觸發對該份合約的共識和處理。
B. 共識時間到了,驗證節點會把最近一段時間內保存的所有合約,一起打包成一個合約集合(set),並算出這個合約集合的 Hash 值,最後將這個合約集合的 Hash 值組裝成一個區塊結構,擴散到全網;其他驗證節點收到這個區塊結構後,會把裡面包含的合約集合的 Hash 取出來,與自己保存的合約集合進行比較;同時發送一份自己認可的合約集合給其他的驗證節點;通過這種多輪的發送和比較,所有的驗證節點最終在規定的時間內對最新的合約集合達成一致。
C. 最新達成的合約集合會以區塊的形式擴散到全網,如圖 4-2 所示。每個區塊包含以下信息:當前區塊的 Hash 值、前一區塊的 Hash 值、達成共識時的時間戳以及其他描述信息;同時區塊鏈最重要的信息是帶有一組已經達成共識的合約集;收到合約集的節點,都会對每條合約進行驗證,驗證通過的合約才會最終寫入區塊鏈中,驗證的內容主要是合約參與者的私鑰簽名是否與帳戶匹配。
步驟③“區塊鏈構建的智能合約自動執行” 的過程,包括如下步驟:
A. 智能合約會定期檢查自動機狀態,逐條遍歷每個合約內包含的狀態機、事務以及觸發條件;將條件滿足的事務推送到待驗證的隊列中,等待共識;未滿足觸發條件的事務將繼續存放在區塊鏈上。
B. 進入最新輪驗證的事務,會擴散到每一個驗證節點,與普通區塊鏈交易或事務一樣,驗證節點首先進行簽名驗證,確保事務的有效性;驗證通過的事務會進入待共識集合,等大多數驗證節點達成共識後,事務會被成功執行並通知用戶。
C. 事務執行成功後,智能合約自帶的狀態機會判斷所屬合約的狀態,當合約包括的所有事務都順序執行完後,狀態機會將合約的狀態標記為完成,並從最新的區塊中移除該合約;反之將標記為進行中,繼續保存在最新的區塊中等待下一輪處理,直到處理完畢;整個事務和狀態的處理都由區塊鏈底層內置的智能合約系統自動完成,全程透明、不可簒改。
假設用戶愛麗絲(Alice)與用戶鮑伯 (Bob) 需要構建一個區塊鏈智能合約,目的是愛麗絲將其房屋租賃給鮑伯,租金為 1000 元一個月,每月支付,租期為一年。假設愛麗絲房屋門鎖可通過互聯網控制,其開鎖密鑰為 Key(每月生成一次),愛麗絲的銀行帳戶為 MA,鮑伯的銀行帳戶為 MB。智能合約的執行包括如下步驟:
①愛麗絲與鮑伯提交合約構建申請給智能合約伺服器,生成合約並由伺服器發布到區塊鏈生效。
②愛麗絲將 Key 以及 MA 提供給智能合約伺服器。
③鮑伯通過 MB 向智能合約伺服器支付 1000×12=12000 元的資金作為抵押,或者鮑伯通過第三方機構的擔保,僅向智能合約伺服器支付少量資金。
④合約開始執行,智能合約伺服器將 Key 發送到鮑伯,並從鮑伯的抵押資金中扣除 1000 元,發送到愛麗絲的帳戶,並生成參與對象記錄存入區塊鏈。
⑤每個月智能合約都會定期檢查,如果合約未到期,則繼續從鮑伯的抵押資金中扣除 1000 元發送到愛麗絲的帳戶並發送 Key 給鮑伯,並生成參與對象記錄存入區塊鏈。
⑥整個過程受到第三方機構的監控,所有參與者、第三方機構都可以通過區塊鏈查詢合約執行情況。
⑦租約期限到後,智能合約伺服器生成一條合約記錄,標示合約終止並發布到區塊鏈,合約執行即終止。
智能合約的發展可能需要經歷漫長的道路,但是更多的智能合約機制正在被設計出來,更多領域的人才正在加入。目前為止,對來自截然不同的領域,如經濟學、密碼學、網絡科學、金融學的自動化合約執行來說,共同設計研究合約準則是必經之路。如果缺少交叉溝通,無論是對技術的缺乏還是對商業用途模式意識的缺乏,都將造成智能合約的低效。
目前 Orisi、Codius、Symboint、Hedgy、BitHalo、Mirror、Hyperledger、Eris Industries、Ethereum、智能坊、小蚁、Colored Coin、IBM 等已經致力於智能合約的平台開發及相關研究,相信智能合約的應用前景一片光明。
參考資料
[1]http://www.fastcolabs.com/3035723/app-economy/smart-contracts-could-be-cryptocurrencys-killer-app
[2]https://medium.com/@heckerhut/whats-a-smart-contract-in-search-of-a-consensus-c268c830a8ad
[3] http://www.wtoutiao.com/p/14dyEMP.html
[4]http://www.coindesk.com/smart-contract-myths-blockchain/
[5]http://8btc.com/article-1921-1.html
[6]http://wangxiaoming.com/blog/2016/03/03/blockchain-2-0-he-yue/
以太坊網絡#
以太坊網絡是一個創建和部署分佈式應用的開源平台,依靠大量計算機(節點)支撐,它們之間相互交互,並在分佈式帳本中存儲數據。在這裡,分佈式帳本的含義是網絡上的每個節點都擁有一個帳本的副本。對開發者來說,有多種網絡部署方式可供選擇,在部署解決方案和智能合約時,可以根據實際需求和場景,選擇一個適合自己的網絡,這樣就不會支付真實的以太幣或發生其他支出。當然,也有免費的網絡可以使用,也有網絡需要用戶支付以太幣或其他貨幣。
以太坊主網是全球性的公開網絡,人人都可以使用,通過帳戶就能進入網絡。對於任何人來說,創建帳戶、部署解決方案和合約都是免費的。主網的使用費用以 gas 來計量。它的代號是 homestead(以前叫做 Frontier)。通過互聯網,人們能連接上主網,並可以查看上面的數據和交易。
測試網絡#
測試網絡的目的是幫助人們快速適應和使用以太坊環境,是從主網精確複製而來。在測試網絡上,部署和使用合約,都不會發生真實的費用,這是因為測試用的以太幣都是任意產生的,只能在測試網上使用。在筆者編寫此書時,存在多個測試網絡可以使用,例如:Ropsten、Kovan 和 Rinkeby。
Ropsten 是第一個使用 PoW 共識算法產生區塊的測試網絡。以前被叫做:Morden。正如上面所說的,你可以無償使用它構建和測試合約。在 Geth 中加入 ——testnet 參數就可以進入測試網絡了。在後面會介紹 Get 的用法。Ropsten 是目前為止最受歡迎的測試網絡。
Rinkeby 是另外一個以太坊測試網絡,它使用的是 PoA 共識機制。PoW 和 PoA 在礦工間建立共識時的機制是不同的。PoW 在維護不可篡改性和去中心化方面更強壯,然而它的缺陷是不能有效地控制礦工。PoA 具備了 PoW 的優點,也能對礦工具有一定的控制能力。
Kovan 測試網絡只能在少部分用戶之間使用,因此,更多的信息可以訪問:https://kovan-testnet.github.io/website/。
私有網絡#
私有網絡是在用戶自有的網絡上建立和運行的,控制權掌握在一個組織手裡。出於測試的考慮,人們並不希望將解決方案、合約和場景放到公共網絡上,這樣就需要建立一個開發、測試和生產的環境,因此,用戶應該搭建一個私有網絡,這樣就能夠全盤進行掌控。
聯盟網絡#
聯盟網絡也是一個私有網絡,只是有一點區別,聯盟網絡的節點是由不同組織所管理的。實際上,聯盟鏈上也沒有哪個組織能夠單獨地控制網絡和數據,而是由全體組織和組織裡面具有查看和修改權限的人共同進行控制的。聯盟鏈可以通過互聯網或 VPN 網絡接入。
Geth#
目前存在多種語言編寫的以太坊客節點和客戶端工具,包括:Go、C++、Python、javaScript、Java 和 Ruby 等。這些功能不受語言限制,開發者可以選擇最適合自己的。本書使用 Go 語言,它被稱為 Geth,可以作為客戶端連接到公共的和測試的網絡上,它也可以在私有網絡上運行挖礦和 EVM(交易節點)。
Geth 是使用 Go 語言編寫的命令行工具,可以使用它在私有網絡上創建節點和礦工。Geth 可以在 Windows、Linux 和 Mac 環境下安裝。
在 Windows 下安裝 Geth#
在搭建私有網絡前,需要下載和安裝 Geth(goethereum)工具。
下面介紹下載和安裝步驟:
1. 可以訪問https://ethereum.github.io/go-ethereum/downloads/ 頁面下載,有 32 位和 64 位兩個版本。在本書中,操作系統使用 Azure 雲上的 windows Server 2016 版本。
2. 下載後,執行安裝文件,接下來按照默認配置一步步進行,完成開發環境設置。
3. 安裝完成後,就可以在 CMD 和 Powershell 中使用了。
4. 打開命令行,輸入 geth–help。
需要注意的是,在輸入 geth 後,get 會連接到主網上,然後開始同步和下載區塊和交易數據。目前,整個以太坊區塊已經超過 30GB [1]。help 命令執行後,屏幕上會顯示 geth 可用的命令,包括版本號。
Geth 是基於 JSON RPC 的協議。它定義了採用 JSON 格式的代碼遠程調用規範。Geth 可以使用下面三種 JSON RPC 協議進行連接:
・內部進程通信(IPC,Inter Process Communicatiion):內部通訊,通常用於一台電腦內。
・遠程程序調用(RPC,Remote Procedure Calls):跨計算機的通訊。通常使用 TCP 和 HTTP 協議。
・WS,Web sockets:使用 sockets 連接 Geth。
・配置 Geth 有很多命令、開關參數和選項,包括:
・配置 IPC、RPC 和 WS 協議
・配置網絡連接的類型 —— 私有網絡、Rostper 和 Rinkeby
・挖礦選項
・控制台和 API
・網絡
・調試和日誌
其中,在創建私有網絡時用到的一些選項,將在下一部分提到。
Geth 可以直接使用 Geth(不帶選項)直接連接公鏈。Homestead 就是當前公鏈的名稱。它的 Networkid 和 ChainID 是 1。
在不同的網絡上,其 Chain ID 是不同的。其中:
・chain ID 1 是主網公鏈
・chain ID 2 是 Morden 網絡(僅對部分人開放)
・chain ID 3 是 Ropsten 網絡
chain ID 4 是 Rinkeby 網絡
・chain ID 大於 4 的是私有網絡。
另外,可以使用 Geth--testnet 連接到 Ropsten 網,——rinkeby 連接到 Rinkeby 網,Geth 也可以與 chain ID 配合使用。
搭建一個私有網絡#
Geth 安裝好後,可以先在本地進行配置,這時不需要連接到互聯網。每個網絡都有一個創世區塊,它是整個網絡的第一個