【以太坊开发】如何开发一个编译以太坊智能合约并且发布的平台(一)

本文的目的是通过代码的方式展示如何开发一个能够编译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相关的函数。

posted @ 2018-11-28 21:44  像我这样的人  阅读(875)  评论(0编辑  收藏  举报