- 以太坊教程
- 以太坊 - 首頁
- 以太坊 - 簡介
- 以太坊 - 智慧合約
- 以太坊 - 用於合約編寫的Solidity
- 以太坊 - 開發MyContract
- 以太坊 - 編譯合約
- 以太坊 - 部署合約
- 以太坊 - 與合約互動
- 以太坊 - Remix的侷限性
- 以太坊 - 用於區塊鏈的Ganache
- 以太坊 - Ganache伺服器設定
- 以太坊 - 快速入門
- 以太坊 - MyEtherWallet
- 以太坊 - 建立錢包
- 將錢包連線到Ganache區塊鏈
- 以太坊 - 部署合約
- 與已部署合約互動
- 以太坊 - 建立合約使用者
- 以太坊 - 總結
- 以太坊有用資源
- 以太坊 - 快速指南
- 以太坊 - 有用資源
- 以太坊 - 討論
以太坊 - 快速指南
以太坊 - 簡介
比特幣的巨大成功激發了很多人建立自己貨幣的想法。看到比特幣——一種數字貨幣——提供的優勢,人們希望在自己的應用程式中使用區塊鏈的概念。人們希望擺脫物理合同,轉向智慧數字合同,其中諸如否認、透明度、安全等問題將自動得到解決。這項努力的結果導致了以太坊的建立——一個流行的平臺,用於建立支援智慧合約的分散式區塊鏈應用程式。
在本教程中,您將學習如何在以太坊平臺上建立一個分散式應用程式 (DAPP)。更具體地說,您將學習如何編寫合約、在本地區塊鏈上測試它,最後將其部署到外部區塊鏈上進行深度測試和商業用途。您將使用**Solidity**,這是一種面向物件的合約開發語言。您還將使用**Remix**,這是一個用於開發和測試合約的開源IDE。為了將測試過的合約部署到外部區塊鏈,您將使用**Ganache**。為了與合約互動,您將需要一個客戶端應用程式。我們將使用**MyEtherWallet**為每個這樣的客戶端建立一個錢包。合約建立者將釋出合約。任何其他客戶端都將使用合約提供的介面檢視合約值,並將一些資金髮送給建立者以執行合約的一部分。
那麼讓我們從編寫合約開始。
以太坊 - 智慧合約
有幾種工具可用於開發和測試合約。其中一個最簡單的工具是在以太坊官方網站上提供的。該工具稱為**Remix**,我們將使用它來進行合約開發。
用於合約開發的Remix
在瀏覽器中輸入以下URL開啟Remix IDE。
https://remix.ethereum.org將出現以下螢幕。
在中心視窗中,您將看到一些預設程式碼,這是一個示例Solidity程式碼。您將在此程式碼編輯器中鍵入您的合約程式碼。您的程式碼可能會自動編譯。成功編譯程式碼後,您將能夠在同一IDE中執行程式碼。當您執行合約方法時,結果將顯示在同一IDE視窗中。該IDE具有除錯程式碼和單元測試專案的工具,這些工具可以在右上角的選單欄中看到,如下面的IDE螢幕截圖所示。您很快就會使用這些選項。
您現在將開始編寫您的合約。
以太坊 - 用於合約編寫的Solidity
Solidity是一種專門為合約編寫而開發的面嚮物件語言。它是一種高階語言,繼承了C++、Python和JavaScript的特性。Solidity編譯器將您的原始碼編譯成在以太坊虛擬機器 (EVM) 上執行的位元組碼。
要快速瞭解Solidity語法,請檢視IDE中的示例程式碼。
pragma solidity >=0.4.22 <0.6.0;
contract Ballot {
第一行是對編譯器的指令。第二行開始合約的定義。在合約中,您宣告變數,例如:
address chairperson;
您還可以定義結構,例如**Proposal**,並建立這些結構項的陣列。在程式碼視窗中檢查一下。
然後,您可以定義一個建構函式,該建構函式在例項化合約時呼叫。
constructor(uint8 _numProposals) public {
在建構函式之後,您將定義幾個方法,這些方法是合約方法。在示例合約中,**giveRightToVote**就是一個這樣的方法,其語法如下:
function giveRightToVote(address toVoter) public {
**public**關鍵字使任何有權訪問該合約的客戶端都可以公開呼叫此方法。
同樣,示例合約定義了另外三個方法,稱為**delegate、vote**和**winningProposal**。檢查這些方法以瞭解Solidity語法。這些是編寫您自己的合約的先決條件。解釋Solidity的完整語法超出了本教程的範圍。
以太坊 - 開發MyContract
我們將把我們的合約命名為**MyContract**,如以下宣告所示:
contract MyContract {
我們將宣告兩個變數如下:
uint amount; uint value;
變數**amount**將儲存合約執行者傳送給合約建立者的累計金額。**value**欄位將儲存合約值。隨著執行者執行合約,**value**欄位將被修改以反映平衡的合約值。
在合約建構函式中,我們設定這兩個變數的值。
constructor (uint initialAmount, uint initialValue) public {
amount = 0;
value = 1000;
}
最初,合約上收取的金額為零,我們將**amount**欄位設定為0。我們將合約**value**設定為某個任意數字,在本例中為1000。合約建立者決定此值。
為了在任何給定時間檢查收集到的金額,我們提供了一個名為**getAmount**的公共合約方法,定義如下:
function getAmount() public view returns(uint) {
return amount;
}
為了在任何給定時間獲取平衡的合約值,我們定義了**getBalance**方法,如下所示:
function getBalance() public view returns(uint) {
return value;
}
最後,我們編寫一個合約方法**(Send)**。它使客戶端能夠向合約建立者傳送一些資金:
function send(uint newDeposit) public {
value = value - newDeposit;
amount = amount + newDeposit;
}
**send**方法的執行將修改合約的**value**和**amount**欄位。
完整的合約程式碼如下:
contract MyContract {
uint amount;
uint value;
constructor (uint initialAmount, uint initialValue) public {
amount = 0;
value = 1000;
}
function getBalance() public view returns(uint) {
return value;
}
function getAmount() public view returns(uint) {
return amount;
}
function send(uint newDeposit) public {
value = value - newDeposit;
amount = amount + newDeposit;
}
}
以太坊 - 編譯合約
一旦您編寫了完整的合約程式碼,在此IDE中編譯它就非常簡單。只需單擊IDE中的**Autocompile**複選框,如下面的螢幕截圖所示:
或者,您可以單擊標題為“開始編譯”的按鈕來編譯合約。
如果存在任何錯別字,請在程式碼視窗中修復它。確保程式碼完全無錯誤地編譯。現在,您可以準備部署合約了。
以太坊 - 部署合約
在本章中,我們將學習如何在以太坊上部署合約。單擊“執行”選單選項以部署合約。將出現以下螢幕。
合約名稱顯示在突出顯示的列表框中。在此下方,您會注意到**部署**按鈕,單擊它以部署合約。合約將部署到Remix內建區塊鏈。您將能夠在螢幕底部看到已部署的合約。您可以在下面的螢幕截圖的突出顯示部分看到這一點。
請注意,此突出顯示區域中存在三個方法名稱。接下來,您將透過執行合約方法來與合約進行互動。
以太坊 - 與合約互動
當您單擊已部署的合約時,您將看到合約提供的各種公共方法。這在下面的螢幕截圖中顯示。
第一個方法**send**在其前面包含一個編輯框。在這裡,您將鍵入合約方法所需的引數。另外兩個方法不接受任何引數。
傳送資金
現在,在合約視窗中看到的**send**函式前面輸入一些金額,例如100。單擊**send**按鈕。這將執行合約**send**方法,減少合約**value**欄位的值並增加**amount**欄位的值。
檢查合約值
之前的**傳送資金**操作已將合約值減少了100。您現在可以透過呼叫合約的**getBalance**方法來檢查這一點。單擊**getBalance**按鈕時,您將看到輸出,如下面的螢幕截圖所示:
合約**value**現在減少到900。
檢查已收集的金額
在本節中,我們將檢查到目前為止在此合約上收集的金額。為此,請單擊**getAmount**按鈕。將出現以下螢幕。
**amount**欄位的值已從0更改為100。
嘗試一些**send**操作並檢查合約**value**和**amount**欄位,以得出已部署的合約按預期執行的結論。
以太坊 - Remix的侷限性
您目前使用的Remix IDE 足夠用於開發和初始測試您的合約。對於現實生活中的合約,您需要針對各種引數測試您的功能。Remix無法建立真實的(非測試)使用者帳戶來在它們之間轉移資金。您無法控制Remix建立的區塊鏈的配置。您甚至無法監控事務的執行。
Remix 缺少一些高階操作。因此,我們需要將我們的合約部署到一個更復雜的區塊鏈上,該區塊鏈提供所有這些功能。這樣一個區塊鏈是**Ganache**,您將在我們後續章節中瞭解到。
以太坊 - 用於區塊鏈的Ganache
Ganache 用於設定一個個人以太坊區塊鏈來測試您的Solidity合約。與Remix相比,它提供了更多功能。當您使用Ganache時,您將瞭解這些功能。在開始使用Ganache之前,您必須首先在本地機器上下載並安裝區塊鏈。
下載Ganache
您可以從以下URL下載Ganache:
https://truffleframework.com/ganacheGanache可在多個平臺上使用。我們在Mac上開發和測試了本教程的全部內容。因此,下面的螢幕截圖將顯示Mac安裝。當您開啟上面給出的安裝URL時,它會自動檢測您的機器的作業系統並引導您到相應的二進位制安裝程式。下面的螢幕截圖顯示了Mac安裝。
當您單擊下載按鈕時,它將開始下載用於Mac安裝的DMG檔案。
安裝Ganache
找到下載資料夾中的“Ganache-2.0.0.dmg”檔案,雙擊安裝Ganache。安裝成功後,將出現以下介面:
將Ganache圖示拖動到應用程式資料夾。現在,Ganache已作為應用程式安裝在您的Mac上。
如果您使用的是其他作業系統,請按照提供的說明進行安裝。
啟動Ganache
現在在您的應用程式資料夾中找到**Ganache**,雙擊其圖示啟動Ganache。
Ganache桌面
Ganache啟動後,將出現如下所示的Ganache介面:
點選“QUICKSTART”啟動Ganache。您將看到如下所示的Ganache控制檯:
以上截圖中的控制檯顯示了兩個使用者帳戶,每個帳戶的餘額為100 ETH(以太幣——以太坊平臺交易的貨幣)。每個帳戶的交易計數也為零。由於使用者尚未執行任何交易,因此此計數顯然為零。
現在,我們將概述Ganache中一些與我們直接相關的重要的介面。
以太坊 - Ganache伺服器設定
點選螢幕右上角的設定圖示,如下圖所示:
將出現伺服器設定介面,如下圖所示:
在這裡,您可以設定Ganache伺服器的伺服器地址和埠號的值。目前,請保留其預設值。“網路ID”是Ganache伺服器的內部區塊鏈識別符號;請保留其預設值。“自動挖礦”按鈕處於開啟狀態,表示交易將立即處理。如果您將其關閉,則系統會要求您輸入區塊挖礦所需的時間(秒)。
帳戶和金鑰
當您點選“帳戶和金鑰”選單選項時,您將看到以下介面:
在這裡,您可以**設定**每個帳戶的預設餘額。預設值為100。這解釋了為什麼在桌面截圖中每個帳戶顯示100 ETH。您還可以在此介面設定帳戶數量。此截圖中顯示的值為2,這就是桌面只顯示兩個帳戶的原因。
現在,我們將瞭解這兩個設定介面;掌握這兩個介面的使用方法就足夠了。點選螢幕右側的“重啟”按鈕重啟伺服器。您將返回到桌面介面。嘗試輸入上述兩個欄位中的不同值,重啟伺服器並檢視其效果。
以太坊 - 快速入門
現在,我們將簡要了解Ganache桌面上的可用功能。在桌面上,頂部有一些選單選項,其中一些與我們直接相關。選單欄在下面的截圖中突出顯示:
點選“交易”選單將顯示迄今為止執行的所有交易。您很快就會執行交易。現在,返回到上面的介面,並定期檢查交易。典型的交易介面如下圖所示:
同樣,當您點選“區塊”選單時,您將看到各種已挖出的區塊。請參考以下截圖瞭解“區塊”選單的外觀:
點選“日誌”選單。它將為您開啟系統日誌。在這裡,您可以檢查您在以太坊區塊鏈上執行的各種操作。
現在,您已經瞭解瞭如何使用Ganache設定私有以太坊區塊鏈,接下來您將建立一些將使用此區塊鏈的客戶端。
以太坊 - MyEtherWallet
對於客戶端應用程式,您將使用**MyEtherWallet**。
從以下網址下載**MyEtherWallet**軟體:
https://github.com/kvhnuke/etherwallet/releases/tag/v3.21.06
如有需要,解壓下載的檔案並開啟**index.html**。您將看到以下建立新錢包的介面。
以太坊 - 建立錢包
在本節中,我們將學習如何建立以太坊錢包。要建立新錢包,請輸入您選擇的密碼,然後點選“**建立新錢包**”按鈕。這樣做後,將建立一個錢包。數字錢包實際上是生成您需要安全儲存的公鑰/私鑰對。錢包建立結果如下所示:
點選“**下載金鑰庫檔案(UTC/JSON)**”按鈕儲存生成的金鑰。現在,點選“**我理解。繼續**”按鈕。您的私鑰將顯示在螢幕上,如下面的截圖所示:
點選“**列印紙質錢包**”按鈕,保留錢包私鑰的物理記錄。稍後解鎖錢包時將需要此記錄。您將看到以下介面。請勿丟失此輸出。
要解鎖您的錢包,請點選“**儲存您的地址**”按鈕。您將看到以下介面。
可以使用上面介面中突出顯示的“私鑰”選項解鎖錢包。從之前的截圖中複製並貼上私鑰,然後點選“解鎖”按鈕。您的錢包將被解鎖,您將在螢幕底部看到一條訊息。由於錢包目前沒有任何內容,因此解鎖錢包對我們來說並沒有什麼用處。
將錢包連線到Ganache區塊鏈
您現在已經建立了一個錢包;此錢包是區塊鏈的客戶端介面。我們將把錢包連線到您在上一節中啟動的Ganache區塊鏈。為此,請點選下面的截圖中顯示的“網路”下拉框:
轉到列表底部。您將看到“**新增自定義網路/節點**”選項。選擇此項。
現在,將出現一個介面,要求您輸入Ganache伺服器地址和其監聽的埠。
輸入您的Ganache伺服器詳細資訊 – http://127.0.0.1 和埠:**8545**。這些值將是您在Ganache伺服器設定中設定的值。為該節點指定您選擇的名稱。點選“**儲存並使用自定義節點**”按鈕。您將在螢幕底部看到連線訊息。此時,您的錢包已成功連線到Ganache區塊鏈。
您現在可以將合約部署到此連線的區塊鏈上了。
以太坊 - 部署合約
要部署合約,請選擇下面的截圖中顯示的“合約”選單選項:
您需要在此介面輸入合約的位元組碼。請記住,當您編譯Solidity合約程式碼時,它會生成在EVM上執行的位元組碼。您現在需要從**Remix IDE**獲取此位元組碼。
轉到Remix IDE介面,您之前鍵入的合約應該在程式碼視窗中。如果沒有,請在程式碼視窗中重新鍵入合約。點選“位元組碼”按鈕,如下圖所示:
已編譯源的位元組碼將與其他一些資訊一起復制到剪貼簿。將複製的程式碼貼上到您喜歡的文字編輯器中。以下是文字編輯器的截圖:
**object** 標記的值包含所需的位元組碼。仔細複製此值,確保您沒有複製包含的引號。位元組碼很長,因此請確保您複製到最後一個位元組(包括最後一個位元組)。現在,將此位元組碼貼上到下面的“部署合約”介面中:
“Gas Limit”欄位會自動設定。
在“Gas Limit”欄位下方,您將找到用於訪問錢包的選擇。
現在,使用將在此合約上部署的Ganache帳戶的**私鑰**訪問錢包。要獲取此私鑰,請返回到**Ganache**視窗。點選第一個帳戶的“金鑰”圖示,如下圖所示:
您將看到使用者帳戶#1的私鑰,如下面的截圖所示:
複製此私鑰並將其貼上到下面的“貼上您的私鑰”部分:
您將在螢幕底部看到“解鎖”按鈕。解鎖後,螢幕底部將顯示一條“成功”訊息。此時,您的錢包已連線到Ganache區塊鏈的帳戶#1。
現在,您可以簽名並部署合約了。點選下面的截圖中顯示的“簽名交易”按鈕:
簽名交易會生成並顯示**原始**和**簽名**交易。點選“部署合約”按鈕將合約部署到Ganache區塊鏈。請記住,合約由Ganache區塊鏈的帳戶#1使用者部署。因此,帳戶#1使用者成為合約建立者。在部署合約之前,系統會要求您確認交易,因為如果您要將此合約部署到公共的真實以太坊區塊鏈上,則可能會花費一些真金白銀。不用擔心,對於當前在您的本地機器上執行的私有區塊鏈,不會涉及真金白銀。點選下面的截圖中顯示的“進行交易”按鈕:
檢查Ganache控制檯;您將看到帳戶#1中的ETH餘額已減少,如下面的截圖所示:
現在,點選下面的截圖中顯示的“交易”選單:
您將看到交易詳細資訊。
在此介面上,您可以找到合約的已釋出地址。該地址在上圖中已標記。您將公開分發此地址,讓其他人知道您的合約在此指定地址可用,他們可以連線到此地址並執行合約方法,例如向您(合約建立者)傳送資金。複製此合約地址以供自己參考,因為您將在下一步中需要它。
以太坊 - 與已部署合約互動
現在,您可以與已部署的合約進行互動了。返回到MyEtherWallet桌面,並點選下面的截圖中顯示的“與合約互動”選項卡:
將您之前複製的合約地址貼上到“合約地址”欄位中。您還需要將合約的“ABI/JSON介面”貼上到上面的介面中。
要獲取**ABI**,請轉到**Remix**視窗並點選“ABI”按鈕,如下圖所示。
ABI/JSON介面將被複制到剪貼簿。將其貼上到您喜歡的編輯器中以檢查生成的介面,如下所示:
ABI / JSON Interface
[
{
"constant": false,
"inputs": [
{
"name": "newDeposit",
"type": "uint256"
}
],
"name": "send",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"name": "initialAmount",
"type": "uint256"
},
{
"name": "initialValue",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"constant": true,
"inputs": [],
"name": "getAmount",
"outputs": [
{
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "getBalance",
"outputs": [
{
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
}
]
將此JSON貼上到**MyEtherWallet**介面後,您將注意到JSON介面下方的“訪問”按鈕現在已啟用,如下所示:
點選“訪問”按鈕訪問合約。
點選“訪問”按鈕後,合約地址和函式選擇下拉列表將顯示在螢幕上,就像在Remix編輯器中一樣。這在下面的截圖中顯示:
您可以像在Remix部署中一樣檢查合約的各種函式。請注意,合約現在已部署到外部Ganache區塊鏈上。檢查“getAmount”函式;您將獲得值為零的Amount值,“getBalance”將顯示餘額為1000。
現在嘗試傳送一些資金。它將為您提供一個**文字編輯**控制元件來輸入金額。當您編寫合約時,將使用一些“gas”,並且系統會在將其寫入區塊鏈之前要求您確認交易。交易將在短時間內執行,具體取決於您在Ganache伺服器上設定的挖礦時間。之後,您可以重新檢查合約的“value”和“amount”欄位,以驗證這些欄位是否確實已修改。
你現在可以檢視Ganache桌面客戶端來檢視你已經執行過的交易。下面顯示一個示例輸出:
到目前為止,你既是合約建立者也是合約執行者。這並沒有多大意義,因為你期望其他人使用你的合約。為此,我們將為Ganache區塊鏈建立另一個客戶端,並將一些資金從新建立的賬戶#2傳送到賬戶#1(合約建立者)。
以太坊 - 建立合約使用者
在本章中,我們將學習如何在以太坊上建立合約使用者。為了為我們已釋出的合約建立使用者,我們將建立另一個連線到同一Ganache區塊鏈的MyEtherWallet客戶端,你已經在之前的步驟中使用了該區塊鏈。前往MyEtherWallet介面並建立一個新錢包。
點選合約選單,並選擇“與合約互動”選項,就像之前的案例一樣。請注意,這個新使用者只是與已經發布的合約互動,而不是部署他自己的合約。指定你在之前的案例中使用的合約地址和ABI。
現在,點選訪問按鈕並呼叫傳送方法。當被要求輸入時,輸入一些值,例如要傳送的100 ETH。提交交易。提交後,將出現以下螢幕。
要將這個新客戶端連線到我們的Ganache區塊鏈,請轉到Ganache控制檯。點選賬戶#2的金鑰圖示,如下面的螢幕截圖所示:
你將獲得賬戶#2的私鑰。
複製你收到的金鑰,並將其用於你新建立的錢包,如下所示:
點選解鎖按鈕以連線錢包。
當錢包成功解鎖後,編寫所需的傳送交易。
點選“生成交易”按鈕生成交易。
執行交易並等待一段時間,以便它反映在區塊鏈上。現在,執行“getAmount”,顯示的金額現在應該是200。
執行“getBalance”。值欄位現在應該是800。
檢查交易日誌以檢視不同使用者執行的各種交易。
以太坊 - 總結
你學習瞭如何在Solidity中編寫你自己的數字合約。你在Remix IDE中開發和測試了合約介面。為了進一步進行多使用者測試,你將此合約部署到Ganache區塊鏈上。在Ganache上,你建立了兩個使用者賬戶。第一個賬戶用於釋出合約。第二個賬戶用於使用合約。
下一步是什麼?
你在整個過程中使用的Ganache區塊鏈是私有的,並且只存在於你的機器上。一旦你完全滿意合約的功能,你就可以繼續將其釋出到真實的以太坊區塊鏈上。但是,這樣做需要你花費真金白銀。在演示應用程式中,我們為Ganache中的每個使用者賬戶使用了1000 ETH作為預設值。當你在真實的區塊鏈上部署你的合約時,你必須透過將你所在國家/地區的貨幣兌換成ETH來購買ETH。這種貨幣將儲存在你的錢包中,你可以根據自己的意願使用它。