不合法的偏移量 钉钉接口_合约接口

本文档介绍了如何使用SDK进行智能合约的部署、调用和升级,包括同步和异步方式。示例中包含了部署、调用合约的请求参数和返回值的解析,展示了EVM虚拟机环境下合约交互的详细步骤。
摘要由CSDN通过智能技术生成

部署合约

deployContract

部署合约,同步方式调用。

函数原型

publicMychainBaseResultdeployContract(DeployContractRequestrequest)

请求参数

参数

必选

类型

说明

request

true

DeployContractRequest

部署合约的请求

返回字段

返回字段

字段类型

说明

result

MychainBaseResult

MychainBaseResult 持有所有 response 类型。

示例

// build params

MychainParamsparams=newMychainParams.Builder()

.gas(BigInteger.valueOf(4000000))

.privateKeyList(adminPrivateKeys)

.build();

ContractParameterscontractParameters=newContractParameters();

//deploy contract

MychainBaseResultresult=sdk.getContractService().deployContract(

DeployContractRequest.build(

adminAccount.getIdentity(),

Utils.getIdentityByName(testContractId),

contractCode,

VMTypeEnum.EVM,

contractParameters,

BigInteger.ZERO,

params

)

);

asyncDeployContract

部署合约,异步方式调用。

函数原型

publicMychainBaseResultasyncDeployContract(DeployContractRequestrequest,ICallbackcallback)

请求参数

参数

必选

类型

说明

request

true

DeployContractRequest

部署合约的请求

callback

true

ICallback

回调函数

返回字段

返回字段

字段类型

说明

result

MychainBaseResult

MychainBaseResult 持有所有 response 类型。

示例

// build params

MychainParamsparams=newMychainParams.Builder()

.gas(BigInteger.valueOf(4000000))

.privateKeyList(adminPrivateKeys)

.build();

ContractParameterscontractParameters=newContractParameters();

//deploy contract

MychainBaseResultresult=sdk.getContractService().asyncDeployContract(

DeployContractRequest.build(

adminAccount.getIdentity(),

Utils.getIdentityByName(testContractId),

contractCode,

VMTypeEnum.EVM,

contractParameters,

BigInteger.ZERO,

params

),

(txHash,response)->{

System.out.println("async deploy contract, txHash:"+txHash+", result: "+response.getErrorCode());

}

);

DeployContractRequest

下面是部署合约所需要的参数。

参数

类型

说明

acctId

Identity

部署合约的账户 ID

contractId

Identity

合约 ID

code

byte[]

合约代码

vmTypeEnum

VMTypeEnum

虚拟机类型,默认使用 EVM 虚拟机,后续将支持其它虚拟机类型。

parameters

Parameters

合约参数

value

BigInteger

合约金额

mychainParams

MychainParams

接口通用扩展参数

调用合约

callContract

调用合约,同步方式调用。

函数原型

publicMychainBaseResultcallContract(CallContractRequestrequest)

请求参数

参数

必选

类型

说明

request

true

CallContractRequest

调用合约的请求

返回字段

返回字段

字段类型

说明

result

MychainBaseResult

MychainBaseResult 持有所有 response 类型。

示例

// build params

MychainParamsparams=newMychainParams.Builder()

.gas(BigInteger.valueOf(4000000))

.privateKeyList(adminPrivateKeys)

.build();

ContractParametersparameters=newContractParameters("set(uint256)");

parameters.addUint(newBigInteger("100"));

BigIntegervalue=newBigInteger("0");

//call contract

MychainBaseResultreplyTransactionReceipt=sdk.getContractService().callContract(

CallContractRequest.build(

adminAccount.getIdentity(),

Utils.getIdentityByName(testContractId),

parameters,

value,

params

)

);

asyncCallContract

调用合约,异步方式调用。

函数原型

publicMychainBaseResultasyncCallContract(CallContractRequestrequest,ICallbackcallback)

请求参数

参数

必选

类型

说明

request

true

CallContractRequest

调用合约的请求

callback

true

ICallback

回调函数

返回字段

返回字段

字段类型

说明

result

MychainBaseResult

MychainBaseResult 持有所有 response 类型。

示例

// build params

MychainParamsparams=newMychainParams.Builder()

.gas(BigInteger.valueOf(4000000))

.privateKeyList(adminPrivateKeys)

.build();

ContractParametersparameters=newContractParameters("set(uint256)");

parameters.addUint(newBigInteger("100"));

// call contract

MychainBaseResultreplyTransactionReceipt=sdk.getContractService().asyncCallContract(

CallContractRequest.build(

adminAccount.getIdentity(),

Utils.getIdentityByName(testContractId),

parameters,

value,

params

),

(txHash,response)->{

System.out.println("async call contract, txHash:"+txHash+", result: "+response.getErrorCode());

}

);

