天天看點

Truffle 3.0部署智能合約至Ethereum節點(差別truffle部署智能合約到testrpc) Truffle 3.0部署智能合約至Ethereum節點

Truffle 3.0部署智能合約至Ethereum節點

原文   https://juejin.im/post/58f97521b123db41195481f3 轉載  http://www.tuicool.com/articles/RFbQvyq

以下内容全是都是建立在MacOS X平台上,在正式開始此之前,希望你對BlockChain的内容有所了解,對truffle,contract,Solidity,web3.js等概念有所認識,假如毫無概念,那麼請嚴格按照以下步驟順序操作

準備工作

Truffle 3.X安裝

Truffle安裝教程

安裝truffle之前確定你已經安裝了Nodejs環境,推薦NodeJS 5.0+。建立終端,執行:

$ npm install -g truffle

Ethereum安裝

Ethereum安裝教程

安裝之前確定你安裝了Homebrew

建立終端,執行:

brew tap ethereum/ethereum
    brew install ethereum      

建立節點和賬戶

  • BlockChain-在一台電腦上部署多個節點
  • BlockChain --- 賬号間的交易

正式開始

建立項目

建立檔案夾,命名為 

truffleProject

 ,然後建立一個終端,我們将其命名為終端1,從終端1進入此檔案夾下,執行:

truffle init

此時 

truffleProject

 檔案夾下會出現 

contracts

migrations

test

 三個檔案夾和 

truffle.js

 檔案

編寫合約

contracts

 就是智能合約存放的目錄,預設情況下已經幫你建立好 

ConvertLib.sol

MetaCoin.sol

Migrations.sol

 合約,不用管它

在 

contracts

 檔案夾下建立一個新檔案 

Test.sol

 ,檔案内容如下:

pragma solidity ^0.4.4;
contract Test {
    function multiply(uint a) returns(uint d) {
        return a * ;
    }
}      

合約内容很簡單,就是輸入一個整數,傳回它乘以7的結果

修改配置

修改 

migrateions

 檔案中 

2_deploy_contracts.js

 的内容,如下:

var Test = artifacts.require("./Test.sol");

module.exports = function(deployer) {
  deployer.deploy(Test);
};      

修改 

truffle.js

 的檔案内容如下:

module.exports = {
  networks: {
    live: {
      host: "localhost", //本地位址,因為是在本機上建立的節點
      port: ,        //Ethereum的rpc監聽的端口号,預設是8545
      network_id:     // 自定義網絡号
    }
  }
};
           

我們把合約部署在自己的私有網絡上,是以自定義網絡号。解釋一下,Ethereum本身有一個主網絡,假如你的節點沒有連接配接到這個網絡上去,那意味着你建立的是私有的Ethereum網絡。network_id的設定可參見: https://github.com/ethereum/go-ethereum/wiki/Command-Line-Options

啟動節點

建立一個終端,我們稱為終端2,輸入:

geth --identity "newEth" --rpc --rpccorsdomain "*" --datadir "你的節點的path" --port 30303 --rpcapi "db,eth,net,web3" --networkid 999 console

把上面指令中的 

“你的節點的path”

 替換成你自己建立的節點的目錄,例如 

“/Users/JerryMissTom/Documents/blockchain/node1”

 。注意, 

network-id

 後的内容 

999

 和你上面在 

truffle.js

 檔案中設定的保持一緻

解鎖賬戶:

部署之前必須先解鎖賬戶,不然會報錯 

Error encountered, bailing. Network state unknown. Review successful transactions manually.

在終端2上輸入如下指令來解鎖賬戶:

personal.unlockAccount("0x4c00224faec439c08abe669bd2b15e3530a6e754", "111111", 10000)

其中 

"0x4c00224faec439c08abe669bd2b15e3530a6e754"

 是賬戶位址,需要替換成你的,假如不知道,可先在終端2上輸入:

personal.listAccounts

會傳回你目前所有的賬戶,選擇第一個就好,假如不存在,則建立賬戶,見準備工作中的 

