本文基于墨客區塊鏈(MOAC BlockChain),使用moac網頁版錢包部署ERC-20合約。
環境:
墨客區塊鏈版本:nvwa-vnode1.0.2.win.zip;
作業系統:64位Windows 10家庭版。
1.安裝并啟動本地節點
1.1 安裝moac節點
請參考檔案《第三篇 墨客區塊鏈(MOAC BlockChain)節點安裝教程》。
1.2 啟動moac節點
打開命令終端(cmd),轉到墨客當前目錄,在命令列中執行:
D:\nuwa1.0.2.win>moac --rpc --rpccorsdomain "http://wallet.moac.io"
備注:
--rpc 啟動RPC服務,本機訪問節點
--rpccorsdomain 啟動瀏覽器訪問服務,非本機訪問節點
"http://wallet.moac.io" moac在線錢包網址,會自動連接到本機啟動的moac節點并顯示已有賬號,如果本機節點沒有啟動,會顯示以下提示資訊。

啟動正常,會顯示以下賬號資訊。確保其中一個賬號有足夠的moac以進行智能合約部署。

2.撰寫并編譯智能合約
2.1 以下為基于erc-20撰寫的一個代幣合約
本文實際測驗代碼TestToken20.sol附在文章末尾。
注意:該代碼為測驗實體使用,非標準部署智能合約代碼。
2.2 編譯、部署合約
在網頁錢包點擊合約按鈕“CONTRACTS”

然后點擊部署新合約按鈕“DEPLOY NEW CONTRACT”
選擇一個有moac余額的賬號。

把自己撰寫的智能合約代碼放進代碼區“Solidity contract source code”,該代碼會自動進行編譯,如果編譯通過,右側會顯示"Select contract to deploy"。
如果編譯沒有通過,則不會顯示相應內容。

在“Select contract to deploy”下拉框選擇相應的token型別,本例為“Token Demo”,下面會自動彈出引數輸入框,主要包括四項:
initial Amount - 256 bits unsigned integer //token發行總量,本例為"10000"
token Name - String //token名稱,本例為"KongFuZi Token"
decimal Units - 8 bits unsigned integer //token最小單位是小數點后第幾位
token Symbol - String //token簡稱,本例為"KFZT"

在選擇gas費用后,點擊"DEPLOY"部署合約。此時會顯示發布合約確認界面。
如果提示需要解鎖(發送代幣的)賬戶,進入moac命令列界面,輸入命令:
>personal.unlockAccount(mc.accounts[0], "passwd", 300)
該命令共有三個引數:
第一個引數表示解鎖的賬戶,
第二個引數是該賬戶的密碼,
第三個引數是解鎖時間,本例為300秒,300秒后會重新鎖住賬戶;
如果解鎖時間設為0,表示一直解鎖,此時賬號有風險,慎用。
為了隱藏密碼,可以輸入命令:
>personal.unlockAccount(mc.accounts[0])
回車后提示輸入密碼,此時密碼不顯示出來,該命令默認將賬戶解鎖300秒。
成功解鎖會回傳true。此時會顯示發布合約確認界面。

注意:Data里必須有資料,否則不能正常部署
點擊“OK”,開始部署合約,界面下方會顯示當前部署合約的進度條

點擊成功部署的合約,可以看到基本內容,包括合約地址hash、被寫入的區塊號等。

登錄moac區塊鏈瀏覽器:http://explorer.moac.io/home。在tokens下拉框選擇“View ERC20”。

在搜索欄輸入合約地址,可以搜索到該合約的相應內容。

點擊進去,可以看到合約基本資訊、Token Transfers和Token Holders資訊。
注意:該步驟可能需要已經有交易才能在瀏覽器查詢。

至此,可以確認合約部署成功。
3.token的交易
3.1 查看合約狀態
點擊部署完畢的合約進度條上的“Test Token (管理頁面)”,進入合約管理界面。

管理界面的上半部分顯示基本資訊,頂部是合約地址,右邊有通用功能按鈕。主要包括:接收墨客和token、瀏覽器查看、拷貝地址、二維碼和顯示介面。
點擊“瀏覽器查看”,會跳轉到區塊瀏覽器并自動顯示合約查詢結果界面。
點擊“顯示介面”,跳出如下界面,顯示“合約JSON介面”。提示如果有其他人需要管理或操作這個智能合約,則需要把介面內容連同合約地址一并發送給他。

管理界面的下半部分顯示合約自身功能。

