接續上一篇。
儘管文件流程底層、金流、Line 與 FB 機器人、支援價值流體系的代幣系統建置完成;在生態建立完整之前,關閉代幣系統的交易機制仍舊是比較安全的作法。剛好以此為例,來說明對於一個已經部署完成的智慧合約,如何進行操作。
取用既有合約,有兩個方法:
一、延續上篇,當合約部署完成,名稱為 contract;下一個區塊挖出之前,只得到其交易序號 transactionHash。等到區塊挖出之後,可以透過下列在控制台內的指令,直接取用合約:
loadScript(‘abi’); // 如果還沒載入
var tx = contract.transactionHash;
var address = eth.getTransactionReceipt(tx).contractAddress;
var contract = abi.at(address);
二、一個已經部署的合約,可以在 etherscan.io 上找到這個合約的位址。舉 LTW 代幣為例,在首頁右上方的空格中,鍵入 LTW,就可以找得到。
合約位址為 0x63f40b2e061d231cd49c32f6b5afef17993c2c1d。
接著在控制台內執行下列指令:
loadScript('abi’); // 如果還沒載入
var address = ‘0x63f40b2e061d231cd49c32f6b5afef17993c2c1d’;
var contract = abi.at(address);
就能取用合約 contract。接著參照其 abi 檔案,獲得該合約的取用介面。
由於 LTW 使用代理合約的方式,合約位址不是合約主體所在;加上生態尚未完成,代幣還沒有真正運作,所以合約原始碼不在 etherscan.io。
不過在交易機制中,存在 buyPrice 和 sellPrice 這兩個變數,以及 setPrices() 這個方法;現在我們可以來看看如何取用這三個介面。
首先可以查看買價與賣價的值:
contract.buyPrice(); // 透過方法取用變數
contract.sellPrice(); // 透過方法取用變數
因為關閉了交易機制,所以這兩個值現在都顯示為 0。
而在稍早,我們花費了 gas 進行了如下設定:
contract.setPrices(0,0,{gasPrice:gas_price,from:eth.accounts[0]});
其中,
- setPrices: 合約內設定買價與賣價的介面方法。
- 0,0: 分別為所要設定的買價和賣價的值。
- gasPrice: 給定的 gas 價格;gas 是操作合約的成本。稍後我們討論如何取得最低的 gas 價格。
- from: 操作的帳戶。
這樣就透過合約的介面完成設定操作。
當然這個介面只有獲得授權者才能取用。在公開的環境之下,智慧合約的安全設計至關重要,不過這是另外一個將來討論的議題。
接下來是如何取得最便宜的 gas 價格進行合約的操作。首先參照這個網站頁面:
https://ethgasstation.info/txPoolReport.php
第一行 gas 價格,單位是 Gwei;最後一行和倒數第四行,分別列出目前在鏈上,對應的 gas 價格,在 30 分鐘與 5 分鐘之內,還積存著未被挖出的交易。
從這個即時資訊,就可以獲知最適 gas 價格,進行上述 gasPrice 的設定。
實際交易計算量所耗費的 gas 數量,乘上 gas 價格之後,就是所花費的成本。
如果在發出交易之後,gas 的價格提升,導致交易沒有辦法很快地完成,可以透過對 nonce 的設定,重新再發一條交易加以覆蓋。因為是更進階的操作,需要的人可以透過 nonce 這個關鍵字搜尋,或者交流討論。