快讯:
12月17日消息,1土耳其银行Akbank宣布正在利用Ripple的区块链技术将英镑从土耳其转移到英国的桑坦德银行。Akbank是土耳其最大的银行之一,该银行成立于1948年,它在2011年的收入将近100亿土耳其里拉。该银行在伊斯坦布尔证交所上市。
12月17日,根据Searchain.io数据分析: (1)昨日BTC围绕3200美元波动。从链上指标来看,昨日反映BTC内部价值的基础指标整体下降,新增地址下降10.10%,活跃地址下降10.43%。从链上交易指标来看,交易用户的活跃度整体下降,交易所流入下降15.09%,流出下降10.00%;场外交易相对更活跃。综合链上基础和交易指标来看,近期BTC基础指标继续下降,场内外交易活跃均不明显。 (2)昨日ETH价格从82美元上涨到86美元。从链上指标来看,昨日反映ETH内在价值的基础指标整体上升,新增地址上升了39.18%,活跃地址下降了1.35%。从场内场外的交易活跃度来看,交易所内换手率整体开始下降;大额转账整体也开始下降,下降了28.39%。综合链上基础指标和交易指标来看,昨日基础指标继续上升,链上场内外交易仍不活跃。 (3)除USDT外,昨日总供给量最高的 USD 稳定币是 TUSD,总供应量为 211,842,000 枚。昨日总供应量最低的 USD 稳定币是 nUSD,总供应量为 1,186,072 枚。
巴比特APP数据显示,稳定币Tether (USDT)目前市值18.65亿美元,超过Stellar(XLM),成为第四大加密货币。目前Stellar市值为18.53亿美元,紧随其后。请注意投资风险。
12月17日消息,1土耳其银行Akbank宣布正在利用Ripple的区块链技术将英镑从土耳其转移到英国的桑坦德银行。Akbank是土耳其最大的银行之一,该银行成立于1948年,它在2011年的收入将近100亿土耳其里拉。该银行在伊斯坦布尔证交所上市。
12月17日,根据Searchain.io数据分析: (1)昨日BTC围绕3200美元波动。从链上指标来看,昨日反映BTC内部价值的基础指标整体下降,新增地址下降10.10%,活跃地址下降10.43%。从链上交易指标来看,交易用户的活跃度整体下降,交易所流入下降15.09%,流出下降10.00%;场外交易相对更活跃。综合链上基础和交易指标来看,近期BTC基础指标继续下降,场内外交易活跃均不明显。 (2)昨日ETH价格从82美元上涨到86美元。从链上指标来看,昨日反映ETH内在价值的基础指标整体上升,新增地址上升了39.18%,活跃地址下降了1.35%。从场内场外的交易活跃度来看,交易所内换手率整体开始下降;大额转账整体也开始下降,下降了28.39%。综合链上基础指标和交易指标来看,昨日基础指标继续上升,链上场内外交易仍不活跃。 (3)除USDT外,昨日总供给量最高的 USD 稳定币是 TUSD,总供应量为 211,842,000 枚。昨日总供应量最低的 USD 稳定币是 nUSD,总供应量为 1,186,072 枚。
巴比特APP数据显示,稳定币Tether (USDT)目前市值18.65亿美元,超过Stellar(XLM),成为第四大加密货币。目前Stellar市值为18.53亿美元,紧随其后。请注意投资风险。
12月17日消息,1土耳其银行Akbank宣布正在利用Ripple的区块链技术将英镑从土耳其转移到英国的桑坦德银行。Akbank是土耳其最大的银行之一,该银行成立于1948年,它在2011年的收入将近100亿土耳其里拉。该银行在伊斯坦布尔证交所上市。
12月17日,根据Searchain.io数据分析: (1)昨日BTC围绕3200美元波动。从链上指标来看,昨日反映BTC内部价值的基础指标整体下降,新增地址下降10.10%,活跃地址下降10.43%。从链上交易指标来看,交易用户的活跃度整体下降,交易所流入下降15.09%,流出下降10.00%;场外交易相对更活跃。综合链上基础和交易指标来看,近期BTC基础指标继续下降,场内外交易活跃均不明显。 (2)昨日ETH价格从82美元上涨到86美元。从链上指标来看,昨日反映ETH内在价值的基础指标整体上升,新增地址上升了39.18%,活跃地址下降了1.35%。从场内场外的交易活跃度来看,交易所内换手率整体开始下降;大额转账整体也开始下降,下降了28.39%。综合链上基础指标和交易指标来看,昨日基础指标继续上升,链上场内外交易仍不活跃。 (3)除USDT外,昨日总供给量最高的 USD 稳定币是 TUSD,总供应量为 211,842,000 枚。昨日总供应量最低的 USD 稳定币是 nUSD,总供应量为 1,186,072 枚。
巴比特APP数据显示,稳定币Tether (USDT)目前市值18.65亿美元,超过Stellar(XLM),成为第四大加密货币。目前Stellar市值为18.53亿美元,紧随其后。请注意投资风险。

Solidity编译器和简单调试

汪晓明 发布在 技术指南 12879

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<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        }
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团队整理。

文章标签: 智能合约
评论
登录 账号发表你的看法,还没有账号?立即免费 注册