Icon Link与合约交互

与合约交互有四种方式:getdryRunsimulatecall

Icon Linkget

get 方法应该用于从区块链中读取数据而不使用资源。它可以与未资助的钱包一起使用,甚至可以完全不使用钱包:

const contract = new Contract(contractId, abi, provider);
 
const { value } = await contract.functions.get_count().get();

Icon LinkdryRun

dryRun 方法应该用于模拟合约调用。它不会消耗资源,可以与未资助的钱包一起使用,甚至可以完全不使用钱包:

const contract = new Contract(contractId, abi, provider);
 
const { value } = await contract.functions.increment_count(1).dryRun();

Icon Linksimulate

simulate 方法应该用于模拟合约调用,确保使用的钱包具有足够的资金来支付交易费用,而不消耗任何资源。

需要一个资助的钱包:

const contract = new Contract(contractId, abi, fundedWallet);
 
const { value } = await contract.functions.increment_count(10).simulate();

Icon Linkcall

call 方法应该用于向节点提交真实的合约调用交易。

会消耗真实资源,并且合约函数执行的任何操作都将在区块链上处理。

await contract.functions.increment_count(10).call();

Icon LinkisReadOnly(实用工具)

如果您想确定一个函数是否是只读的,可以使用 isReadOnly 方法:

const isReadOnly = contract.functions.get_count.isReadOnly();
 
if (isReadOnly) {
  await contract.functions.get_count().get();
} else {
  await contract.functions.get_count().call();
}

如果函数是只读的,您可以使用 get 方法在链上检索数据而不消耗 gas。

如果函数不是只读的,您将不得不使用 call 方法在链上提交交易,这会产生 gas 费用。