以太坊開發測試(3)MetaCoin 案例分析
爲了方便測試,安裝圖形化區塊鏈客戶端Ganache
如圖所示,啓動這個測試區塊鏈客戶端。
第一行內容包括:當前賬戶,區塊信息,交易信息,合約信息,事件,日誌。
第二行內容包括:當前區塊數,Gas 的價格,GAS限制,分叉,網絡ID,RPC地址,挖礦模式。
部署MetaCoin服務如下:
從圖中可以看出,所有的代碼執行完畢,共生成了5個區塊,並且第一個賬戶看起來少了0.01個以太幣,第一個賬戶有5筆交易發生(Tx count)。
5個區塊的信息如下所示:
可以發現一共其實有6個塊,但是顯示只有5個塊,第一個應該是系統的初始區塊。
共發生5筆交易,
其中有三個是交易是合約創建交易,兩個交易是合約調用交易。
首先我們來看一個概念:HardFork 硬分叉
硬分叉的本質原因是,共識算法發生了更新,一些落後的節點無法驗證已經升級的節點產生的新區塊,如果不及時處理,則新的幣不能有效認證,產生分叉幣。簡單來說,就是因爲POW的一些不良影響,需要不斷更新共識算法來維護挖礦的公平性,爲了不斷改進以太坊公鏈而進行的強制分叉,分叉後,之前使用舊的共識算法的鏈可以繼續存活,使用新的共識算法的鏈也可以健康的向前發展。
接着,我們繼續分析。
編譯智能合約,更新內容,部署智能合約,現實網絡信息,注意這個網絡ID 和 Gas 消耗上限是根據你的區塊鏈設定的。
與智能合約沒有任何關係。我們也可以更改網絡ID Gas 消耗上限。
第二部分內容:
initial_migration.js 似乎是這個JS執行的邏輯,爲遷移腳本,將智能合約遷移(部署)到區塊鏈網絡中。
這個文件中的內容如下所示:
const Migrations = artifacts.require("Migrations");
module.exports = function(deployer) {
deployer.deploy(Migrations);
};
創建一個靜態變量 migrations. artifacts.require 是一個方法,指定系統需要操作哪一個智能合約。得到返回值爲這個請求結果。在下邊的操作中將用 Migrations 來操作相關合約。
module.exports 是語法導出函數,即需要deployer 內容。進一步,由deloyer.deploy(Migrations) 部署合約。
接着 我們看這個合約到底執行了什麼內容?
Migrations.sol 內容如下所示:
pragma solidity >=0.4.25 <0.7.0; //聲明合約語言版本
contract Migrations { //合約 Migrations
address public owner; //address 爲地址變量,合約擁有者地址,可全局訪問
uint public last_completed_migration; //無符號整形公開變量
modifier restricted() { //函數修改器,限定函數執行條件
if (msg.sender == owner) _; //只允許所有者調用這個方法,執行內容,否則報錯
}
constructor() public { //構造方法,將調用者地址保存
owner = msg.sender;
}
//一個賦值函數將一個無整形int傳遞賦值
function setCompleted(uint completed) public restricted {
last_completed_migration = completed;
}
}
這應該是第一個被部署的合約全部內容。
練習一下,我們增加一個輸出字符串的變量和函數,然後再次編譯運行。
function setstring(string memory test) public {
name = test;
}
function printown() view public returns (string memory){
return name;
}
//memory 爲臨時變量 最終並不存儲到區塊鏈中
執行結果如圖所示,首先我們看到,這個合約由第一個賬戶部署,總共花費0.02個以太幣。
左邊顯示的是交易細節,交易哈希值,合約地址,區塊編號,區塊時間戳,部署賬號,剩餘以太幣,Gas消耗,Gas價格,發送以太幣數量,總共花費 = Gas消耗 * Gas 價格,這裏爲313709 * 20 = 0.00627418以太幣。這簡單而本質的反映出以太坊手續費的計算方式:執行步數 * 每步價格。