1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
| //注意这里,是引用了HPB主网提供的Java SDK包,里面封装了如何通过RPC方式与底层交互的方法
import io.hpb.web3.abi.datatypes.Address;
import io.hpb.web3.abi.datatypes.DynamicArray;
import io.hpb.web3.abi.datatypes.generated.Bytes32;
import io.hpb.web3.contract.HpbNodes;
import io.hpb.web3.crypto.Credentials;
import io.hpb.web3.crypto.RawTransaction;
import io.hpb.web3.crypto.WalletUtils;
import io.hpb.web3.protocol.admin.Admin;
import io.hpb.web3.protocol.core.DefaultBlockParameterName;
import io.hpb.web3.protocol.core.methods.response.HpbBlockNumber;
import io.hpb.web3.protocol.core.methods.response.HpbGetBalance;
import io.hpb.web3.protocol.core.methods.response.HpbGetTransactionCount;
import io.hpb.web3.protocol.core.methods.response.HpbGetTransactionReceipt;
import io.hpb.web3.protocol.core.methods.response.HpbSendTransaction;
import io.hpb.web3.protocol.core.methods.response.TransactionReceipt;
import io.hpb.web3.tuples.generated.Tuple4;
import io.hpb.web3.tx.ChainId;
import io.hpb.web3.tx.RawTransactionManager;
import io.hpb.web3.utils.Convert;
import io.hpb.web3.utils.Numeric;
import io.swagger.annotations.ApiOperation;
@RestController
@RequestMapping("/")
public class HpbWeb3Controller{
//输出日志
private static Log log = LogFactory.getLog(HpbWeb3Controller.class);
//超时时间
private final long WEB3J_TIMEOUT = 3;
//演示的HPB账号地址
private final String contractAddr = "0x7be6aa25600feed355b79b6a4e14dcdb0bd529cb";
//设置账号的余额单位为18GWEI
private final BigInteger gasPrice = Convert.toWei("18", Convert.Unit.GWEI).toBigInteger();
//设置默认的GasLimit
private final BigInteger gasLimit = new BigInteger("95000000");
@Autowired
private Admin admin;
@ApiOperation(value="通过根据交易hash查询交易收据",notes = "过根据交易hash查询交易收据"
+ " reqStrList [ 参数1:交易hash]")
@PostMapping("/QueryByHash")
public List<Object> QueryByHash(@RequestBody List<String> reqStrList)throws Exception{
List<Object> list=new ArrayList<Object>();
if(reqStrList!=null&&reqStrList.size()>0) {
String transactionHash = reqStrList.get(0);
//初始化封装的Java SDK包里的方法;通过初始化HpbGetTransactionReceipt,可以获得指定账号的交易数据
HpbGetTransactionReceipt receipt = admin.hpbGetTransactionReceipt(transactionHash).send();
if(!receipt.hasError()) {
TransactionReceipt transactionReceipt = receipt.getResult();
if(transactionReceipt.isStatusOK()) {
list.add(transactionReceipt);
}
}
}
return list;
}
@ApiOperation(value="获得当前区块号",notes = "获得当前区块号")
@PostMapping("/getCurrentBlock")
public List<Object> getCurrentBlock()throws Exception{
List<Object> list=new ArrayList<Object>();
//初始化封装的Java SDK包里的方法;通过HpbBlockNumber获取当前区块的对象内容
HpbBlockNumber blockNumber = admin.hpbBlockNumber().sendAsync().get(WEB3J_TIMEOUT, TimeUnit.MINUTES);
list.add(blockNumber);
return list;
}
@ApiOperation(value="获得当前账户的Nonce",notes = "获得当前账户的Nonce"
+ " reqStrList [ 参数1:账户地址;")
@PostMapping("/getCurrentNonce")
public List<Object> getCurrentNonce(@RequestBody List<String> reqStrList)throws Exception{
List<Object> list=new ArrayList<Object>();
if(reqStrList!=null&&reqStrList.size()>0) {
String address =reqStrList.get(0);
//初始化封装的Java SDK包里的方法;通过HpbGetTransactionCount获取当前账号Nonce
//Nonce是账户的随机数:在一个账户中的防止多重交易的用途。
HpbGetTransactionCount transactionCount = admin.hpbGetTransactionCount(address,
DefaultBlockParameterName.PENDING).sendAsync().get(WEB3J_TIMEOUT, TimeUnit.MINUTES);
BigInteger nonce = transactionCount.getTransactionCount();
log.info(nonce);
list.add(nonce);
}
return list;
}
@ApiOperation(value="获得当前账户的余额",notes = "获得当前账户的余额"
+ " reqStrList [ 参数1:账户地址; ]")
@PostMapping("/getBalance")
public List<Object> getBalance(@RequestBody List<String> reqStrList)throws Exception{
List<Object> list=new ArrayList<Object>();
if(reqStrList!=null&&reqStrList.size()>0) {
String address =reqStrList.get(0);
//初始化封装的Java SDK包里的方法;通过HpbGetBalance获取当前账号的余额。
HpbGetBalance balance = admin.hpbGetBalance(address, DefaultBlockParameterName.LATEST).send();
log.info(balance);
list.add(balance);
}
return list;
}
@ApiOperation(value="发送交易",notes = "发送交易"
+ " reqStrList [ 参数1:账户keystore地址; 参数2:密码; 参数3:接收账户地址;参数4:转账金额;]")
@PostMapping("/sendTransaction")
public List<Object> sendTransaction(@RequestBody List<String> reqStrList)throws Exception{
List<Object> list=new ArrayList<Object>();
if(reqStrList!=null&&reqStrList.size()>3) {
//获取指定账号的keystore
String keystore =reqStrList.get(0);
//获取用户输入发送交易的账号密码
String password =reqStrList.get(1);
//加载私钥对象
Credentials credentials = WalletUtils.loadCredentials(password, keystore);
//创建交易管理对象
RawTransactionManager transactionManager=new RawTransactionManager(admin, credentials, ChainId.MAINNET);
//获取nonce
HpbGetTransactionCount transactionCount = admin.hpbGetTransactionCount(credentials.getAddress(),
DefaultBlockParameterName.PENDING).sendAsync().get(WEB3J_TIMEOUT, TimeUnit.MINUTES);
BigInteger nonce = transactionCount.getTransactionCount();
//获取目标地址
String to =reqStrList.get(2);
//转账金额
String value =reqStrList.get(3);
//创建交易对象
RawTransaction rawTransaction = RawTransaction.createTransaction(
nonce,
gasPrice,
gasLimit,
to,
Convert.toWei(value, Convert.Unit.HPB).toBigInteger(),
"");
//签名并发送交易
HpbSendTransaction transaction = transactionManager.signAndSend(rawTransaction);
log.info(transaction.getTransactionHash());
list.add(transaction);
}
return list;
}
@ApiOperation(value="调用HpbNodes智能合约",notes = "调用HpbNodes智能合约"
+ " reqStrList [ 参数1:账户keystore地址; 参数2:密码]")
@PostMapping("/invokeHpbNodes")
public List<Object> invokeHpbNodes(@RequestBody List<String> reqStrList)throws Exception{
List<Object> list=new ArrayList<Object>();
if(reqStrList!=null&&reqStrList.size()>1) {
String keystore =reqStrList.get(0);
String password =reqStrList.get(1);
Credentials credentials = WalletUtils.loadCredentials(password, keystore);
RawTransactionManager transactionManager=new RawTransactionManager(admin, credentials, ChainId.MAINNET);
HpbNodes hpbNodes = HpbNodes.load(contractAddr, admin, transactionManager, gasPrice, gasLimit);
//调用智能合约
Tuple4<DynamicArray<Address>, DynamicArray<Bytes32>, DynamicArray<Bytes32>, DynamicArray<Bytes32>> send =
hpbNodes.getAllHpbNodes().send();
Bytes32 bytes32 = send.getValue2().getValue().get(1);
log.info(Numeric.toHexStringNoPrefix(bytes32.getValue()));
Bytes32 bytes321 = send.getValue3().getValue().get(1);
log.info(Numeric.toHexStringNoPrefix(bytes321.getValue()));
Bytes32 bytes322 = send.getValue3().getValue().get(1);
log.info(Numeric.toHexStringNoPrefix(bytes322.getValue()));
list.add(send);
}
return list;
}
}
|