Configurable Constants

Icon Link具有可配置常量的断言

合约 脚本 类似,断言也支持可配置常量。这使得断言能够适应特定的用例并增强其功能性。

Icon Link示例:资产转移验证

让我们考虑一个断言用于验证资产转移的示例。在这种情况下,转移只有在接收方地址位于预先批准的白名单上时才会执行。

以下代码片段演示了如何实现这一点:

predicate;
 
configurable {
    WHITELISTED: b256 = 0xa703b26833939dabc41d3fcaefa00e62cee8e1ac46db37e0fa5d4c9fe30b4132,
}
 
fn main(address: b256) -> bool {
    WHITELISTED == address
}

在这个示例中,您会注意到使用了一个名为 WHITELISTED 的可配置常量。该常量具有一个默认值,表示默认批准的地址。

Icon Link修改白名单

如果需要将另一个地址加入白名单,可以轻松更新 WHITELISTED 常量。以下代码片段演示了如何为 WHITELISTED 常量设置一个新值,并使断言执行转移:

const newWhitelistedAddress = getRandomB256();
 
const configurable = { WHITELISTED: newWhitelistedAddress };
// instantiate predicate with configurable constants
const predicate = new Predicate<[string]>({
  bytecode: bin,
  provider: wallet.provider,
  abi,
  inputData: [configurable.WHITELISTED],
  configurableConstants: configurable,
});
 
// transferring funds to the predicate
const tx1 = await wallet.transfer(predicate.address, 200_000, baseAssetId, {
  gasLimit: 1000,
});
 
await tx1.waitForResult();
 
const destinationWallet = WalletUnlocked.generate({
  provider: wallet.provider,
});
 
const amountToTransfer = 100;
 
// transferring funds from the predicate to destination if predicate returns true
const tx2 = await predicate.transfer(destinationWallet.address, amountToTransfer, baseAssetId, {
  gasLimit: 1000,
});
 
await tx2.waitForResult();

通过确保更新后的 WHITELISTED 地址与预期的接收方地址匹配,断言将成功验证转移。

Icon Link默认白名单地址

在默认白名单地址已经是预期的接收方的情况下,无需更新 WHITELISTED 常量。断言将基于默认值验证转移。以下是此场景的示例:

const predicate = new Predicate({
  bytecode: bin,
  provider: wallet.provider,
  abi,
  inputData: ['0xa703b26833939dabc41d3fcaefa00e62cee8e1ac46db37e0fa5d4c9fe30b4132'],
});
 
// transferring funds to the predicate
const tx1 = await wallet.transfer(predicate.address, 200_000, baseAssetId, {
  gasLimit: 1000,
});
 
await tx1.waitForResult();
 
const destinationWallet = WalletUnlocked.generate({
  provider: wallet.provider,
});
 
const amountToTransfer = 100;
 
// transferring funds from the predicate to destination if predicate returns true
const tx2 = await predicate.transfer(destinationWallet.address, amountToTransfer, baseAssetId, {
  gasLimit: 1000,
});
 
await tx2.waitForResult();

在断言内部配置常量的能力提供了一种灵活的机制,用于定制其行为,从而增强了我们的资产转移流程的健壮性和多功能性。

需要注意的是,这些自定义不会直接修改原始断言。断言的地址是其字节码的哈希值。对字节码的任何更改,包括更改常量值,都会生成不同的字节码,从而生成不同的哈希值。这将导致创建一个具有新地址的新断言。

这并不意味着我们正在更改原始断言的行为。相反,我们正在创建一个具有不同配置的新断言。

因此,虽然可配置常量确实增强了断言的灵活性和健壮性,但是它是通过创建具有不同配置的新断言来实现的,而不是通过更改现有断言的行为。