发布第一个合约

编写合约

创建一个私有链 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。

你可能感兴趣的:(发布第一个合约)