准备工作

  • 根据上一篇blog搭建私链
  • 下载 remix-ide,我们这里要下载gh-pages分支,该分支为最新的稳定的build。remix-ide是一个用来编译运行智能合约的ide工具

启动私链节点

相比于上一篇blog提到的启动命令,这里加入rpc相关的参数

$ geth --datadir "$ethereum_home/eth2" --port 30304 --nodiscover --networkid 1234 --rpcport 8545 --rpccorsdomain "*" --unlock 0 console 2>>eth2.log

”–unlock 0”表示要求unlock eth.accounts[0],在提示输入Passphrase后就会解锁eth.accounts[0]

配置remix-ide

  • Run->Environment: Web3 Provider
  • Web3 Provider Endpoint: http://localhost:8545

新建一个solidity源文件

simple.sol

pragma solidity ^0.4.0;

contract Adder {
    string name;
    
    function setName(string _name) public {
        name = _name;
    }
    
    function getnName() public constant returns (string) {
        return name;
    }
    
    function add(int a, int b) public constant returns (int) {
        return a + b;
    }
}

点击ide上的create按钮,如果上面geth命令没有带上”–unlock 0”就会看到”creation of Adder errored”,需要我们unlock Account。 否则会看到”creation of Adder pending…“字样

如上图所示我们看到”1 pending transactions”,这是因为是一个transaction,需要写入区块链才能生效,所以我们需要开启挖矿miner.start(), 执行之后,我们会看到如下图所示结果 从图中我们可以看出,remix-ide中会把需要tranaction写入区块的操作都显示成粉色按钮,这些操作都需要执行挖矿之后才能生效。

从geth console调用智能合约

我们可以从remix-ide上调用Adder中的方法,但是transaction操作需要执行挖矿才能进行,否则Transaction将一直处于pending状态; 同样我们可以在geth console上调用智能合约。我们需要拷贝下图中所示的ABI内容和上图中的Adder Address,分别赋值给变量abi和address。

> var abi=[{"constant":true,"inputs":[],"name":"getName","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"a","type":"int256"},{"name":"b","type":"int256"}],"name":"add","outputs":[{"name":"","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"string"}],"name":"setName","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]
> var address="0x3bf0b1d614df44a610865d62edc27bae12204c55"
> var adder=eth.contract(abi).at(address)
> eth.defaultAccount=eth.accounts[0]
> personal.unlockAccount(eth.defaultAccount)
> adder.setName("Bob")
> eth.pendingTransactions
[{
    blockHash: null,
    blockNumber: null,
    from: "0xd870d9a0cbfa37a53563f12a783fb697027f5668",
    gas: 90000,
    gasPrice: 18000000000,
    hash: "0xef6837fcd5a92720013c964ccc634957635bd71b00281b01c49f8293fdcba93a",
    input: "0xc47f002700000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000003426f620000000000000000000000000000000000000000000000000000000000",
    nonce: 15,
    r: "0xf736b15dd5741a6b95ed6b901eda7c673d27ff8ed02bb536035044523984476a",
    s: "0x24c6c4e5d12997f234fd5ef92503928dcccc4330574d243fca6ccf9d30465711",
    to: "0x3bf0b1d614df44a610865d62edc27bae12204c55",
    transactionIndex: 0,
    v: "0x1c",
    value: 0
}]
> miner.start()
> eth.pendingTransactions
[]
> miner.stop()