信封交易接口

信封交易是指将交易放入一个独立的组中执行从而起到隐私保护的目的。智能合约平台支持部署合约、调用合约、更新合约、查询合约的信封交易。

depositEnvelope

信封交易,同步方式调用。

  • 函数原型

public DepositEnvelopeResponse depositEnvelope(DepositEnvelopeRequest request)
  • 请求参数

参数

必选

类型

说明

request

true

DepositEnvelopeRequest

信封交易的请求

DepositEnvelopeRequest,具体参数见下表。

参数

必选

类型

说明

anoymousIdentity

true

Identity

匿名身份

signerBases

true

List<SignerBase>

签名配置选项

keypair

true

Keypair

密钥对

GroupTransactionRequest是DepositEnvelopeRequest的父类,具体参数见下表。

参数

类型

说明

request

AbstractTransactionRequest

内层交易,包括部署合约、调用合约、更新合约。

  • 返回字段

返回字段

字段类型

说明

response

DepositEnvelopeResponse

信封交易的响应

DepositEnvelopeResponse,具体参数见下表。

参数

类型

说明

transactionReceipt

TransactionReceipt

交易收据

blockNumber

BigInteger

区块号

txIndex

int

交易偏移量

txHash

Hash

交易hash

isLocalTransaction

boolean

是否为本地交易

TransactionReceipt,具体参数见下表。

参数

类型

说明

result

long

交易执行结果,0 代表成功,其他值代表失败

gasUsed

BigInteger

交易执行所花费的gas费用

logs

List<logEntry>

交易结果日志输出

output

byte[]

交易的输出,此处为虚拟机的执行结果

LogEntry,具体参数见下表。

参数

类型

说明

from

Identity

交易结果日志中的字段,代表交易发送者

to

Identity

交易结果日志中的字段,代表交易接收者

topics

List<String>

交易结果日志中的字段,交易执行的事件主题

logData

byte[]

交易结果日志中的字段,交易执行中的日志数据

  • 示例

public void depositEnvelope() {
        // create Group
        CreateGroupRequest createGroupRequest = new CreateGroupRequest(new PublicKey(keypair.getPubkeyId()), Utils.getIdentityByName("Administrator"));
        createGroupResponse = sdk.getEnvelopeService().createGroup(createGroupRequest);

        // join group
        byte[] groupPrivateKey = createGroupResponse.getPrivateKey();
        PublicKey anoymousPublicKey = new PublicKey(keypair.getPubkeyId());
        JoinGroupRequest joinGroupRequest = new JoinGroupRequest(groupPrivateKey, anoymousPublicKey, createGroupResponse.getGroupId(), Utils.getIdentityByName("Administrator"));
        JoinGroupResponse joinGroupResponse = sdk.getEnvelopeService().joinGroup(joinGroupRequest);

        // get groupId by createGroupResponse
        BaseFixedSizeByteArray.Fixed20ByteArray groupId = createGroupResponse.getGroupId();

        // get keypair from createGroupResponse
        Pkcs8KeyOperator pkcs8KeyOperator = new Pkcs8KeyOperator();
        Keypair keypair = pkcs8KeyOperator.loadFromPrivkey(createGroupResponse.getPrivateKey());

        // create signerOption by keypair
        SignerOption signerOption = new SignerOption();
        List<SignerBase> signerBases = new ArrayList<>();
        signerBases.add(MyCrypto.getInstance().createSigner(keypair));
        signerOption.setSigners(signerBases);

        // create inner request
        // build account
        String accountName = "accountName";
        Identity userIdentity = Utils.getIdentityByName(accountName);
        Account account = new Account();
        account.setIdentity(userIdentity);
        account.setBalance(BigInteger.ZERO);
        account.setStatus(AccountStatus.NORMAL);
        AuthMap authMap = new AuthMap();
        account.setAuthMap(authMap.updateAuth(new PublicKey(administratorPublicKey1), 100));
        account.setAuthMap(authMap.updateAuth(new PublicKey(administratorPublicKey2), 100));
        account.setAuthMap(authMap.updateAuth(new PublicKey(administratorPublicKey3), 100));
        account.setAuthMap(authMap.updateAuth(new PublicKey(administratorPublicKey4), 100));
        account.setRecoverKey(new PublicKey(administratorPublicKey1));
        CreateAccountRequest createAccountRequest = new CreateAccountRequest(Utils.getIdentityByName("Administrator"), account);

        // create DepositEnvelopeRequest
        IHash hashTool = HashFactory.getHash();

        DepositEnvelopeRequest request = new DepositEnvelopeRequest(createAccountRequest, groupId, signerBases, keypair);
        request.setAnonymousIdentity(new Identity(hashTool.hash(keypair.getPubkeyId())));

        DepositEnvelopeResponse depositEnvelopeResponse = sdk.getEnvelopeService().depositEnvelope(request);
        if (!depositEnvelopeResponse.isSuccess()) {
            logger.error("depositEnvelope failed, errorCode :{}, errorDesc: {}", depositEnvelopeResponse.getErrorCode().getErrorCode(), depositEnvelopeResponse.getErrorCode().getErrorDesc());
        } else {
            // 交易收据
            TransactionReceipt transactionReceipt = depositEnvelopeResponse.getTransactionReceipt();
            if (transactionReceipt.getResult() != 0) {
                logger.error("depositEnvelope failed, errorCode :{}, errorDesc: {}", ErrorCode.valueOf((int) transactionReceipt.getResult()).getErrorCode(), ErrorCode.valueOf((int) transactionReceipt.getResult()).getErrorDesc());
            } else {
                logger.info("depositEnvelope success.返回信息: {}", transactionReceipt.toString());
            }
        }
    }