CallContractRequest

调用合约所需要的参数:

参数

类型

说明

acctId

Identity

提交交易的账户 ID

contractId

Identity

合约 ID

parameters

Parameters

合约参数

value

BigInteger

合约金额

mychainParams

MychainParams

接口通用扩展参数

升级合约

updateContract

升级合约,同步方式调用。

函数原型

publicMychainBaseResultupdateContract(UpdateContractRequestrequest)

请求参数

参数

必选

类型

说明

request

true

UpdateContractRequest

升级合约的请求

返回字段

返回字段

字段类型

说明

result

MychainBaseResult

MychainBaseResult 持有所有 response 类型。

示例

// build params

MychainParamsparams=newMychainParams.Builder()

.gas(BigInteger.valueOf(40000))

.privateKeyList(adminPrivateKeys)

.build();

ContractParameterscontractParameters=newContractParameters();

//update contract

MychainBaseResultresult=sdk.getContractService()

.updateContract(

UpdateContractRequest.build(Utils.getIdentityByName(testContractId),newContractCode,VMTypeEnum.EVM,params));

asyncUpdateContract

升级合约,异步方式调用。

函数原型

publicMychainBaseResultasyncUpdateContract(UpdateContractRequestrequest,ICallbackcallback)

请求参数

参数

必选

类型

说明

request

true

UpdateContractRequest

升级合约的请求

callback

true

ICallback

回调函数

返回字段

返回字段

字段类型

说明

result

MychainBaseResult

MychainBaseResult 持有所有 response 类型。

示例

// build params

// build params

MychainParamsparams=newMychainParams.Builder()

.gas(BigInteger.valueOf(40000))

.privateKeyList(adminPrivateKeys)

.build();

ContractParameterscontractParameters=newContractParameters();

//update contract

MychainBaseResultresult=sdk.getContractService().asyncUpdateContract(

UpdateContractRequest.build(contractId,newContractCode,VMTypeEnum.EVM,params),

newICallback(){

@Override

publicvoidonResponse(StringtxHash,Responseresponse){

System.out.println("async update contract, txHash:"+txHash+", result: "

+response.getErrorCode());

assertTrue(response.isSuccess());

assertEquals("0",response.getErrorCode().getErrorCode());

}

});

UpdateContractRequest

升级合约所需要的参数:

参数

类型

说明

contractId

Identity

合约 ID

code

byte[]

目标合约的字节码,为 16 进制表示,无需“0x”作为前缀

vmTypeEnum

VMTypeEnum

虚拟机类型

mychainParams

MychainParams

接口通用扩展参数

说明:升级合约时,传入的 bytecode 字节码是 runtime 字节码,使用二进制 solc 编译工具的 —bin-runtime 参数可以直接得到,是正常 —bin 参数编译的字节码的子集。runtime 字节码通过本地执行合约部署操作也可获取到。

合约参数对象

参数对象,用于编码合约方法和参数。

EVM 合约参数对象ContractParameters

函数名称

参数类型

参数说明

setMethodSignature()

String

添加函数选择器,方法与参数列表构成的字符串。

getEncodedData()

String

EVM 参数字节码。

addInt()

BigInteger

添加静态的 int 类型的数据。

addUInt()

BigInteger

添加静态的 uint 类型的数据。

addBool()

boolean

添加静态的 bool 类型的数据。

addIdentity()

Identity

添加静态的 identity 类型的数据。

addString ()

String

添加动态的 string 类型的数据。

addBytes()

byte[]

添加动态的 bytes 类型的数据。

addBytesN()

byte[]

添加静态的 bytes 类型的数据。

addIntArray()

List

添加动态的 int 数组类型的数据。

addUIntArray()

List

添加动态的 uint 数组类型的数据。

addBytesNArray()

byte[] value

添加动态的 bytes 数组类型的数据。

addBooleanArray()

List

添加动态的 bool 数组类型的数据。

代码示例

//JAVA 示例代码

MychainParamsparams=newMychainParams();

params.setGas(BigInteger.valueOf(4000000));

params.setPrivateKeyList(adminPrivateKeys);

BigIntegervalue=newBigInteger("0");

ContractParametersparameters=newContractParameters("set(uint256)");

parameters.addUint(newBigInteger("100"));

CallContractRequestrequest=CallContractRequest.build(adminAccount.getIdentity(),

Utils.getIdentityByName(testContractId,env),parameters,value,params,0,0,

BaseFixedSizeUnsignedInteger.Fixed64BitUnsignedInteger.valueOf(BigInteger.ONE));

assertNotNull(request);

MychainBaseResultreplyTransactionReceipt=sdk

.getContractService().callContract(request);

EVM 数据解析ContractReturnValues

函数名称

参数类型

参数说明

ContractReturnValues()

String

