使用 Python Web3.py 调用 Solidity 函数

Posted

技术标签:

【中文标题】使用 Python Web3.py 调用 Solidity 函数【英文标题】:Calling Solidity Function using Python Web3.py 【发布时间】:2020-03-23 16:26:53 【问题描述】:

我已经使用solidity 编写了一个智能合约函数,该函数由下面给出的不同参数组成

function addDevice(address _address, string _deviceType, string _deviceName, string _minerID, string _deviceID) public

    DeviceData storage device = devices[_address];

    device.deviceType = _deviceType;
    device.deviceName = _deviceName;
    device.minerID = _minerID;
    device.deviceID = _deviceID;

    devicesAddresses.push(_address) -1;

我正在使用 web3.py 使用给定的命令调用此函数

D_Address = input("Device Address ").encode()
D_Type = input("Device Type ")
D_Name = input("Device Name ")
M_ID = input("Miner ID ")
D_ID = input("Device ID ")


tx_hash = contract_instance.functions.addDevice(D_Address,D_Type,D_Name,M_ID,D_ID).transact()
tx_receipt = web3.eth.waitForTransactionReceipt(tx_hash)

在 REMIX 中,这个智能合约工作正常,但是当我运行文件时,它显示以下错误

找到 1 个名称为 addDevice 的函数:['addDevice(address,string,string,string,string)'] 由于没有匹配的参数类型,函数调用失败。

【问题讨论】:

【参考方案1】:

删除.encode(),因为您应该为地址字段传入一个字符串。

如果它仍然不起作用,请告诉我!

【讨论】:

删除.encode后显示如下错误'''web3.exceptions.InvalidAddress:('Web3.py只接受校验和地址。给你这个非校验和地址的软件应该是认为不安全,请将其作为错误提交到他们的平台上。尝试使用 ENS 名称。或者,如果您必须接受较低的安全性,请使用 Web3.toChecksumAddress(lower_case_address).', '0x5fa806f48a26b45904b77b2f5382ef7a1e834699')''' 是的,只要把它转换成校验和地址,然后,我认为它应该可以工作! @KhizarHameed

以上是关于使用 Python Web3.py 调用 Solidity 函数的主要内容,如果未能解决你的问题,请参考以下文章

使用 web3.py 解码智能合约的返回值?

在 ganache 上调用函数时出现 Web3.py abi keyerror

使用 web3.py 时出现 ContractLogicError

使用 web3.py 查询远程以太坊节点时出现间歇性“读取超时”错误

用 Python 中的 web3.py 库开发 Dapp

Python3 使用Web3.py查询以太坊账户余额