在 SDK 中,有两种主要的方法来处理合约:使用 SDK 部署合约或使用 SDK 与现有合约进行交互。
一旦您用 Sway 编写了一个合约,并使用 forc build
编译了它,您将手头拥有两个重要的构件:编译后的二进制文件和 JSON ABI 文件。
注意:阅读这里 了解有关如何使用 Sway 的更多信息。
以下是使用 SDK 部署合约的方法。有关此过程中每个组件的更多详细信息,请阅读abigen 宏 、FuelVM 二进制文件 和JSON ABI 文件 。
首先,使用 Contract::load_from
函数加载一个带有 LoadConfiguration
的合约二进制文件。如果您只对合约的单个实例感兴趣,请使用默认配置:LoadConfiguration::default()
。加载合约二进制文件后,您可以使用 deploy()
方法将合约部署到区块链上。
// This helper will launch a local node and provide a test wallet linked to it
let wallet = launch_provider_and_get_wallet().await?;
// This will load and deploy your contract binary to the chain so that its ID can
// be used to initialize the instance
let contract_id = Contract::load_from(
"../../e2e/sway/contracts/contract_test/out/release/contract_test.bin",
LoadConfiguration::default(),
)?
.deploy(&wallet, TxPolicies::default())
.await?;
println!("Contract deployed @ {contract_id}");
或者,您可以使用 LoadConfiguration
配置合约的加载方式。LoadConfiguration
允许您:
Salt
加载相同的合约二进制文件以获取一个新的 contract_id
注意:下一节将提供有关如何使用
configurables
的更多信息。
此外,您还可以在部署加载的合约时设置自定义的 TxParameters
。
// Optional: Add `Salt`
let rng = &mut StdRng::seed_from_u64(2322u64);
let salt: [u8; 32] = rng.gen();
// Optional: Configure storage
let key = Bytes32::from([1u8; 32]);
let value = Bytes32::from([2u8; 32]);
let storage_slot = StorageSlot::new(key, value);
let storage_configuration =
StorageConfiguration::default().add_slot_overrides([storage_slot]);
let configuration = LoadConfiguration::default()
.with_storage_configuration(storage_configuration)
.with_salt(salt);
// Optional: Configure deployment parameters
let tx_policies = TxPolicies::default()
.with_tip(1)
.with_script_gas_limit(1_000_000)
.with_maturity(0);
let contract_id_2 = Contract::load_from(
"../../e2e/sway/contracts/contract_test/out/release/contract_test.bin",
configuration,
)?
.deploy(&wallet, tx_policies)
.await?;
println!("Contract deployed @ {contract_id_2}");
合约部署后,您可以像这样使用合约的方法:
// This will generate your contract's methods onto `MyContract`.
// This means an instance of `MyContract` will have access to all
// your contract's methods that are running on-chain!
abigen!(Contract(
name = "MyContract",
abi = "e2e/sway/contracts/contract_test/out/release/contract_test-abi.json"
));
// This is an instance of your contract which you can use to make calls to your functions
let contract_instance = MyContract::new(contract_id_2, wallet);
let response = contract_instance
.methods()
.initialize_counter(42) // Build the ABI call
.call() // Perform the network call
.await?;
assert_eq!(42, response.value);
let response = contract_instance
.methods()
.increment_counter(10)
.call()
.await?;
assert_eq!(52, response.value);
注意:重新部署现有的
Contract
时,请确保使用唯一的 salt 对其进行初始化,以防止由于合约 ID 冲突而导致的部署失败。为此,利用with_salt
方法使用新的 salt 克隆现有的Contract
。