asyncDepositRequest

信封交易,异步方式调用。

  • 函数原型

public int asyncDepositRequest(DepositEnvelopeRequest request, IAsyncCallback callback)
  • 请求参数

参数

必选

类型

说明

request

true

DepositEnvelopeRequest

信封交易的请求

callback

true

IAsyncCallback

回调函数

DepositEnvelopeRequest,具体参数见下表。

参数

必选

类型

说明

anoymousIdentity

true

Identity

匿名身份

signerBases

true

List<SignerBase>

签名配置选项

keypair

true

Keypair

密钥对

GroupTransactionRequest是DepositEnvelopeRequest的父类,具体参数见下表。

参数

类型

说明

request

AbstractTransactionRequest

内层交易,包括部署合约、调用合约、更新合约。

  • 返回字段

返回字段

字段类型

说明

result

int

发送返回值

  • 异步返回字段

返回字段

字段类型

说明

errorCode

int

SDK 发送消息超时或者成功。

response

Response

平台返回的响应,其中 response.getErrorCode()是平台返回的错误码。

(DepositEnvelopeResponse)Response,具体参数见下表。

参数

类型

说明

transactionReceipt

TransactionReceipt

交易收据

blockNumber

BigInteger

区块号

txIndex

int

交易偏移量

txHash

Hash

交易hash

isLocalTransaction

boolean

是否为本地交易

TransactionReceipt,具体参数见下表。

参数

类型

说明

result

long

交易执行结果,0 代表成功,其他值代表失败

gasUsed

BigInteger

交易执行所花费的gas费用

logs

List<logEntry>

交易结果日志输出

output

byte[]

交易的输出,此处为虚拟机的执行结果

LogEntry,具体参数见下表。

参数

类型

说明

from

Identity

交易结果日志中的字段,代表交易发送者

to

Identity

交易结果日志中的字段,代表交易接受者

topics

List<String>

交易结果日志中的字段,交易执行的事件主题

logData

byte[]

交易结果日志中的字段,交易执行中的日志数据

  • 示例

DepositEnvelopeRequest request = new DepositEnvelopeRequest(createAccountRequest, groupId, signerBases, keypair);
request.setAnoymousIdentity(new Identity(hashTool.hash(keypair.getPubkeyId())));
int result = sdk.getEnvelopeService().asyncDepositRequest(
    request,
    new IAsyncCallback() {
        @Override
        public void onResponse(int errorCode, Response response) {
            // 请参考错误信息章节,检查返回的数据
            System.out.println("async deposit envelope, errorCode:" + errorCode + ", response: " + response.getErrorCode());
            DepositEnvelopeResponse receiptResponse = (DepositEnvelopeResponse) response;
        }
    });