名称: 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=[]
)
最佳实践
- 始终使用 ABI:确保正确的参数编码/解码
- 查询用于读取:免费(无 gas),即时响应
- 等待完成:使用控制器方法获取解析结果
- Gas 限制:确保足够的 gas 用于计算和存储