⌘K

Deploying

Icon Link部署合约

在 SDK 中,有两种主要的方法来处理合约:使用 SDK 部署合约或使用 SDK 与现有合约进行交互。

Icon Link部署合约二进制文件

一旦您用 Sway 编写了一个合约,并使用 forc build 编译了它,您将手头拥有两个重要的构件:编译后的二进制文件和 JSON ABI 文件。

Icon InfoCircle

注意:阅读这里 Icon Link了解有关如何使用 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
  • 更改合约的存储槽
  • 更新合约的配置参数
Icon InfoCircle

注意:下一节将提供有关如何使用 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);
Icon InfoCircle

注意:重新部署现有的 Contract 时,请确保使用唯一的 salt 对其进行初始化,以防止由于合约 ID 冲突而导致的部署失败。为此,利用 with_salt 方法使用新的 salt 克隆现有的 Contract