在以太坊上私链上实现一个简单的合约

区块链开发-3

Posted by shamphone on September 6, 2016
本博客转移到 Cocolian 上, 请访问 Cocolian 获取最新更新。 谢谢!

本文是针对以太坊开发入门的教程。 纯开发人员版本。关于以太坊相关概念,比如合约、交易、以太币等,参考官方文档,或者中文版

开发合约,需要一个编译器。 就像开发Java程序一样,需要javac将文本代码变成可执行的代码。 最常用的是solidity编译器。

首先是准备开发和运行环境。这里我还是使用两台机器来跑,一台机器挖矿,一台机器运行合约。 整个环境都是在私链中运行的。

如何安装环境,挖矿,参考前两篇文章:

安装solidity

启动geth,首先检查是否安装了solidity。

> eth.getCompilers();
["Solidity"]

如果返回值是空的,先用where solc看看是否已经安装了,如果没有,则安装下solidity编辑器:

sudo apt-get install solc

安装完成之后,再运行上述命令,应该能看到结果了。

安装一个合约

首先,写一个简单的合约代码,将输入的值 乘以 7 ,输出来,代码如下:

> source = "contract test { function multiply(uint a) returns(uint d) { return a * 7; } }"
"contract test { function multiply(uint a) returns(uint d) { return a * 7; } }"

使用solidity编译下这个代码,生成合约:


> contract = eth.compile.solidity(source).test
{
  code: "0x606060405260308060106000396000f3606060405260e060020a6000350463c6888fa18114601c575b6002565b346002576007600435026060908152602090f3",
  info: {
    abiDefinition: [{
        constant: false,
        inputs: [...],
        name: "multiply",
        outputs: [...],
        payable: false,
        type: "function"
    }],
    compilerOptions: "--combined-json bin,abi,userdoc,devdoc --add-std --optimize",
    compilerVersion: "0.4.0",
    developerDoc: {
      methods: {}
    },
    language: "Solidity",
    languageVersion: "0.4.0",
    source: "contract test { function multiply(uint a) returns(uint d) { return a * 7; } }",
    userDoc: {
      methods: {}
    }
  }
}

编译结果各个标签说明如下:

  • Code : 编译的以太坊虚拟机字节代码
  • Info : 从编译器输出的额外元数据
  • Source : 源代码
  • Language : 合约语言 (Solidity,Serpent,LLL)
  • LanguageVersion : 合约语言版本
  • compilerVersion : 用于编译这个合约的solidity编译器版本。
  • abiDefinition: 应用的二进制界面定义
  • userDoc : 用户的NatSpec Doc。
  • developerDoc : 开发者的NatSpec Doc。

创建合约并将合约部署到区块链上:


//打开账户
primaryAccount = eth.accounts[0];
personal.unlockAccount(primaryAccount, "密码");

//创建合约对象

var MyContract = eth.contract(contract.info.abiDefinition)

// 将合约代码保存到文件上,这一步可以略过。 
//contenthash = admin.saveInfo(contract.info, "~/info.json")

// 保存合约到区块链上。输出一行日志, 将部署的地址打印出来。 
var mycon = MyContract.new({from: primaryAccount, data: contract.code}, function(error, contract){
	if(!error && contract.address) {
	 console.log("Contract mined! address: " + contract.address + " transactionHash: " + contract.transactionHash);
		 }
 });

这里要特别注意, MyContract.new 会将合约部署到区块链上,这个操作依赖于挖矿行为,要一直等到矿工将合约部署到区块上,才可以进入下一步。 看到这一行数据,才说明部署成功:

> Contract mined! address: 0xff6b454f8454eafc969267cb873e37621d5bedc4 transactionHash: 0xffec10839c9939b2fdd23f2bb9156cf513e239b0862e53fa067f8c116e75cb21

特别注意这里的address,这是合约的部署地址,下面我们要用到这个地址:


//合约的部署地址;

var address = "0xff6b454f8454eafc969267cb873e37621d5bedc4";

var Multiply = web3.eth.contract([{constant:false,inputs:[{name:'a',type:'uint256'}],name:'multiply',outputs:[{name:'d',type:'uint256'}],type:'function'}]);

var myMultiply = Multiply.at(address);

myMultiply.multiply.call(9);

最终能看到输出结果是 63。 这说明调用成功了。而这一块代码,可以放到任何一台以太坊客户端来执行。 这样以太坊最核心的几个概念,在这三篇文档中都介绍完毕。

后续我们研究如何使用以太坊来做一些激动人心的事情。 头条的同学们,记得帮忙点赞啊。


感谢您对本文的关注,如需要及时收到凤凰牌老熊的最新作品,或者有相关问题探讨,请扫码关注“凤凰牌老熊”的微信公众号,在公众号里留言或者回复,可以尽快处理,谢谢。

本文欢迎转载,转载时请注明本文来自 微信公众号“凤凰牌老熊”。