为方便存证场景的开发,合约平台提供原生存证交易接口以实现存证目的。
存证交易
depositData
存证交易,同步方式调用。
函数原型
public MychainBaseResult<ReplyTransactionReceipt> depositData(DepositDataRequest request)
请求参数
参数 | 必选 | 类型 | 说明 |
request | true | DepositDataRequest | 存证交易的请求 |
返回字段
返回字段 | 字段类型 | 说明 |
result |
| MychainBaseResult 持有所有 response 类型 |
示例:
// 存证数据
private static String depositData() {
// 准备参数 params
MychainParams params = new MychainParams.Builder()
.gas(BigInteger.valueOf(4000000))
.privateKeyList(adminPrivateKeys)
.build();
// 存证数据,实际中可根据需求序列化目标数据到 byte[] 传入,ByteUtils 是Java SDK提供的工具库
byte[] data = ByteUtils.hexStringToBytes("0x1234");
DepositDataRequest depositDataRequest = DepositDataRequest.build(adminAccount.getIdentity(),
adminAccount.getIdentity(), BigInteger.ZERO, data, params);
MychainBaseResult<ReplyTransactionReceipt> depositDataResult = sdk.getAccountService().depositData(depositDataRequest);
if (!depositDataResult.isSuccess() || depositDataResult.getData().getTransactionReceipt().getResult() != 0) {
exit("depositData", getErrorMsg((int)depositDataResult.getData().getTransactionReceipt().getResult()));
}
return depositDataResult.getTxHash();
}
// 查询存证数据
private static String queryDepositData(String hash) {
// 存证后,如果需要查询存证数据,可通过 QueryTransaction 传入存证交易的 hash 查询
MychainBaseResult<ReplyTransaction> queryTxResult = sdk.getQueryService().queryTransaction(hash);
if (!queryTxResult.isSuccess()) {
exit("depositData", queryTxResult.getData().getErrorCode().toString());
}
// 通过 QueryTransaction 查询到存证交易,证明交易发生,通过 QueryTransactionReceipt 可以验证交易成功(return_code 为0),共识后进入区块
MychainBaseResult<ReplyTransactionReceipt> queryTxReceiptResult = sdk.getQueryService().queryTransactionReceipt(hash);
if (!queryTxReceiptResult.isSuccess() || queryTxReceiptResult.getData().getTransactionReceipt().getResult() != 0) {
exit("depositData", getErrorMsg((int)queryTxReceiptResult.getData().getTransactionReceipt().getResult()));
}
// 查询存证内容,转换为hex 返回
return ByteUtils.toHexString(queryTxResult.getData().getTransactionDO().getData());
}
asyncDepositData
存证交易,异步方式调用。
函数原型
public MychainBaseResult<Response> asyncDepositData(DepositDataRequest request, ICallback callback)
请求参数
参数 | 必选 | 类型 | 说明 |
request | true | DepositDataRequest | 存证的请求 |
callback | true | ICallback | 回调函数 |
返回字段
返回字段 | 字段类型 | 说明 |
result |
| MychainBaseResult 持有所有 response 类型 |
注意:存证交易的 data 数据大小有上限限制,此限制为合约链的一个配置选项,通常默认 1 MB,实际根据合约链的配置情况而定。
示例:
private static void depositDataAsync() {
// 准备参数 params
MychainParams params = new MychainParams.Builder()
.gas(BigInteger.valueOf(4000000))
.privateKeyList(adminPrivateKeys)
.build();
// 存证数据,实际中可根据需求序列化目标数据到 byte[] 传入,ByteUtils 是 Java SDK 提供的工具库
byte[] data = ByteUtils.hexStringToBytes("0x1234");
DepositDataRequest request = DepositDataRequest.build(adminAccount.getIdentity(),
adminAccount.getIdentity(), BigInteger.ZERO, data, params);
MychainBaseResult<Response> depositDataResult = sdk.getAccountService().asyncDepositData(request, new ICallback() {
@Override
public void onResponse(String txHash, Response response) {
System.out.println("depositDataAsync, txHash:" + txHash + ", result: "
+ response.getErrorCode());
// 存证后,如果需要查询存证数据,可通过 QueryTransaction 传入存证交易的 hash 查询
MychainBaseResult<ReplyTransaction> queryTxResult = sdk.getQueryService().queryTransaction(txHash);
if (!queryTxResult.isSuccess()) {
exit("depositDataAsync", queryTxResult.getData().getErrorCode().toString());
}
// 查询存证内容,转换为 hex
System.out.println("depositDataAsync success: " + ByteUtils.toHexString(queryTxResult.getData().getTransactionDO().getData()));
}
});
}
存证交易的请求参数
DepositDataRequest,具体参数如下表所示。
存证交易请求所需要的参数如下表所示。
参数 | 类型 | 说明 |
identity | Identity | 交易发起者的 identity |
identity | Identity | 目标账户 identity |
value | BigInteger | 转账金额 |
data | byte[] | 待存储数据,可自定义数据内容,然后序列化存证,存证后读取数据再反序列化。 |
value | MychainParams | 接口通用扩展参数 |
注意:存证交易的 data 数据大小有上限限制,此限制为合约链的一个配置选项,通常默认 1 MB,实际根据合约链的配置情况而定。
存着交易的返回参数
DepositDataResponse,具体参数如下表所示。
参数 | 类型 | 说明 |
transactionReceipt | TransactionReceipt | 交易收据 |
blockNumber | BigInteger | 区块号 |