虚拟机返回的字符串。

getInt()

BigInteger

获取静态的 int 类型的数据。

getUInt()

BigInteger

获取静态的 uint 类型的数据。

getBool()

boolean

获取 bool 类型的数据。

getIdentity()

Identity

获取 identity 类型的数据。

getString ()

String

获取 string 类型的数据。

getBytes()

byte[]

获取 bytes 类型的数据。

getBytesN()

byte[]

获取 bytes 类型的数据。

getIntArray()

List

获取 int 数组类型的数据。

getUIntArray()

List

获取 uint 数组类型的数据。

getBytesNArray()

byte[] value

获取 bytes 数组类型的数据。

getBooleanArray()

List

获取 bool 数组类型的数据。

EVM 合约编码说明

EVM 的参数和返回值编码规则一致,都与 Solidity 合约一样。对于静态类型的变量,直接编码为 32 字节按顺序拼接。对应动态数据类型,则用一个 32 字节偏移量占住位置,所有动态数据类型的真实数据按顺序以 LV 的格式放在后面。其中 L 表示数据的实际长度,L 占用 32 字节;V 为实际数据。

下面通过示例进行详细说明。

要返回的多值结果列表

假设要返回一个多值结果列表,如下表所示。

类型

uint

100

String

“abc”

String

“0123456789abcdefghijklmnopqrstuvwxyz”

boolean

true

Identity

“1e7d3e769f3f593dadcb8634cc5b09fc90dd3a61c4a06a79cb0923662fe6fae6b”

编码结果

编码结果如下:

0000000000000000000000000000000000000000000000000000000000000064

00000000000000000000000000000000000000000000000000000000000000a0

00000000000000000000000000000000000000000000000000000000000000e0

0000000000000000000000000000000000000000000000000000000000000001

e7d3e769f3f593dadcb8634cc5b09fc90dd3a61c4a06a79cb0923662fe6fae6b

0000000000000000000000000000000000000000000000000000000000000003

6162630000000000000000000000000000000000000000000000000000000000

0000000000000000000000000000000000000000000000000000000000000024

303132333435363738396162636465666768696a6b6c6d6e6f70717273747576

7778797a00000000000000000000000000000000000000000000000000000000

具体解析0000000000000000000000000000000000000000000000000000000000000064 为“100”的编码,uint 类型,定长 32 字节,是大端编码。

00000000000000000000000000000000000000000000000000000000000000a0“abc”为动态类型,这里的 a0 为其实际数据编码所处偏移位置。因为这里一共 5 个变量,每个变量占用 0x20 个字节,所以第一个动态类型的数据偏移位置就是 5*0x20=0xA0,偏移量的编码规则和 uint 一样。

000000000000000000000000000000000000000000000000000000000000000e0 “0123456789abcdefghijklmopqrstuvwxyz” 为动态类型,这里 e0 为其实际数据编码所处偏移位置。本数据在“abc”之后,由于“abc”的长度和数据各占 0x20 字节,所以本数据就在 0xA0+0x40=0xE0 的位置。

00000000000000000000000000000000000000000000000000000000000000001 为“true” 的编码,bool 型数据,定长 32 字节。true 最后一个字节为 01;false 最后一个字节为 00。

1e7d3e769f3f593dadcb8634cc5b09fc90dd3a61c4a06a79cb0923662fe6fae6b 是一个 “Identity” 类型的编码,与源数据完全一致。

00000000000000000000000000000000000000000000000000000000000000003 为“abc”的长度,编码规则和 uint 一样。

61626300000000000000000000000000000000000000000000000000000000000 为“abc”的实际数据,String 类型的数据占用长度为 32 的整数倍,实际数据靠左编码,后面填充 00。

00000000000000000000000000000000000000000000000000000000000000024 为 “0123456789abcdefghijklmnopqrstuvwxyz” 的编码,长度为 36=0x24。

303132333435363738396162636465666768696a6b6c6d6e6f70717273747576,7778797a00000000000000000000000000000000000000000000000000000000 为“0123456789abcdefghijklmnopqrstuvwxyz”的实际数据编码。

// 获取返回值解码示例

ContractReturnValuescontractReturnValues=newContractReturnValues(ByteUtils.toHexString(replyTransactionReceipt.getData().getTransactionReceipt().getOutput()));

//按顺序获得返回值

BigIntegerbigInteger=contractReturnValues.getUint();// 100

Stringstring=contractReturnValues.getString();// "abc"

// "0123456789abcdefghijklmnopqrstuvwxyz"

Stringstring1=contractReturnValues.getString();

booleanb=contractReturnValues.getBoolean();// true

// "1e7d3e769f3f593dadcb8634cc5b09fc90dd3a61c4a06a79cb0923662fe6fae6b"

Identityid=contractReturnValues.getIdentity();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值