本文的目的是通过代码的方式展示如何开发一个能够编译solidity智能合约并且能发布的平台。
1.solcJs
solidity文件通过solc来编译的,安装solcjs,他使用javascript的方式编译合约。安装比较简单
安装solcjs:
npm install -g solc
我安装的时候默认安装的solc是0.4.8,这个版本对应的是合约头上面 pargma solidity 0.4.8;可以根据需要安装版本。
solcJs api
compiler: solcjs 提供compiler方法编译solidity合约。 使用compiler有两种情况:
1.合约没有import,即没有引用其他合约,这个方法有两个参数,一个是合约源码,一个是boolean,是否优化字节码。如果源码中包含了多个合约则全部编译
2.合约中有import。第一个参数就是一个对象,key是import的文件名称,value是对应的文件内容。所以无论何时编译器看到一个import语句,它不会在文件系统中寻找文件,而是通过与文件名匹配的键在对象中寻找文件内容。
solcjs提供了使用不同版本的solidity的方法。userVersion:
var solc =require("solc");var solcv23 =solc.useVersion("v0.4.23.commit");
更新abi 因为solidity的不同版本功能导致可能不同版本编译器编译出来的abi是不同的,所以需要一个更新ABI的接口
创建部署合约平台
好了,理论讲完,进入正题。
首先启动一个geth网络:
geth --networkid 15 --dev --dev.period 1 --rpc --rpcapi "db,eth,net,web3,miner,personal,txpool" --rpccorsdomain "*" --rpcaddr "0.0.0.0" --rpcport "8545" console 2>>log
这个命令一点要记得添加 txpool,这个后面会用到,笔者因为没有加这个折腾了好久。
项目结构:
app.js 先是定义一个普通的node服务,然后定义了两个方法:compile和deploy,编译和发布。
先贴一下前端页面index.html的代码:
app.js中的compile实现:
app.get("/compile", function(req, res){ var output = solc.compile(req.query.code, 1); res.send(output);})
调用solc的compile的方法,第一个参数是solidity合约,第二个是是否优化字节码。调用res.send 返回页面做处理。
下一章介绍deploy相关的函数。