查询区块头
queryBlockHeader
按区块哈希查询区块头。
函数原型
public QueryBlockHeaderResponse queryBlockHeader(Hash hash)
请求参数
参数 | 必选 | 类型 | 说明 |
hash | true | Hash | 区块 hash |
返回字段
返回字段 | 字段类型 | 说明 |
response |
| 查询区块头的响应 |
QueryBlockHeaderResponse,具体参数见下表。
参数 | 类型 | 说明 |
blockHeader |
| 区块头 |
BlockHeader,具体参数见下表。
参数 | 类型 | 说明 |
hash | Hash | 区块哈希值 |
parentHash | Hash | 父区块哈希值 |
transactionRoot | Hash | 本区块所有交易组成的merkle root哈希值 |
receiptRoot | Hash | 本区块所有交易收据组成的merkle root哈希值 |
stateRoot | Hash | 区块链中所有账户在执行完该区块所有的交易后形成的世界状态 |
version | Long | 系统版本 |
number | BigInteger | 区块高度 |
gasUsed | BigInteger | 本区块所有交易总共消耗的gas |
timestamp | long | 本区块时间戳 |
logBloom | byte[] | bloom过滤器 |
示例
public void testQueryBlockHeader() {
//查询最后一个区块头
QueryLastBlockHeaderResponse queryLastBlockHeaderResponse = sdk.getQueryService().queryLastBlockHeader();
if (!queryLastBlockHeaderResponse.isSuccess()) {
logger.error("queryLastBlockHeader failed, errorCode :{}, errorDesc: {}", queryLastBlockHeaderResponse.getErrorCode().getErrorCode(), queryLastBlockHeaderResponse.getErrorCode().getErrorDesc());
} else {
logger.info("queryLastBlockHeader success.返回信息: {}", queryLastBlockHeaderResponse.toString());
BlockHeader blockHeader = queryLastBlockHeaderResponse.getHeader();
logger.info("blockHeader: {}", blockHeader.toString());
}
//按区块哈希查询区块头
Hash hash = queryLastBlockHeaderResponse.getHeader().getHash();
QueryBlockHeaderResponse queryBlockHeaderResponse = sdk.getQueryService().queryBlockHeader(hash);
if (!queryBlockHeaderResponse.isSuccess()) {
logger.error("queryBlockHeader failed, errorCode :{}, errorDesc: {}", queryBlockHeaderResponse.getErrorCode().getErrorCode(), queryBlockHeaderResponse.getErrorCode().getErrorDesc());
} else {
logger.info("queryBlockHeader success.返回信息: {}", queryBlockHeaderResponse.toString());
BlockHeader blockHeader = queryBlockHeaderResponse.getBlockHeader();
logger.info("blockHeader: {}", blockHeader.toString());
}
}
queryBlockHeaderByNumber
按区块编号查询区块头。
函数原型
public QueryBlockHeaderResponse queryBlockHeaderByNumber(BigInteger blockNumber)
请求参数
参数 | 必选 | 类型 | 说明 |
blockNumber | true | BigInteger | 区块编号 |
返回字段
返回字段 | 字段类型 | 说明 |
response |
| 查询区块头的响应 |
QueryBlockHeaderResponse,具体参数见下表。
参数 | 类型 | 说明 |
blockHeader | 区块头 |
示例
public void testQueryBlockHeaderByNumber() {
//查询最后一个区块头
QueryLastBlockHeaderResponse queryLastBlockHeaderResponse = sdk.getQueryService().queryLastBlockHeader();
if (!queryLastBlockHeaderResponse.isSuccess()) {
logger.error("queryLastBlockHeader failed, errorCode :{}, errorDesc: {}", queryLastBlockHeaderResponse.getErrorCode().getErrorCode(), queryLastBlockHeaderResponse.getErrorCode().getErrorDesc());
} else {
logger.info("queryLastBlockHeader success.返回信息: {}", queryLastBlockHeaderResponse.toString());
BlockHeader blockHeader = queryLastBlockHeaderResponse.getHeader();
logger.info("blockHeader: {}", blockHeader.toString());
}
//根据区块编号查询区块头
BigInteger blockNumber = queryLastBlockHeaderResponse.getHeader().getNumber();
QueryBlockHeaderResponse queryBlockHeaderResponse = sdk.getQueryService().queryBlockHeaderByNumber(blockNumber);
if (!queryBlockHeaderResponse.isSuccess()) {
logger.error("queryBlockHeaderByNumber failed, errorCode :{}, errorDesc: {}", queryBlockHeaderResponse.getErrorCode().getErrorCode(), queryBlockHeaderResponse.getErrorCode().getErrorDesc());
} else {
logger.info("queryBlockHeaderByNumber success.返回信息: {}", queryBlockHeaderResponse.toString());
BlockHeader blockHeader = queryBlockHeaderResponse.getBlockHeader();
logger.info("blockHeader: {}", blockHeader.toString());
}
}
queryLastBlockHeader
查询最后一个区块头。
函数原型
public QueryLastBlockHeaderResponse queryLastBlockHeader()
请求参数:无
返回字段
返回字段 | 字段类型 | 说明 |
response |
| 查询区块头的响应 |
QueryBlockHeaderResponse,具体参数见下表。
参数 | 类型 | 说明 |
blockHeader | 区块头 |
示例
public void testQueryLastBlockHeader() {
//查询最后一个区块头
QueryLastBlockHeaderResponse queryLastBlockHeaderResponse = sdk.getQueryService().queryLastBlockHeader();
if (!queryLastBlockHeaderResponse.isSuccess()) {
logger.error("queryLastBlockHeader failed, errorCode :{}, errorDesc: {}", queryLastBlockHeaderResponse.getErrorCode().getErrorCode(), queryLastBlockHeaderResponse.getErrorCode().getErrorDesc());
} else {
logger.info("queryLastBlockHeader success.返回信息: {}", queryLastBlockHeaderResponse.toString());
BlockHeader blockHeader = queryLastBlockHeaderResponse.getHeader();
logger.info("blockHeader: {}", blockHeader.toString());
}
}
查询区块
queryBlock
按区块哈希查询区块。
函数原型
public QueryBlockResponse queryBlock(Hash hash)
请求参数
参数 | 必选 | 类型 | 说明 |
hash | true | Hash | 区块 hash |
返回字段
返回字段 | 字段类型 | 说明 |
response |
| 查询区块的响应 |
QueryBlockResponse,具体参数见下表。
参数 | 类型 | 说明 |
block |
| 区块 |
Block,具体参数见下表。
参数 | 类型 | 说明 |
blockHeader | 区块头 | |
blockBody | BlockBody | 区块体 |
BlockBody,具体参数见下表。
参数 | 类型 | 说明 |
transactionList | List< | 交易列表 |
receiptList | List< | 交易收据列表 |
consensusProof | byte[] | 共识证明 |
Transaction,具体参数见下表。
参数 | 类型 | 说明 |
txType | 交易类型 | |
data | byte[] | 交易数据 |
signatureList |
| 签名 |
hash | Hash | 交易hash |
from | Identity | 交易发起方账户 |
to | Identity | 交易接收方账户 |
timestamp | long | 交易的时间戳,默认为0时,由sender帮忙生成当前时间戳,不为0时,使用该值作为交易的时间戳 |
period | long | 保留字段,以便后续扩展时使用 |
nonce |
| 交易的随机值,默认为0时,由sender帮忙生成随机值,不为0时,使用该值作为交易的nonce值 |
gas | BigInteger | 该交易所能消耗的最大gas(大于基本gas:20000) |
value |
| 转账的value值 |
extensions |
| 扩展 |
groupId |
| 组ID |
version | short | 版本 |
TransactionType,枚举值,具体参数见下表。
参数 | 枚举值 | 说明 |
TX_CREATE_ACCOUNT | 0 | 创建账户 |
TX_TRANSFER_BALANCE | 1 | 转账 |
TX_ISSUE_ASSETS | 2 | 发行资产 |
TX_REDEEM_ASSETS | 3 | 赎回发行资产 |
TX_DEPLOY_CONTRACT | 10 | 部署合约 |
TX_CALL_CONTRACT | 11 | 调用合约 |
TX_UPDATE_CONTRACT | 12 | 更新合约 |
TX_SET_CONTRACT_ACL | 13 | 设置合约ACL |
TX_GET_CONTRACT_ACL | 14 | 获取合约ACL |
TX_SET_RECOVER_KEY | 20 | 设置恢复密钥 |
TX_PRE_RESET_PUB_KEY | 21 | 预重置公钥 |
TX_RESET_PUB_KEY, | 22 | 重置公钥 |
TX_UPDATE_AUTH_MAP | 23 | 更新权重 |
TX_UPDATE_ENCRYPTION_KEY | 24 | 更新加密密钥 |
TX_FREEZE_ACCOUNT_CONTRACT | 25 | 冻结账户或合约 |
TX_UNFREEZE_ACCOUNT_CONTRACT | 26 | 解冻账户或合约 |
TX_ACTIVATE_NODE | 30 | 激活节点 |
TX_DEPOSIT_DATA | 40 | 存证交易 |
TX_RELATED_DEPOSIT_DATA | 41 | 关联存证交易 |
TX_CONFIDENTIAL_DEPOSIT_DATA | 42 | 机密存证交易 |
TX_UNKNOWN | 255 | 未知交易 |
TX_ENCRYPTION_ENVELOP | 256 | 加密信封交易 |
TX_DEPOSIT_ENVELOP | 257 | 存证信封交易 |
TX_CREATE_GROUP | 258 | 创建分组 |
TX_JOIN_GROUP | 259 | 加入分组 |
TX_CONFIDENTIAL | 500 | TEE隐私交易 |
TransactionReceipt,具体参数见下表。
参数 | 类型 | 说明 |
result | long | 交易执行结果,0 代表成功,其他值代表失败 |
gasUsed | BigInteger | 交易执行所花费的gas费用 |
logs | List<logEntry> | 日志输出 |
output | byte[] | 交易的输出,此处为虚拟机的执行结果 |
示例
public void testQueryBlock() {
//查询最后一个区块
QueryLastBlockResponse queryLastBlockResponse = sdk.getQueryService().queryLastBlock();
if (!queryLastBlockResponse.isSuccess()) {
logger.error("queryLastBlock failed, errorCode :{}, errorDesc: {}", queryLastBlockResponse.getErrorCode().getErrorCode(), queryLastBlockResponse.getErrorCode().getErrorDesc());
} else {
logger.info("queryLastBlock success.返回信息: {}", queryLastBlockResponse.toString());
Block block = queryLastBlockResponse.getBlock();
logger.info("block: {}", block.toString());
}
//根据区块hash查询区块
Hash hash = queryLastBlockResponse.getBlock().getBlockHeader().getHash();
QueryBlockResponse queryBlockByHashResponse = sdk.getQueryService().queryBlock(hash);
if (!queryBlockByHashResponse.isSuccess()) {
logger.error("queryBlock failed, errorCode :{}, errorDesc: {}", queryBlockByHashResponse.getErrorCode().getErrorCode(), queryBlockByHashResponse.getErrorCode().getErrorDesc());
} else {
logger.info("queryBlock success.返回信息: {}", queryBlockByHashResponse.toString());
Block block = queryLastBlockResponse.getBlock();
logger.info("block: {}", block.toString());
}
}
queryBlockByNumber
按区块编号查询区块。
函数原型
public QueryBlockResponse queryBlock(BigInteger blockNumber)
请求参数
参数 | 必选 | 类型 | 说明 |
blockNumber | true | BigInteger | 区块编号 |
返回字段
返回字段 | 字段类型 | 说明 |
response |
| 查询区块的响应 |
QueryBlockResponse,具体参数见下表。
参数 | 类型 | 说明 |
block |
| 区块 |
Block,具体参数下表。
参数 | 类型 | 说明 |
blockHeader | 区块头 | |
blockBody | 区块体 |
示例
public void testQueryBlockByNumber() {
//查询最后一个区块
QueryLastBlockResponse queryLastBlockResponse = sdk.getQueryService().queryLastBlock();
if (!queryLastBlockResponse.isSuccess()) {
logger.error("queryLastBlock failed, errorCode :{}, errorDesc: {}", queryLastBlockResponse.getErrorCode().getErrorCode(), queryLastBlockResponse.getErrorCode().getErrorDesc());
} else {
logger.info("queryLastBlock success.返回信息: {}", queryLastBlockResponse.toString());
Block block = queryLastBlockResponse.getBlock();
logger.info("block: {}", block.toString());
}
//根据区块编号查询区块
BigInteger blockNumber = queryLastBlockResponse.getBlock().getBlockHeader().getNumber();
QueryBlockResponse queryBlockByNumberResponse = sdk.getQueryService().queryBlock(blockNumber);
if (!queryBlockByNumberResponse.isSuccess()) {
logger.error("queryBlock failed, errorCode :{}, errorDesc: {}", queryBlockByNumberResponse.getErrorCode().getErrorCode(), queryBlockByNumberResponse.getErrorCode().getErrorDesc());
} else {
logger.info("queryBlock success.返回信息: {}", queryBlockByNumberResponse.toString());
Block block = queryLastBlockResponse.getBlock();
logger.info("block: {}", block.toString());
}
}
queryLastBlock
查询最后一个区块。
函数原型
public QueryLastBlockResponse queryLastBlock()
返回字段
返回字段 | 字段类型 | 说明 |
response |
| 查询区块的响应 |
QueryBlockResponse,具体参数见下表。
参数 | 类型 | 说明 |
block |
| 区块 |
Block,具体参数见下表。
参数 | 类型 | 说明 |
blockHeader | 区块头 | |
blockBody | 区块体 |
示例
public void testQueryLastBlock() {
//查询最后一个区块
QueryLastBlockResponse queryLastBlockResponse = sdk.getQueryService().queryLastBlock();
if (!queryLastBlockResponse.isSuccess()) {
logger.error("queryLastBlock failed, errorCode :{}, errorDesc: {}", queryLastBlockResponse.getErrorCode().getErrorCode(), queryLastBlockResponse.getErrorCode().getErrorDesc());
} else {
logger.info("queryLastBlock success.返回信息: {}", queryLastBlockResponse.toString());
Block block = queryLastBlockResponse.getBlock();
logger.info("block: {}", block.toString());
}
}
查询交易
queryTransaction,通过交易哈希查询交易。
查询到的交易内容如需解码查看,可参见本文下方交易内容解析中给出的说明进行解码。
函数原型
public QueryTransactionResponse queryTransaction(Hash hash)
public QueryTransactionResponse queryTransaction(Hash hash, BaseFixedSizeByteArray.Fixed20ByteArray myChainId)
请求参数
参数 | 必选 | 类型 | 说明 |
hash | true | String | 交易哈希 |
myChainId | false | Fixed20ByteArray | 在指定的群组中查询交易。 |
返回字段
返回字段 | 字段类型 | 说明 |
response |
| 查询交易的响应 |
QueryTransactionResponse,具体参数见下表。
参数 | 类型 | 说明 |
transaction | 交易内容 | |
blockNumber | BigInteger | 交易所在区块号 |
index | int | 交易在区块中的索引 |
示例
public void queryTransaction() {
//创建一个交易,以转账为例
TransferBalanceRequest transferBalanceRequest = new TransferBalanceRequest(Utils.getIdentityByName("Administrator"),
Utils.getIdentityByName("Tester001"), BigInteger.valueOf(100));
TransferBalanceResponse transferBalanceResponse = sdk.getAccountService().transferBalance(transferBalanceRequest);
if (!transferBalanceResponse.isSuccess()) {
logger.error("transferBalance failed, errorCode :{}, errorDesc: {}", transferBalanceResponse.getErrorCode().getErrorCode(), transferBalanceResponse.getErrorCode().getErrorDesc());
} else {
// 交易收据
TransactionReceipt transactionReceipt = transferBalanceResponse.getTransactionReceipt();
if (transactionReceipt.getResult() != 0) {
logger.error("transferBalance failed, errorCode :{}, errorDesc: {}", ErrorCode.valueOf((int) transactionReceipt.getResult()).getErrorCode(), ErrorCode.valueOf((int) transactionReceipt.getResult()).getErrorDesc());
} else {
logger.info("transferBalance success.返回信息: {}", transactionReceipt.toString());
}
}
//查询转账交易的交易内容
QueryTransactionResponse queryTransactionResponse = sdk.getQueryService().queryTransaction(transferBalanceResponse.getTxHash());
if (!queryTransactionResponse.isSuccess()) {
logger.error("queryTransaction failed, errorCode :{}, errorDesc: {}", queryTransactionResponse.getErrorCode().getErrorCode(), queryTransactionResponse.getErrorCode().getErrorDesc());
} else {
Transaction transaction = queryTransactionResponse.getTransaction();
logger.info("queryTransaction success.返回信息: {}", transaction.toString());
}
}
查询收据
queryTransactionReceipt,通过交易哈希查询收据。
函数原型
public QueryTransactionReceiptResponse queryTransactionReceipt(Hash hash)
public QueryTransactionReceiptResponse queryTransactionReceipt(Hash hash, BaseFixedSizeByteArray.Fixed20ByteArray groupId)
请求参数
参数 | 必选 | 类型 | 说明 |
hash | true | Hash | 交易哈希 |
myChainId | false | Fixed20ByteArray | 在指定的群组中查询交易。 |
返回字段
返回字段 | 字段类型 | 说明 |
response |
| 查询收据的响应 |
QueryTransactionReceiptResponse,具体参数见下表。
参数 | 类型 | 说明 |
transactionReceipt | 交易收据 | |
blockNumber | BigInteger | 交易所在的区块号 |
txIndex | int | 交易在区块中的索引 |
示例
public void queryTransactionReceipt() {
//创建一个交易,以转账为例
TransferBalanceRequest transferBalanceRequest = new TransferBalanceRequest(Utils.getIdentityByName("Administrator"),
Utils.getIdentityByName("Tester001"), BigInteger.valueOf(100));
TransferBalanceResponse transferBalanceResponse = sdk.getAccountService().transferBalance(transferBalanceRequest);
if (!transferBalanceResponse.isSuccess()) {
logger.error("transferBalance failed, errorCode :{}, errorDesc: {}", transferBalanceResponse.getErrorCode().getErrorCode(), transferBalanceResponse.getErrorCode().getErrorDesc());
} else {
// 交易收据
TransactionReceipt transactionReceipt = transferBalanceResponse.getTransactionReceipt();
if (transactionReceipt.getResult() != 0) {
logger.error("transferBalance failed, errorCode :{}, errorDesc: {}", ErrorCode.valueOf((int) transactionReceipt.getResult()).getErrorCode(), ErrorCode.valueOf((int) transactionReceipt.getResult()).getErrorDesc());
} else {
logger.info("transferBalance success.返回信息: {}", transactionReceipt.toString());
}
}
//查询转账交易的交易收据
Hash hash = transferBalanceResponse.getTxHash();
QueryTransactionReceiptResponse queryTransactionReceiptResponse = sdk.getQueryService().queryTransactionReceipt(hash);
if (!queryTransactionReceiptResponse.isSuccess()) {
logger.error("queryTransactionReceipt failed, errorCode :{}, errorDesc: {}", queryTransactionReceiptResponse.getErrorCode().getErrorCode(), queryTransactionReceiptResponse.getErrorCode().getErrorDesc());
} else {
// 交易收据
TransactionReceipt transactionReceipt = queryTransactionReceiptResponse.getTransactionReceipt();
if (transactionReceipt.getResult() != 0) {
logger.error("queryTransactionReceipt failed, errorCode :{}, errorDesc: {}", ErrorCode.valueOf((int) transactionReceipt.getResult()).getErrorCode(), ErrorCode.valueOf((int) transactionReceipt.getResult()).getErrorDesc());
} else {
logger.info("queryTransactionReceipt success.返回信息: {}", transactionReceipt.toString());
}
}
}
查询账户
queryAccount,通过账户号查询账户。
函数原型
public QueryAccountResponse queryAccount(Identity acctId)
请求参数
参数 | 必选 | 类型 | 说明 |
acctId | true | Identity | 账户 ID |
返回字段
返回字段 | 字段类型 | 说明 |
response |
| 查询账号的响应 |
QueryAccountResponse,具体参数见下表。
参数 | 类型 | 说明 |
blockNumber | BigInteger | 区块高度 |
account |
| 账号 |
Account,具体参数见下表。
参数 | 类型 | 说明 |
id | Identity | 被创建账户的ID |
balance | BigInteger | 账户的余额 |
authMap | AuthMap | 公钥及其对应的权重信息 |
recoverKey | PublicKey | 恢复密钥的公钥 |
recoverTimestamp | long | 上一次恢复的时间戳 |
status | AccountStatus | 账户的状态:
|
encryptionKey | byte[] | 加密密钥 |
hashTypeEnum | HashTypeEnum | 账户的hash类型:
|
AuthMap,具体参数见下表。
参数 | 类型 | 说明 |
authMap | Map<PublicKey, Integer> | 存放公钥及其对应的权重信息 |
PublicKey,具体参数见下表。
参数 | 类型 | 说明 |
data | byte[] | 公钥字节 |
示例
public void queryAccount() {
//根据账户名称查询账号
Identity acctId = Utils.getIdentityByName("Tester001");
QueryAccountResponse queryAccountResponse = sdk.getQueryService().queryAccount(acctId);
if (!queryAccountResponse.isSuccess()) {
logger.error("queryAccount failed, errorCode: {}, errorDesc: {}", queryAccountResponse.getErrorCode().getErrorCode(), queryAccountResponse.getErrorCode().getErrorDesc());
} else {
logger.info("queryAccount success: {}" + queryAccountResponse.toString());
Account account = queryAccountResponse.getAccount();
logger.info("account :{}", account.toString());
}
}
查询合约
queryContract,通过合约账户查询合约。
函数原型
public QueryContractResponse queryContract(Identity contractId)
请求参数
参数 | 必选 | 类型 | 说明 |
contractId | true | Identity | 合约 ID |
返回字段
返回字段 | 字段类型 | 说明 |
response |
| 查询合约的响应 |
QueryContractResponse,具体参数见下表。
参数 | 类型 | 说明 |
blockNumber | BigInteger | 区块高度 |
contract |
| 合约 |
Contract,具体参数见下表。
参数 | 类型 | 说明 |
storageRoot | Hash | 数据存储根 |
codeHash | Hash | 合约代码hash |
code | byte[] | 合约代码 |
contractVersion | short | 合约版本 |
code
中查询得到的合约代码不是源代码,如果是Solidity合约的代码,会带上一个字节的01
前缀;如果是WASM合约的代码,会带上一个字节的02
前缀,您需要去掉前缀后再进行解析,才能获得合约字节码。
示例
public void queryContract() {
//根据合约名称查询合约
QueryContractResponse queryContractResponse = sdk.getQueryService().queryContract(
Utils.getIdentityByName("contractName"));
if (!queryContractResponse.isSuccess()) {
logger.error("queryContract failed, errorCode: {}, errorDesc: {}", queryContractResponse.getErrorCode().getErrorCode(), queryContractResponse.getErrorCode().getErrorDesc());
} else {
logger.info("queryContract success: {}" + queryContractResponse.toString());
Contract contract = queryContractResponse.getContract();
logger.info("contract :{}", contract.toString());
}
}
查询区块里面的交易回执
queryBlockTxReceipts,通过块高查询区块里面的交易回执。
函数原型
public QueryBlockTxReceiptsResponse queryBlockTxReceipts(BigInteger blockNumber);
请求参数
参数 | 必选 | 类型 | 说明 |
blockNumber | true | BigInteger | 需要查询的块高 |
返回字段
返回字段 | 字段类型 | 说明 |
response |
| 查询区块里面交易回执的响应 |
QueryBlockTxReceiptsResponse
查询区块里面交易回执响应的参数:
参数 | 类型 | 说明 |
blockInfo |
| 区块信息 |
BlockInfo,具体参数见下表。
参数 | 类型 | 说明 |
txHashs | List<Hash> | 交易hash |
receiptList | List< | 交易收据 |
blockNumber | BigInteger | 区块高度 |
示例
public void queryBlockTxReceipts() {
//获取最后一个区块,以便获取区块编号
QueryLastBlockResponse queryLastBlockResponse = sdk.getQueryService().queryLastBlock();
//通过区块编号查询交易收据
QueryBlockTxReceiptsResponse queryBlockTxReceiptsResponse = sdk.getQueryService().queryBlockTxReceipts(queryLastBlockResponse.getBlock().getBlockHeader().getNumber());
if (!queryBlockTxReceiptsResponse.isSuccess()) {
logger.error("queryBlockTxReceipts failed, errorCode :{}, errorDesc: {}", queryBlockTxReceiptsResponse.getErrorCode().getErrorCode(), queryBlockTxReceiptsResponse.getErrorCode().getErrorDesc());
} else {
logger.info("queryBlockTxReceipts success: {}" + queryBlockTxReceiptsResponse.toString());
BlockInfo blockInfo = queryBlockTxReceiptsResponse.getBlockInfo();
logger.info("blockInfo : {}", blockInfo.toString());
}
}
交易内容解析
存证交易内容解析
对于存证的交易内容,其加密方式是由业务系统自己定的,SDK并不会对存证内容进行加密,只是将存证的内容(或业务系统加密后的存证内容)转成二进制存到链上。因此,如需对存证交易内容进行解密查看,需由业务系统根据存证内容的加密方式进行针对性解密。
在以下给出的一段示例中,可以清楚地了解存证内容 hello world 进行Base64编码进行上链,然后查询这个交易,最终将交易数据使用Base64解码器进行解码还原的全过程。
private void deposit() {
String data = "hello world";
//将存证内容转为Base64编码
byte[] encodeData = Base64.getEncoder().encode(data.getBytes());
//发送存证请求
DepositDataRequest request = new DepositDataRequest(userIdentity,
userIdentity, encodeData, BigInteger.valueOf(100));
DepositDataResponse result = sdk.getAccountService().depositData(request);
//查询交易
QueryTransactionResponse queryResult = sdk.getQueryService().queryTransaction(
request.getTransaction().getHash());
//存证内容解码
byte[] sourceData = queryResult.getTransaction().getData();
byte[] decodeData= Base64.getDecoder().decode(sourceData);
log.info("deposit decode={}",new String(decodeData));
}
合约交易内容解析
调用查询结果接口得到的output
需要使用EVMOutput
或WasmOutput
进行数据解析,具体介绍可参见EVM 数据解析或WASM 数据解析。
在以下给出的一段示例中,可以清楚地了解调用合约后处理可能出现的错误信息,并将错误信息进行解码的全过程。
//调用合约
CallContractResponse replyTransactionReceipt = sdk.getContractService().callContract(request);
//
如果response返回的code是 10201,按照以下方式解析output
byte[] decode = replyTransactionReceipt.getTransactionReceipt().getOutput();
byte[] content = new byte[decode.length-4];
System.arraycopy(decode,4,content,0,content.length);
EVMOutput vmOutput = new EVMOutput(ByteUtils.toHexString(content));
System.out.println(vmOutput.getString());