Solidity编译器和简单调试

区块链技术巴比特2018-07-23 16:44:48  阅读 -评论 0

1 安装Solidity编译器

1.1 通过docker安装Solc

搜索docker的Solc镜像

docker search –no-trunc ethereum/solc

通过docker安装Solc

docker pull docker.io/ethereum/solc:stable

1.2 运行Solc容器

运行如下命令

docker run –rm -it –privileged=true –net=host -v /home/hpbroot/ethereum_go/contract:/contract –name solc ethereum/solc:stable –version

查看是否成功

2 新建spring boot工程

2.1 通过Eclipse新建工程

首先,新建ContractCompile工程

在springboot配置文件application.properties中添加如下

1web3j.contract.solcCmd=docker run --rm -it --privileged=true --net=host -v /home/hpbroot/ethereum_go/contract:/contract --name solc ethereum/solc:stable 2在pom文件添加依赖 3<dependency> 4    <groupId>org.ethereum</groupId> 5    <artifactId>solcJ-all</artifactId> 6    <version>0.4.10</version> 7</dependency>

新建ContractConfig类

1@Component 2@ConfigurationProperties(prefix = "web3j.contract") 3public class ContractConfig { 4    private String solcCmd; 5    public String getSolcCmd() { 6        return solcCmd; 7    } 8    public void setSolcCmd(String solcCmd) { 9        this.solcCmd = solcCmd; 10    } 11}

2.2 调用智能合约编译器的代码

1String soliditySrcCode =MapUtils.getString(preParam, "soliditySrcCode"); 2if(StringUtils.isBlank(soliditySrcCode)) { 3    param.put(ContractConstant.RETURN_CODE, ContractConstant.ERROR_CODE); 4    param.put(ContractConstant.RETURN_MSG, ContractConstant.NOSRCCODE); 5    return param; 6} 7SolidityCompiler solidityCompiler = SolidityCompiler.getInstance(getLog(),contractConfig.getSolcCmd()); 8byte[] source = soliditySrcCode.getBytes(StandardCharsets.UTF_8); 9CompilerResult compilerResult = solidityCompiler.compileSrc(source, 10SolidityCompiler.Options.ABI, SolidityCompiler.Options.BIN); 11param.put(ContractConstant.RETURN_CODE, ContractConstant.SUCCESS_CODE); 12param.put(ContractConstant.RETURN_MSG, ContractConstant.SUCCESS_MSG); 13if(compilerResult.isFailed()) { 14    param.put(ContractConstant.RETURN_CODE, ContractConstant.ERROR_CODE); 15    param.put(ContractConstant.RETURN_MSG, compilerResult.getErrors()); 16}

2.3 调用编译智能合约源文件的代码

2.3.1 编写智能合约源码

1contract SampleRecipientSuccess { 2  address public from; 3  uint256 public value; 4  address public tokenContract; 5  bytes public extraData; 6  event ReceivedApproval(uint256 _value); 7  function receiveApproval(address _from, uint256 _value, address _tokenContract, bytes _extraData) { 8    from = _from; 9    value = _value; 10    tokenContract = _tokenContract; 11    extraData = _extraData; 12    ReceivedApproval(_value); 13  } 14}

2.3.2 通过HTTP调用智能合约的J2EE组件

1String contractPath="/SampleRecipientSuccess.sol"; 2        String contractString = FileUtils.readFileToString(new File(contractPath),StandardCharsets.UTF_8); 3        HashMap hashMap = new HashMap(); 4        hashMap.put("soliditySrcCode", contractString); 5        String url = "http://192.168.3.43:18080/ContractCompile/compileContractCmd"; 6        ResponseEntity postForEntity = getRestTemplate().postForEntity(url, hashMap, Map.class); 7        Map body = postForEntity.getBody(); 8        String returnCode = MapUtils.getString(body, ContractConstant.RETURN_CODE); 9        if(ContractConstant.SUCCESS_CODE.equals(returnCode)) { 10            String result = MapUtils.getString(body, "result"); 11            Map parseResult = parseResult(result); 12            System.out.println(AppObjectUtil.toJson(parseResult)); 13        }

2.3.3 智能合约编译器组件返回的编译数据

