信封交易是指将交易放入一个独立的组中执行从而起到隐私保护的目的。智能合约平台支持部署合约、调用合约、更新合约、查询合约的信封交易。
depositEnvelope
信封交易,同步方式调用。
函数原型
public DepositEnvelopeResponse depositEnvelope(DepositEnvelopeRequest request)
请求参数
参数 | 必选 | 类型 | 说明 |
---|---|---|---|
request | true |
| 信封交易的请求 |
DepositEnvelopeRequest,具体参数见下表。
参数 | 必选 | 类型 | 说明 |
anoymousIdentity | true | Identity | 匿名身份 |
signerBases | true |
| 签名配置选项 |
keypair | true | Keypair | 密钥对 |
GroupTransactionRequest是DepositEnvelopeRequest的父类,具体参数见下表。
参数 | 类型 | 说明 |
request |
| 内层交易,包括部署合约、调用合约、更新合约。 |
返回字段
返回字段 | 字段类型 | 说明 |
---|---|---|
response |
| 信封交易的响应 |
DepositEnvelopeResponse,具体参数见下表。
参数 | 类型 | 说明 |
transactionReceipt |
| 交易收据 |
blockNumber | BigInteger | 区块号 |
txIndex | int | 交易偏移量 |
txHash | Hash | 交易hash |
isLocalTransaction | boolean | 是否为本地交易 |
TransactionReceipt,具体参数见下表。
参数 | 类型 | 说明 |
result | long | 交易执行结果,0 代表成功,其他值代表失败 |
gasUsed | BigInteger | 交易执行所花费的gas费用 |
logs |
| 交易结果日志输出 |
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 |
| 信封交易的请求 |
callback | true | IAsyncCallback | 回调函数 |
DepositEnvelopeRequest,具体参数见下表。
参数 | 必选 | 类型 | 说明 |
anoymousIdentity | true |
| 匿名身份 |
signerBases | true |
| 签名配置选项 |
keypair | true |
| 密钥对 |
GroupTransactionRequest是DepositEnvelopeRequest的父类,具体参数见下表。
参数 | 类型 | 说明 |
request |
| 内层交易,包括部署合约、调用合约、更新合约。 |
返回字段
返回字段 | 字段类型 | 说明 |
---|---|---|
result | int | 发送返回值 |
异步返回字段
返回字段 | 字段类型 | 说明 |
errorCode | int | SDK 发送消息超时或者成功。 |
response |
| 平台返回的响应,其中 |
(DepositEnvelopeResponse)Response,具体参数见下表。
参数 | 类型 | 说明 |
transactionReceipt |
| 交易收据 |
blockNumber | BigInteger | 区块号 |
txIndex | int | 交易偏移量 |
txHash | Hash | 交易hash |
isLocalTransaction | boolean | 是否为本地交易 |
TransactionReceipt,具体参数见下表。
参数 | 类型 | 说明 |
result | long | 交易执行结果,0 代表成功,其他值代表失败 |
gasUsed | BigInteger | 交易执行所花费的gas费用 |
logs |
| 交易结果日志输出 |
output | byte[] | 交易的输出,此处为虚拟机的执行结果 |
LogEntry,具体参数见下表。
参数 | 类型 | 说明 |
from |
| 交易结果日志中的字段,代表交易发送者 |
to |
| 交易结果日志中的字段,代表交易接受者 |
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;
}
});