要使用 SDK 与已部署的合约进行交互,而不需要重新部署它,你只需要合约 ID 和它的 JSON ABI。这使你可以绕过部署设置。
Contract
类的 contractId
属性是 AbstractAddress
类型,这是一个抽象类,专门由 Address
类扩展。
Address
类包装了 AbstractAddress
类的所有方法,并添加了一个属性:bech32Address
。该属性是一个以 Bech32
格式编码的字符串,可通过人类可读的前缀 fuel
,后跟分隔符 1
进行识别。
当你使用 console.log
记录一个已实例化合约的 contractId
属性时,输出如下:
Address {
bech32Address: 'fuel1e5tdjlzufcvwut5dvs5yglweepmrevpnvuvt2djj6pyl3mygkwaq8m7f20'
}
如果你已经有了一个实例化和部署的合约,你可以简单地使用 contractId
属性和合约的 JSON ABI 来创建另一个合约实例:
const deployedContract = new Contract(contractId, abi, wallet);
const { value } = await deployedContract.functions.echo_u8(10).simulate();
expect(value).toEqual(10);
前面的示例假设你手头有一个 Contract
实例。然而,一些 Fuel 工具和 Sway 使用了 b256
类型格式,即十六进制编码的类似字符串的类型,用于合约 ID。
例如,如果你使用 forc deploy
部署了你的合约,则可能会有这种格式。
当使用 b256
类型的合约 ID 时,实例化一个 Contract
的过程保持不变:
const b256 = '0x50007a55ccc29075bc0e9c0ea0524add4a7ed4f91afbe1fdcc661caabfe4a82f';
const deployedContract = new Contract(b256, abi, wallet);
const { value } = await deployedContract.functions.echo_u8(50).simulate();
expect(value).toEqual(50);