编写合约
创建一个私有链 https://www.jianshu.com/p/48e3073099b4
pragma solidity ^0.4.0;
contract SimpleStorage {
uint storedData;
function set(uint x) {
storedData = x;
}
function get() constant returns (uint) {
return storedData;
}
}
编译合约
- 打开 https://remix.ethereum.org
- 将上述代码拷贝到编辑框
-
点击Details,复制WEB3DEPLOY中的代码
发布合约
- 提交合约
将WEB3DEPLOY中的代码粘贴到ethe console中,并回车执行 - 挖矿来让合约发布到私链区块中
miner.start()
miner.stop()
调用合约函数
下面我们调用set来为状态变量storedData赋值。由于我们的set函数是要改写链上数据的,所以需要使用sendTransaction来调用。为了使用sendTransaction来调用链上合约,首先我们需要获得函数的签名的函数选择器(Function Selector)。将函数签名传入sha3函数生成hash256,hash的前4个字节即函数选择器的值。
在geth命令行输入如下命令,获取set函数哈希:
web3.sha3("set(uint256)")
设置变量值,执行
eth.sendTransaction({from:eth.accounts[0], to:simplestorage.address, value:0, data:"0x60fe47b10000000000000000000000000000000000000000000000000000000000001234"})
其中
simplestorage是编译合约时生成的contract实例,from:为调用者的账户。
to:为合约地址。
value:由于此调用的目的不是转账,所以此值为0。
data: 描述了调用那个函数及使用什么参数。格式为:前4个字节为函数选择器。这里是要调用set函数所以为0x60fe47b1,后面紧跟着参数。由于set的参数只有一个uint(uint256),字长为32字节。这里设置的值为0x1234。
挖矿来使函数调用得以执行,
执行
miner.start()
挖一小会儿后,执行
miner.stop()
最后,查看结果,执行
eth.getStorageAt(simplestorage.address,0)
返回值为0x1234,说明调用set函数成功,或
simplestorage.get()
返回值为0x1234的十进制4660。