教你執行以太坊智能合約或轉賬

首發經驗乾貨,禁止轉載,轉載即視為同意支付作者1ETH(以太幣)每字的稿酬。

本文分兩種執行方式,手動和程序化。純乾貨,如果幫到了您,請點贊哦~

手動方式執行

現在常用的執行合約基本是進行轉賬,從一個地址把你辛苦賺(Hao)來的Token轉到另外的地址,那麼選擇手動方式是最便捷的。自己動手豐衣足食。

利用MyEtherWallet

我用過Solidity Remix IDE 和 MyEtherWallet, 還是MEW更小白友好,所以現在重點講解MEW的使用流程。

執行合約前需要準備的

* 合約地址 Contract Address

* 合約執行發出的錢包(可以提供一個發出地址和簽名交易的東東

* 合約執行接收地址 to Address

四步走發出合約交易

第一步:打開MEW網頁端 -> Contracts Tab

[MyEtherWallet.com · Your Key to Ethereum](MyEtherWallet.com · Your Key to Ethereum)

第二步:輸入合約相關信息

1. 輸入合約地址

2. 輸入ABI / JSON Interface

關鍵來了,怎麼找到一個合約的ABI?別著急,接著看。

進入這個地址 Ethereum Account 0x275b69aa7c8c1d648a0557656bce1c286e69a29d Info

(記得將地址替換成你想執行的合約地址)。此時你看到了這個合約的源代碼,在Contact ABI一欄, Copy。。之後就不用我說了吧,粘貼到 ABI /JSON Interface 就好。

3. 點擊 「Access」 讀取智能合約

第三步:執行合約方法

在這個界面選擇你要執行的合約方法,並且輸入相應參數。比如我只是想簡單的將Token從一個賬戶轉到另外一個賬戶,所以在這裡選擇Transfer。

第四步:提供發起賬戶

選擇好錢包後,點擊最後的 「Write」按鈕。這一步的操作其實是用你的地址發起這筆交易,別擔心這不是最後的交易授權,下一步進入簽名授權,發出。

第五步:授權發起

* 點擊「Write」後會看到以下彈框,注意:如果你不是要給合約發ETH,Amount一定要填寫0。智能合約在收到以太坊的時候會有不同的反應,良心合約會退回,另外一些合約,可能會使你的以太一去不復返。

* Gas Limit: 合約的執行操作可能比一般的轉賬要複雜 (一般轉賬Gas Limit為21000),所以這裡我一般用12000。 越複雜的合約,這個值要求越高。

* 一切確認無誤後,就點擊發起就好啦。

程序化方式執行

以下內容適合需要程序化執行智能合約的同學。為啥要程序化執行智能合約 ??♀?,嘿嘿,你懂的。

本教程不用自己搭節點,不用搭,不用搭,不用搭。搭以太坊節點不僅耗時(網路不好時要以天計算), 而且需要幾十G的硬碟空間,我的最低配的Mac Pro是需要刪除全部照片才能同步完。??

技術棧

* Web3js 1.x on Node.js v9.5

* 節點provider: INFURA

第一步: 安裝

首先,安裝Web3js, 和Node,這個就不用我教了吧~

Web3js 文檔:web3.eth - web3.js 1.0.0 documentation

第二步:配置環境

* 在Node環境下執行以下代碼配置好參數和環境

var Web3 = require(web3);web3 = new Web3(new Web3.providers.HttpProvider("https://mainnet.infura.io/YORUTOKEN"));var Tx = require(ethereumjs-tx);

* 確認環境可用,查看區塊高度確認成功連接節點。執行下面的代碼,如果返回正確的以太坊區塊數據,則說明可用。

web3.eth.getBlockNumber(console.log)

第三步:在Node環境下運行

* 複製下面函數代碼,在Node環境下調用

function execute_contract(fromAddr, fromAddrKey, toAddr, contractAddr, gasPrice, gasLimit){// construct the contract// refer the part 1 in this tutorial to get abi value of a contract var contract = new web3.eth.Contract(abi, contractAddress, { from: fromAddr, // default from address }); // construct Txweb3.eth.getTransactionCount(fromAddr).then( function(nonce){ var rawTx = { "from": fromAddr, "nonce": web3.utils.numberToHex(parseInt(nonce)), "gasPrice": gasPrice, "gasLimit": gasLimit, "to": contractAddr, "value": "0x0", // ether value, usually 0 "data": contract.methods.transfer(toAddr, transferAmount).encodeABI(), "chainId": 0x01 // mainnet chain };// sign and send var privateKey = new Buffer(fromAddrKey, hex); var tx = new Tx(rawTx); tx.sign(privateKey); var serializedTx = tx.serialize(); console.log(serializedTx.toString(hex)); web3.eth.sendSignedTransaction(0x + serializedTx.toString(hex)).on(transactionHash, function(hash){ console.log(Txn: + hash); }).on(receipt, function(receipt){ console.log(Receipt: + receipt); }); });};

注意事項:

* rawTx 所有參數都需要是Hex格式,在Web3.utils里會有可用的函數做轉換

* nonce是發出地址的交易數,一定要提供正確哦

* gasPrice 的單位是gwei, 所以8gwei的數字表示是8000000000

* to: 是合約地址

* 發交易時如果遇到以下錯誤,不用擔心,用log出的TXN ID 在 etherscan.io上查看進度。因為web3js的默認timeout值有點短,當你的gasprice * gaslimit比較小的時候,確認速度確實會比較慢。

> Unhandled rejection Error: Transaction was not mined within 50 blocks, please make sure your transaction was properly send. Be aware that it might still be mined!

* 以下錯誤可能是你的賬戶餘額不夠發送所需的交易費,確認一下賬戶餘額。或者是gasPrice, gasLimit設置錯誤。

> Unhandled rejection Error: Returned error: *insufficient funds for gas * price + value


推薦閱讀:

降低區塊鏈開發門檻,信和雲希望構建以太坊之外的另一種選擇
閃電網路:抓緊扶好,BTC要起飛了!
以太坊『大都會』硬分叉第一階段啟動,成功整合Zcash匿名技術
以太坊遇到Zcash?IPFS為何要計劃打造一個多區塊鏈瀏覽器
構建一個以太坊私有鏈(Windows版)

TAG:智能合約 | 以太坊 |