1.1 經過docker安裝Solcjava
搜索docker的Solc鏡像web
docker search —no-trunc ethereum/solcspring
經過docker安裝Solcdocker
docker pull docker.io/ethereum/solc:stablespringboot
1.2 運行Solc容器網絡
運行以下命令app
docker run —rm -it —privileged=true —net=host -v /home/hpbroot/ethereum_go/contract:/contract —name solc ethereum/solc:stable –version框架
查看是否成功post
2.1 經過Eclipse新建工程區塊鏈
首先,新建ContractCompile工程
在springboot配置文件application.properties中添加以下
1 web3j.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")
3 public 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 調用智能合約編譯器的代碼
1 String soliditySrcCode =MapUtils.getString(preParam, "soliditySrcCode");
2 if(StringUtils.isBlank(soliditySrcCode)) {
3 param.put(ContractConstant.RETURN_CODE, ContractConstant.ERROR_CODE);
4 param.put(ContractConstant.RETURN_MSG, ContractConstant.NOSRCCODE);
5 return param;
6 }
7 SolidityCompiler solidityCompiler = SolidityCompiler.getInstance(getLog(),contractConfig.getSolcCmd());
8 byte[] source = soliditySrcCode.getBytes(StandardCharsets.UTF_8);
9 CompilerResult compilerResult = solidityCompiler.compileSrc(source,
10 SolidityCompiler.Options.ABI, SolidityCompiler.Options.BIN);
11 param.put(ContractConstant.RETURN_CODE, ContractConstant.SUCCESS_CODE);
12 param.put(ContractConstant.RETURN_MSG, ContractConstant.SUCCESS_MSG);
13 if(compilerResult.isFailed()) {
14 param.put(ContractConstant.RETURN_CODE, ContractConstant.ERROR_CODE);
15 param.put(ContractConstant.RETURN_MSG, compilerResult.getErrors());
16 }
3.1 編寫智能合約源碼
1 contract 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 }
3.2 經過HTTP調用智能合約的J2EE組件
1 String contractPath="/SampleRecipientSuccess.sol";
2 String contractString = FileUtils.readFileToString(new File(contractPath),StandardCharsets.UTF_8);
3 HashMap<String, Object> hashMap = new HashMap<String,Object>();
4 hashMap.put("soliditySrcCode", contractString);
5 String url = "http://192.168.3.43:18080/ContractCompile/compileContractCmd";
6 ResponseEntity<Map> 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<String, Object> parseResult = parseResult(result);
12 System.out.println(AppObjectUtil.toJson(parseResult));
13 }
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組件到該局域網的機器上去,能夠實現聯盟中的智能合約統一的編譯器,便於快速升級編譯器。
原文連接:http://wangxiaoming.com/blog/2018/05/26/HPB-46-ETH-Solidity-Install-Compile/