MultiversXPythonSDK智能合约操作Skill mvx_sdk_py_contracts

该技能提供了使用 MultiversX Python SDK 进行智能合约开发的完整指南,包括 ABI 加载、合约部署、函数调用和状态查询等操作。适用于区块链开发者,关键词:智能合约、ABI、部署、调用、查询、MultiversX、Python SDK、区块链开发、智能合约编程。

智能合约 0 次安装 0 次浏览 更新于 3/21/2026

名称: mvx_sdk_py_contracts 描述: MultiversX Python SDK 的智能合约操作。

MultiversX SDK-Py 智能合约

此技能涵盖 ABI 加载、部署、调用和查询。

ABI 加载

from multiversx_sdk import Abi
from pathlib import Path

# 从文件加载
abi = Abi.load("contract.abi.json")

智能合约控制器

# 使用加载的 ABI 创建控制器
controller = entrypoint.create_smart_contract_controller(abi=abi)

部署

bytecode = Path("contract.wasm").read_bytes()

tx = controller.create_transaction_for_deploy(
    sender=account,
    nonce=account.get_nonce_then_increment(),
    bytecode=bytecode,
    gas_limit=60000000,
    arguments=[42]  # 通过 ABI 自动类型化
)

tx_hash = entrypoint.send_transaction(tx)
parsed_outcome = controller.await_completed_deploy(tx_hash)
contract_address = parsed_outcome[0].contract_address

合约调用

# 调用端点
tx = controller.create_transaction_for_execute(
    sender=account,
    nonce=account.get_nonce_then_increment(),
    contract=contract_address,
    function="add",
    arguments=[10],
    gas_limit=5000000
)

# 带代币转账的调用(转账与执行)
tx = controller.create_transaction_for_execute(
    sender=account,
    nonce=account.get_nonce_then_increment(),
    contract=contract_address,
    function="deposit",
    gas_limit=10000000,
    native_amount=1000000000000000000
)

VM 查询

对合约状态的只读调用。

# 使用控制器(解析输出)
result = controller.query_contract(
    contract=contract_address,
    function="getSum",
    arguments=[]
)
print(result[0])  # 类型化输出

无 ABI(手动类型化)

如果 ABI 不可用,使用手动类型提示(不推荐)。

from multiversx_sdk import SmartContractTransactionsFactory

factory = entrypoint.create_smart_contract_transactions_factory()

tx = factory.create_transaction_for_execute(
    sender=account.address,
    contract=contract_address,
    function="add",
    gas_limit=5000000,
    arguments=[42]  # 基础类型推断
)

升级

new_bytecode = Path("contract_v2.wasm").read_bytes()

tx = controller.create_transaction_for_upgrade(
    sender=account,
    nonce=account.get_nonce_then_increment(),
    contract=contract_address,
    bytecode=new_bytecode,
    gas_limit=60000000,
    arguments=[]
)

最佳实践

  1. 始终使用 ABI:确保正确的参数编码/解码
  2. 查询用于读取:免费(无 gas),即时响应
  3. 等待完成:使用控制器方法获取解析结果
  4. Gas 限制:确保足够的 gas 用于计算和存储