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


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

  • 相关阅读:
    编码转换,基础补充,深浅拷贝,id is == ,代码块(了解),小数据池(了解)
    字典(dict),字典的嵌套,集合(set)
    列表,列表的增删改查,列表的嵌套,range
    整数,布尔值,字符串,字符串详解.
    [小明学Shader]4.自定义光照----RampTexture
    [小明学Shader]3.自定义光照,半拉姆伯特
    [小明学Shader]2.理解Shader和Material的关系
    [小明学Shader]1.Diffuse
    [UGUI]你说UnityEngine.UI.Button是怎么通过拖动来增加OnClick的监听器的呢?
    [小明也得懂架构]1.架构初探
  • 原文地址:https://www.cnblogs.com/gzhlt/p/10035165.html
Copyright © 2020-2023  润新知