建立節點和賬戶

 的内容。 

"111111"

 是賬戶相對應的密碼, 

10000

 是解鎖時間。

部署合約

切換到終端1,編譯合約,輸入:

truffle compile

此時 

truffleProject

 檔案夾下會多出一個 

build

 檔案夾

然後部署合約,輸入:

truffle migrate --network live

沒有錯誤的話,終端1上會出現:

Running migration: 1_initial_migration.js
  Deploying Migrations...      

geth的控制台,也就是終端2上,會出現:

I0421 10:29:58.671910 internal/ethapi/api.go:1141] Tx(x66643d8dd37a4d8c8b13ad6aa933cb069fb30eae5e3a6e1b4309496d34b9c17a) created: 0x8b6deb996f11d9d463d5db3d2bd4de9193c1a14f      

合約正在部署,在終端2上輸入: 

txpool.status

結果是

{
  pending: ,
  queued: 
}
           

表明有一個交易在等待确認,需要繼續挖礦,把交易打包到下一個區塊,在終端2上繼續執行:

miner.start()

現在等待一段時間,成功部署後,會在終端1上出現:

Running migration: _initial_migration.js
  Deploying Migrations...
  Migrations: x8b6deb996f11d9d463d5db3d2bd4de9193c1a14f
Saving successful migration to network...
Saving artifacts...
Running migration: _deploy_contracts.js
  Deploying Test...
  Test: x98cd084074fe3f15890c55822070ac8274d8f7f6
Saving successful migration to network...
Saving artifacts...      

表明部署成功

在終端2上執行: 

miner.stop()

 ,停止挖礦

調用合約

打開 

truffleProject/build/contracts/Test.json

 檔案,内容如下:

{
  "contract_name": "Test",
  "abi": [
    {
      "constant": false,
      "inputs": [
        {
          "name": "a",
          "type": "uint256"
        }
      ],
      "name": "multiply",
      "outputs": [
        {
          "name": "d",
          "type": "uint256"
        }
      ],
      "payable": false,
      "type": "function"
    }
  ],
  "unlinked_binary": "0x6060604052346000575b6077806100176000396000f300606060405263ffffffff60e060020a600035041663c6888fa181146022575b6000565b34600057602f6004356041565b60408051918252519081900360200190f35b600781025b9190505600a165627a7a72305820cf7ecb7716fc2496cf81a1249a8d74354554a193016fbeb30b18f473a6b989090029",
  "networks": {
    "999": {
      "events": {},
      "links": {},
      "address": "0x98cd084074fe3f15890c55822070ac8274d8f7f6",
      "updated_at": 
    }
  },
  "schema_version": "0.0.5",
  "updated_at": 
}      

把abi内容拿出來先線上壓縮,然後在終端2中輸入:

abi=[{"constant":false,"inputs":[{"name":"a","type":"uint256"}],"name":"multiply","outputs":[{"name":"d","type":"uint256"}],"payable":false,"type":"function"}]      

結果顯示:

[{
    constant: false,
    inputs: [{
        name: "a",
        type: "uint256"
    }],
    name: "multiply",
    outputs: [{
        name: "d",
        type: "uint256"
    }],
    payable: false,
    type: "function"
}]      

建立合約的執行個體,在終端2中繼續輸入:

test=eth.contract(abi).at("0x98cd084074fe3f15890c55822070ac8274d8f7f6")      

其中 

"0x98cd084074fe3f15890c55822070ac8274d8f7f6"

 就是合約存儲的位址,可以在 

truffleProject/build/contracts/Test.json

 中找到.

在終端2中輸入:

test.multiply.call(3)

結果會顯示:

21

總結

之前已經知道如何使用Truffle編寫和編譯智能合約,在TestRPC上運作官方的例子,也知道如何建立Ethereum節點和賬戶,最後卡在如何使用Truffle合約部署在我建立的私有鍊上。現在終于解決這個問題,下一步就是研究如何與合約進行通信。

繼續閱讀