在本地私链上运行智能合约
访问量:
准备工作
- 根据上一篇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()