1{ 2    "abis": [{ 3        "constant": true, 4        "inputs": [], 5        "name": "value", 6        "outputs": [{ 7            "name": "", 8            "type": "uint256" 9        }], 10        "payable": false, 11        "type": "function" 12    }, { 13        "constant": true, 14        "inputs": [], 15        "name": "tokenContract", 16        "outputs": [{ 17            "name": "", 18            "type": "address" 19        }], 20        "payable": false, 21        "type": "function" 22    }, { 23        "constant": true, 24        "inputs": [], 25        "name": "extraData", 26        "outputs": [{ 27            "name": "", 28            "type": "bytes" 29        }], 30        "payable": false, 31        "type": "function" 32    }, { 33        "constant": false, 34        "inputs": [{ 35            "name": "_from", 36            "type": "address" 37        }, { 38            "name": "_value", 39            "type": "uint256" 40        }, { 41            "name": "_tokenContract", 42            "type": "address" 43        }, { 44            "name": "_extraData", 45            "type": "bytes" 46        }], 47        "name": "receiveApproval", 48        "outputs": [], 49        "payable": false, 50        "type": "function" 51    }, { 52        "constant": true, 53        "inputs": [], 54        "name": "from", 55        "outputs": [{ 56            "name": "", 57            "type": "address" 58        }], 59        "payable": false, 60        "type": "function" 61    }, { 62        "anonymous": false, 63        "inputs": [{ 64            "indexed": false, 65            "name": "_value", 66            "type": "uint256" 67        }], 68        "name": "ReceivedApproval", 69        "type": "event" 70    }], 71    "bin":  72    "6060604052341561000c57fe5b5b6103d38061001c6000396000f300606060405263ffffffff60e 73    060020a6000350416633fa4f245811461004d57806355a373d61461006f578063609d33341461009 74    b5780638f4ffcb11461012b578063d5ce338914610199575bfe5b341561005557fe5b61005d6101c 75    5565b60408051918252519081900360200190f35b341561007757fe5b61007f6101cb565b6040805 76    1600160a060020a039092168252519081900360200190f35b34156100a357fe5b6100ab6101da565 77    b6040805160208082528351818301528351919283929083019185019080838382156100f1575b805 78    1825260208311156100f157601f1990920191602091820191016100d1565b5050509050908101906 79    01f16801561011d5780820380516001836020036101000a031916815260200191505b50925050506 80    0405180910390f35b341561013357fe5b604080516020600460643581810135601f8101849004840 81    285018401909552848452610197948235600160a060020a039081169560248035966044359093169 82    594608494929391019190819084018382808284375094965061026895505050505050565b005b341 83    56101a157fe5b61007f6102f8565b60408051600160a060020a03909216825251908190036020019 84    0f35b60015481565b600254600160a060020a031681565b600380546040805160206002600185161 85    5610100026000190190941693909304601f810184900484028201840190925281815292918301828 86    280156102605780601f1061023557610100808354040283529160200191610260565b82019190600 87    0526020600020905b81548152906001019060200180831161024357829003601f168201915b50505 88    0505081565b60008054600160a060020a0380871673fffffffffffffffffffffffffffffffffffff 89    fff19928316179092556001859055600280549285169290911691909117905580516102bd9060039 90    06020840190610307565b506040805184815290517f2db24179b782aab7c5ab64add7f84d4f6c845 91    d0779695371f29be1f658d043cd9181900360200190a15b50505050565b600054600160a060020a0 92    31681565b828054600181600116156101000203166002900490600052602060002090601f0160209 93    00481019282601f1061034857805160ff1916838001178555610375565b828001600101855582156 94    10375579182015b8281111561037557825182559160200191906001019061035a565b5b506103829 95    29150610386565b5090565b6103a491905b80821115610382576000815560010161038c565b50905 96    65b905600a165627a7a723058209522849948e8cc25a7d6717d5c10836c97c36425936be5edf3992 97    06b3e5d7fa30029" 98}

总结

通过J2EE组件的接口调用,可以为大多数基于java的区块链应用提供了便利,可以利用J2EE成熟稳定的框架无缝集成到项目中,也是为了以后安卓开发和联盟链提供在线编译智能合约功能,如果是私有的局域网络的企业级联盟链,可以发布该智能合约的J2EE组件到该局域网的机器上去,可以实现联盟中的智能合约统一的编译器,便于快速升级编译器。

感谢HPB团队整理。

