查询接口

查询区块头

queryBlockHeader

按区块哈希查询区块头。

  • 函数原型

public QueryBlockHeaderResponse queryBlockHeader(Hash hash)
  • 请求参数

参数

必选

类型

说明

hash

true

Hash

区块 hash

  • 返回字段

返回字段

字段类型

说明

response

QueryBlockHeaderResponse

查询区块头的响应

QueryBlockHeaderResponse,具体参数见下表。

参数

类型

说明

blockHeader

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

查询区块头的响应

QueryBlockHeaderResponse,具体参数见下表。

参数

类型

说明

blockHeader

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

查询区块头的响应

QueryBlockHeaderResponse,具体参数见下表。

参数

类型

说明

blockHeader

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

查询区块的响应

QueryBlockResponse,具体参数见下表。

参数

类型

说明

block

Block

区块

Block,具体参数见下表。

参数

类型

说明

blockHeader

BlockHeader

区块头

blockBody

BlockBody

区块体

BlockBody,具体参数见下表。

参数

类型

说明

transactionList

List<Transaction>

交易列表

receiptList

List<TransactionReceipt>

交易收据列表

consensusProof

byte[]

共识证明

Transaction,具体参数见下表。

参数

类型

说明

txType

TransactionType

交易类型

data

byte[]

交易数据

signatureList

List<byte[]>

签名

hash

Hash

交易hash

from

Identity

交易发起方账户

to

Identity

交易接收方账户

timestamp

long

交易的时间戳,默认为0时,由sender帮忙生成当前时间戳,不为0时,使用该值作为交易的时间戳

period

long

保留字段,以便后续扩展时使用

nonce

Fixed64BitUnsignedInteger

交易的随机值,默认为0时,由sender帮忙生成随机值,不为0时,使用该值作为交易的nonce值

gas

BigInteger

该交易所能消耗的最大gas(大于基本gas:20000)

value

Fixed64BitUnsignedInteger

转账的value值

extensions

List<Extension>

扩展

groupId

BaseFixedSizeByteArray.Fixed20ByteArray

组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

查询区块的响应

QueryBlockResponse,具体参数见下表。

参数

类型

说明

block

Block

区块

Block,具体参数下表。

参数

类型

说明

blockHeader

BlockHeader

区块头

blockBody

BlockBod

区块体

  • 示例

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

查询区块的响应

QueryBlockResponse,具体参数见下表。

参数

类型

说明

block

Block

区块

Block,具体参数见下表。

参数

类型

说明

blockHeader

BlockHeader

区块头

blockBody

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

查询交易的响应

QueryTransactionResponse,具体参数见下表。

参数

类型

说明

transaction

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

查询收据的响应

QueryTransactionReceiptResponse,具体参数见下表。

参数

类型

说明

transactionReceipt

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

查询账号的响应

QueryAccountResponse,具体参数见下表。

参数

类型

说明

blockNumber

BigInteger

区块高度

account

Account

账号

Account,具体参数见下表。

参数

类型

说明

id

Identity

被创建账户的ID

balance

BigInteger

账户的余额

authMap

AuthMap

公钥及其对应的权重信息

recoverKey

PublicKey

恢复密钥的公钥

recoverTimestamp

long

上一次恢复的时间戳

status

AccountStatus

账户的状态:

  • NORMAL(0)

  • FREEZE(1)

  • RECOVERING(2)

encryptionKey

byte[]

加密密钥

hashTypeEnum

HashTypeEnum

账户的hash类型:

  • SHA256(0)

  • SM3(1)

  • Keccak(2)

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

查询合约的响应

QueryContractResponse,具体参数见下表。

参数

类型

说明

blockNumber

BigInteger

区块高度

contract

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

查询区块里面交易回执的响应

QueryBlockTxReceiptsResponse

查询区块里面交易回执响应的参数:

参数

类型

说明

blockInfo

BlockInfo

区块信息

BlockInfo,具体参数见下表。

参数

类型

说明

txHashs

List<Hash>

交易hash

receiptList

List<TransactionReceipt>

交易收据

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需要使用EVMOutputWasmOutput进行数据解析,具体介绍可参见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());