首次接触智能合约遇到的坑

Author Avatar
patrickcty 12月 03, 2017

在很多的教程中,都是使用如下方法来编译 sol 代码:

contract = eth.compile.solidity(contractSource).test

但这样会报错:

Error: The method eth_getCompilers does not exist/is not available

原因在于在最新的 API 中这个方法已经被抛弃了,因此我们只能手动编译代码再创建一个合约类了。

编译的方法可以直接用 solc 命令来编译,不过直接在 remix——可以看做一个在线的 Solidity IDE 中编译会比较方便。

编译之后记录下 abi 以及编译后的二进制代码,然后使用下面语句初始化智能合约类:

yourContract = web3.eth.contract(your_abi)

再用智能合约类来创建一个智能合约的实例并且部署到区块链上:

var ss = browser_ballot_sol_smartsponsorContract.new(
   _benefactor,  // 接受钱的人
   {
     from: therunner,  // 智能合约发起者 
     data: theBinaryCode
     gas: '4700000'  // 需要的手续费
   }, function (e, contract){
    console.log(e, contract);
    if (typeof contract.address !== 'undefined') {
         console.log('Contract mined! address: ' + contract.address + ' transactionHash: ' + contract.transactionHash);
    }
 })

之后就只需要使用 loadScript 来加载出合约了。

注意:当合约已经被部署到区块链上就不能再修改了,如果要再次访问就要通过 abi 与 address 了,如果不记得这些的话就无法再次访问到合约了。

无法正常连接

在之前的教程中我们要使用 geth attach 命令来连接到相应的网络中,但是直接使用这个命令的话会提示无法找到 ipc 文件。

报错的原因在于直接使用这条命令连接的默认的公有链,但是我们想连接的是自己定义的私有链,因此我们要用私有链接的 ipc 来进行连接。

首先要启动我们的私有连,在启动之后会有如下的提示信息:

IPC endpoint opened: /Users/patrick/Music/BlockChain/data/geth.ipc
Welcome to the Geth JavaScript console!

instance: Geth/v1.7.2-stable-1db4ecdc/darwin-amd64/go1.9
coinbase: 0xea21220a7ab78b50107734d7a4a6ca19cc39f595
at block: 139 (Fri, 01 Dec 2017 23:55:34 CST)
datadir: /Users/patrick/Music/BlockChain/data
modules: admin:1.0 debug:1.0 eth:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0

这里第一行的 ipc 就是我们所需要的私有链的地址,然后使用如下命令就可以连接上私有链了:

> geth attach ipc:/the/path/of/the/ipc