声明:链世界登载此文仅出于分享区块链知识,并不意味着赞同其观点或证实其描述。文章内容仅供参考,不构成投资建议。投资者据此操作,风险自担。此文如侵犯到您的合法权益,请联系我们100@7234.cn

    参与讨论 (0 人参与讨论)

    相关推荐

    区块链投资趋势报告:巨头入场布局行业趋于成熟

    区块链投资趋势报告:巨头入场布局行业趋于成熟

    来自:https://mp.weixin.qq.com/s?__biz=MzI4NzIxOTY1NA==&amp;mid=2650632639&amp;idx=1&amp;sn=e6d1c29731d992a80410aaee82ec3ea6&amp;chksm=f3d8db16c4af520097e4a64a71b1d4743ac326b9f027

    重新发明货币

    重新发明货币

    一、货币的演化过程 先简单回顾一下人类货币的演化过程,大概有以下阶段: a. 1.0版本:自然货币(贝壳、牲口、金银……) 这个阶段,货币基于一般等价物的稀有性或者实用性,货币不可能出现人为操纵的超发。 b. 2.0版本:早期纸币、银票到本位纸币 当贸易量越来越大,实物货币太不方便了,而且大家发现其实并不在意货币本身有什么价值,在意的只是这么多的货币能不能交换到足够的物品,于是纸币这种信用货

    从比特币交易看欧洲央行虚拟货币分类

    从比特币交易看欧洲央行虚拟货币分类

      互联网对传统社会的颠覆从未停止,在其完成对信息流、商流、物流、资金流的初步改造之后,或将以虚拟货币的形式打破现有货币体系   4月18日,在中国极客张沈鹏创办的比特币交易平台(42BTC.com)上,比特币对人民币的平均交易价为576元。当天,该平台完成了100个比特币的交易量。仅仅过去一周,4月25日上午,比特币对人民币的平均交易价已达到906元。据42BTC网站统计:在过去的32个月

    欧洲央行-比特币报告

    3.1 比特币 3.1.1 基本特征          比特币可能是最成功的,也可能是最有争议的虚拟货币方案,由日本程序员中本聪(译者注:事实上,中本聪是不是日本人,甚至是不是单个人无从考证)在2009年设计并实现。该计划基于一个类似于BitTorrent的P2P网络。BitTorrent是互联网上著名的共享文件协议,应用在电影,游戏和音乐领域。比特币在全球层面上运作,可用于各类货币交易(虚

    彻底玩转比特币地址和私匙

    彻底玩转比特币地址和私匙

    比特币地址和私匙是所有比特币初学者面对的一大难题,再加上那一串超长的字符串,让人更是摸不到头脑。 现在编者以问答的形式,带你一步步的揭开比特币地址和私匙的面纱。 还不知道什么是比特币地址和私匙的同学请点这里 问题一、比特币钱包由什么组成? 答 我们知道,比特币地址和私匙组成了比特币钱包,而私匙则决定了比特币地址上比特币的归属。 地址和私匙 问题二、如果只记得私匙我们还能还原比特币地址么? 答

    用GO语言实现比特币算法

    用GO语言实现比特币算法

    本节的这个例子展示一点点高精度数学包math/big、一点点散列包hash、一点点加密包crypto,还有一点点测试包testing的知识。这里不介绍bitcoin协议和算法——尽管它们很有趣,而是试图指出,Go对多种操作系统的支持,是实现这种跨平台应用的理想语言。 位钱(bitcoin)是一种使用加密手段制作的分布式电子货币。它最初于1998年由Wei Dai提出,并由中本聪(Satoshi

    详解比特币的找零机制

    详解比特币的找零机制

    比特币的找零机制一直让人有些迷惑,明明只向一个地址发送了比特币为什么 blockchain 上面的显示的有时是1个地址对多个地址,有时是多个地址对1个地址,有时又显示多个地址对多个地址? 为什么比特币资深用户要提醒大家当比特币钱包交易100次以上时再次交易后要重新备份钱包,恢复以前的钱包备份有可能会遭遇损失? 是的,这一切都是因为比特币的找零(Change)机制。本文参考 Bitcoin的维

    玩转比特币客户端之一:C盘转移和加速下载

    玩转比特币客户端之一:C盘转移和加速下载

    C盘空间不足?交易数据下载速度太慢?别着急,乐享比特币教你轻松玩转比特币官方客户端。 所有新人开始接触比特币时做的第一件事情大多数是安装比特币的官方客户端。 安全起见大家最好直接访问官方发布渠道sourceforge的地址进行下载:http://sourceforge.net/projects/bitcoin/files/Bitcoin/ 该网页列出了各版本的官方比特币客户端,目前

    麦妖榜
    更新日期 2019-06-16
    排名用户贡献值
    1BitettFan23992
    2等待的宿命23809
    3六叶树20309
    4区块大康18606
    5天下无双16192
    6linjm122715948
    7牛市来了15758
    8lizhen00215077
    9让时间淡忘14475
    10冷风大q11188
    返回顶部 ↑