本文的目的是通过代码的方式展示如何开发一个能够编译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的代码:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <meta http-equiv="x-ua-compatible" content="ie=edge"> <link rel="stylesheet" href="/css/bootstrap.min.css"> <link rel="stylesheet" href="/css/codemirror.css"> <style type="text/css"> .CodeMirror { height: auto; } </style> </head> <body> <div class="container"> <div class="row"> <div class="col-md-6"> <br> <textarea id="editor"></textarea> <br> <span id="errors"></span> <button type="button" id="compile" class="btn btn-primary">Compile</button> </div> <div class="col-md-6"> <br> <form> <div class="form-group"> <label for="address">Address</label> <input type="text" class="form-control" id="address" placeholder="Prefixed with 0x"> </div> <div class="form-group"> <label for="key">Private Key</label> <input type="text" class="form-control" id="key" placeholder="Prefixed with 0x"> </div> <hr> <div id="arguments"></div> <hr> <button type="button" id="deploy" class="btn btn-primary">Deploy</button> </form> </div> </div> </div> <script src="/js/codemirror.js"></script> <script src="/js/main.js"></script> </body> </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相关的函数。