5 应用接入示例
拥有信任节点的企业级用户可以使用RPC在线签名的方式进行数据上链。如果您开发的是Dapp,或是个人开发者,可以使用离线签名的方式保证密钥的安全性。以下提供Js和Java两个版本的开发示例作为参考。
5.1 Js版应用示例
Js版本的完整参考示例见"hwchain-demo-crypto",Js版本提供两个示例,浏览器离线签名版本和基于Node编译的版本。
浏览器版本
此版本兼容ES5,可在浏览器中直接运行。如果是手机APP开发者可以基于此版本示例做相应封装,通过webview或者JsBridge的方式进行离线签名调用。运行此示例直接打开index.html即可。
代码说明
部分代码说明如下,具体代码请查看源代码。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>hwchain</title>
<script type="text/javascript" src="./hwchain-crypto/build/index.js"></script>
</head>
<body>
<script type="text/javascript">
var API = window.hwchainCrypto; // API入口
var wallet = API.generateAddress().wallet; // 生成新的地址和密钥对
var wallet1 = API.generateAddress(wallet.secret).wallet; // 通过密钥推导地址
// ... ...
document.write("valid:" + API.isValidAddress(wallet.address).wallet + "<br/><br/>"); // 判断地址是否合法
</script>
</body>
</html>
Node编译版本
此版本的离线签名部分的接口与浏览器版本完全一致,即此示例中的API接口在浏览器中可以通用。 为了更直观的展示如何使用接口,此示例中提供RPC查询,和交易提交(离线签名)的几个常用操作作为示例。如果是企业用户可以选择将离线签名部分改为在线签名。
安装和运行
> node -v
v12.13.0
> cd hwchain-demo-crypto
> npm install -d
> npm start
导入eclipse或者idea中运行,入口类"com.hw.chain.demo.DemoApp"
代码说明
部分代码说明如下,具体代码请查看源代码。
//离线生成密钥对
const wallet = generateAddress(); // 生成新的地址和密钥对
const wallet1 = generateAddress(wallet.secret); // 通过密钥推导地址
// ... ...
console.log("valid: " + API.isValidAddress(wallet.address).wallet + "\n"); // 判断地址是否合法
// 转账交易提交(离线签名)
const API = require('./hwchain-crypto/npm');
... ...
const data = await RPC.getAccountInfo(address); //RPC获取Sequence
const txJson = { // txJson格式和在线签名格式一样
"TransactionType": "Payment",
"Account": address, // 当前用户地址
"Destination": destination, // 目标用户地址
"Amount": API.base.baseToDrops(amount), // 转账数量
"Fee": "10000", // 费
"Sequence": data.Sequence // 当前账户的sequence
};
if (memoType && memoData) {
const memos = [
{
Memo: {
MemoType: API.base.utils.convertStringToHex(memoType), //必须为Hex格式
MemoData: API.base.utils.convertStringToHex(memoData) //必须为Hex格式
}
}
];
txJson["Memos"] = memos
}
// 交易签名
const resSign = API.sign(txJson, secret); // 离线签名
const resSubmit = await submit(resSign.signedTransaction); // RPC提交签名之后的数据
// ... ...
5.2 Java版应用示例
Java版本的完整参考示例见"hwchain-demo-jcrypto",Java版本示例基于Maven做包管理,使用OKHttp做http请求。
安装和运行
离线签名jar包在工程的lib目录中,可以选择上传到私服或者install到本地仓库的方式。
> java -version
java version "1.8.0_201"
> mvn -version
Apache Maven 3.5.2
> cd hwchain-demo-jcrypto\lib
> mvn install:install-file -Dfile=hwchain-jcrypto-0.0.1.jar -DpomFile=hwchain-jcrypto-0.0.1.pom
代码说明
部分代码说明如下,具体代码请查看源代码。
// 离线生成新账号
ChainCrypto chainCrypto = new ChainCrypto(new CryptoConfig());
// ... ...
AccountKeyPair result = new AccountKeyPair();
KeyPair walletSE = chainCrypto.keyPair();
// 离线签名的方式转账HWT
ChainCrypto chainCrypto = new ChainCrypto(new CryptoConfig());
RpcService rpcService = new RpcService();
// ... ...
/**
* 转账
*
* @param secret 密钥
* @param account 地址
* @param destination 目标地址
* @param amount 数量
* @param memo 备注
* @return 提交结果
*/
public static PaymentResult payment(String secret, String account, String destination,
String amount, String memo) {
/*
* 通过PRC接口获取当前账号的sequence
*/
Integer sequence = rpcService.getSequence(account);
/*
* 组装txJson,此json的格式与rpc说明中的格式一致
*/
Map<String, Object> txMap = new HashMap<String, Object>();
txMap.put("TransactionType", "Payment");
txMap.put("Account", account);
txMap.put("Destination", destination);
txMap.put("Sequence", sequence);
txMap.put("Amount", chainCrypto.buildAmount(amount, null, null));
txMap.put("Fee", chainCrypto.baseToDrops(Const.BASE_FEE));
txMap.put("Memos", chainCrypto.buildTextMemos(Const.MEMO_TYPE, memo));
/*
* 离线签名并获得签名结果tx_blob
*/
String txJson = JSONObject.toJSONString(txMap, true);
SignedTransaction res = chainCrypto.sign(txJson, secret);
/*
* 将离线签名结果通过RPC的submit接口提交
*/
String responseStr = rpcService.submit(res.tx_blob);
JSONObject responseObj = JSONObject.parseObject(responseStr);
/*
* 解析RPC返回参数,具体参照RPC说明
*/
PaymentResult paymentResult = new PaymentResult();
// ... ...
return paymentResult;
}