5 应用接入示例

拥有信任节点的企业级用户可以使用RPC在线签名的方式进行数据上链。如果您开发的是Dapp,或是个人开发者,可以使用离线签名的方式保证密钥的安全性。以下提供Js和Java两个版本的开发示例作为参考。

5.1 Js版应用示例

5.2 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;
}

results matching ""

    No results matching ""