Truffle 3.0智能合約部署與調用筆記

本文記錄在trffle3.0下建立、編譯、部署並調用以太坊智能合約的整個過程。node

新建項目

新建文件夾,命名爲truffleProject,而後新建一個終端,咱們將其命名爲終端1,從終端1進入此文件夾下,執行:web

truffle init

此時truffleProject文件夾下會出現contracts migrations test 三個文件夾和truffle.js文件json

編寫合約

contracts 就是智能合約存放的目錄,默認狀況下已經幫你建立好ConvertLib.sol MetaCoin.sol Migrations.sol合約,不用管它。api

在contracts文件夾下建立一個新文件Test.sol,文件內容以下:網絡

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

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

修改配置

修改migrateions文件中2_deploy_contracts.js的內容,以下:dom

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

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

修改truffle.js的文件內容以下:ide

module.exports = {
  networks: {
    live: {
      host: "localhost", //本地地址,由於是在本機上創建的節點
      port: 8545,        //Ethereum的rpc監聽的端口號,默認是8545
      network_id: 999    // 自定義網絡號
    }
  }
};

咱們把合約部署在本身的私有網絡上,因此自定義網絡號。解釋一下,Ethereum自己有一個主網絡,假如你的節點沒有鏈接到這個網絡上去,那意味着你創建的是私有的Ethereum網絡。ui

啓動節點

新建一個終端,咱們稱爲終端2,輸入:.net

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是解鎖時間。 部署合約以前要保證你的帳戶裏有餘額,使用

eth.getBalance("0x4c00224faec439c08abe669bd2b15e3530a6e754")

查看餘額,假如爲0,則先執行miner.start()進行挖礦,等待一段時間執行miner.stop(),挖礦中止,繼續查詢餘額,不爲0,可進行下一步。

部署合約

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

~$ truffle compile

此時truffleProject文件夾下會多出一個build文件夾。 而後部署合約,輸入:

~$ truffle migrate --network live

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

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

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

Tx(0x66643d8dd37a4d8c8b13ad6aa933cb069fb30eae5e3a6e1b4309496d34b9c17a) created: 0x8b6deb996f11d9d463d5db3d2bd4de9193c1a14f

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

> txpool.status

結果是

{
  pending: 1,
  queued: 0
}

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

> miner.start()

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

Running migration: 1_initial_migration.js
  Deploying Migrations...
  Migrations: 0x8b6deb996f11d9d463d5db3d2bd4de9193c1a14f
Saving successful migration to network...
Saving artifacts...
Running migration: 2_deploy_contracts.js
  Deploying Test...
  Test: 0x98cd084074fe3f15890c55822070ac8274d8f7f6
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": 1492742008225
    }
  },
  "schema_version": "0.0.5",
  "updated_at": 1492742008225
}

把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

相關文章
相關標籤/搜索