其中左邊顯示合約的讀操作,本例中主要包括name、發行總量等。
右邊為對合約的寫操作,除非有自己定義的功能,對于erc-20合約不經常用到。
3.2 查看token
點擊進入錢包的“CONTRACT”界面,會自動在查看合約(WATCH CONTRACT)和查看通證(WATCH TOKEN)顯示所有本節點部署的合約和token。點擊均可以進入相應管理和查看界面。

在賬戶界面,也能看到每個賬戶擁有的token情況。

進入發行該智能合約的主賬戶MAIN ACCOUNT,會顯示token資訊,及該賬戶擁有的token余額等。
3.3 交易
從錢包里擁有KFZT token的主賬戶,點擊“SEND”進入發送交易界面。
填入要接收的賬戶(“TO”)、選擇要發的代幣名稱(“KongFuZi Token”)、填入要交易的token數量(“AMOUNT”),點擊“SEND”

顯示發送資訊界面。

此處如果提示需要解鎖賬戶,參考前面2.2節的unlockAccount命令。

交易成功后會看到FROM賬號token數量減少。

而TO賬號相應token數量增加。

4.增加token
點擊主界面右上角“CONTRACTS”。
選擇最下面的“WATCH TOKEN”增加需要查看token。彈出增加界面。

輸入合約地址,然后點擊“OK”,會在界面自動增加該token,如果節點的賬號擁有該token,也會自動顯示出來。
附件:
本文所用合約代碼TestToken20.sol。
注意:該代碼為測驗實體使用,非通用智能合約代碼。
pragma solidity ^0.4.16;
contract Token{
function balanceOf(address _owner) public constant returns (uint256 balance);
function transfer(address _to, uint256 _value) public returns (bool success);
function transferFrom(address _from, address _to, uint256 _value) public returns (bool success);
function approve(address _spender, uint256 _value) public returns (bool success);
function allowance(address _owner, address _spender) public constant returns (uint256 remaining);
event Transfer(address indexed _from, address indexed _to, uint256 _value);
event Approval(address indexed _owner, address indexed _spender, uint256 _value);
}
contract TokenDemo is Token {
uint256 public totalSupply; //發行總量
string public name; //名稱,例如"My test token"
uint8 public decimals; //回傳token使用的小數點后幾位。比如如果設定為3,就是支持0.001表示.
string public symbol; //token簡稱,like MTT
function TokenDemo(uint256 initialAmount, string tokenName, uint8 decimalUnits, string tokenSymbol) public {
totalSupply = initialAmount * 10 ** uint256(decimalUnits); // 設定初始總量
balances[msg.sender] = totalSupply; // 初始token數量全部給予合約的創建者
name = tokenName;
decimals = decimalUnits;
symbol = tokenSymbol;
}
function transfer(address _to, uint256 _value) public returns (bool success) {
//默認totalSupply 不會超過最大值 (2^256 - 1).
//如果隨著時間的推移將會有新的token生成,則可以用下面這句避免溢位的例外
require(balances[msg.sender] >= _value && balances[_to] + _value > balances[_to]);
require(_to != 0x0);
balances[msg.sender] -= _value; //從訊息發送者賬戶中減去token數量_value
balances[_to] += _value; //往接收賬戶增加token數量_value
Transfer(msg.sender, _to, _value); //觸發轉幣交易事件
return true;
}
function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) {
require(balances[_from] >= _value && allowed[_from][msg.sender] >= _value && _value > 0);
balances[_to] += _value; //接收賬戶增加token數量_value
balances[_from] -= _value; //支出賬戶_from減去token數量_value
allowed[_from][msg.sender] -= _value; //訊息發送者可以從賬戶_from中轉出的數量減少_value
Transfer(_from, _to, _value); //觸發轉幣交易事件
return true;
}
function balanceOf(address _owner) public constant returns (uint256 balance) {
return balances[_owner];
}
function approve(address _spender, uint256 _value) public returns (bool success)
{
allowed[msg.sender][_spender] = _value;
Approval(msg.sender, _spender, _value);
return true;
}
function allowance(address _owner, address _spender) public constant returns (uint256 remaining) {
return allowed[_owner][_spender]; //允許_spender從_owner中轉出的token數,也就是授權
}
mapping (address => uint256) balances;
mapping (address => mapping (address => uint256)) allowed;
}
---------------------
作者:Li_Yu_Qing
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/31808.html
標籤:區塊鏈技術
上一篇:區塊鏈技術和易經的結合
