首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >与python中的ganache-cli同步

与python中的ganache-cli同步
EN

Stack Overflow用户
提问于 2019-01-25 18:08:48
回答 1查看 1.7K关注 0票数 1

我想测试一个简单的Ethereum智能合同,ganache在小写中打印帐户,web3给了我一个错误:

web3.exceptions.InvalidAddress:('Web3.py只接受校验和地址。给您这个非校验和地址的软件应该被认为是不安全的,请将它作为bug提交到他们的平台上。尝试使用ENS名称。或者,如果您必须接受较低的安全性,请使用Web3.toChecksumAddress(Lower_case_address)。‘0xfcad0b19bb29d4674531d6f523e16afce377c’)

然后使用以下方法将地址转换为混合地址:

代码语言:javascript
复制
Web3.toChecksumAddress(the_lower_case_ganache_address)

这就产生了一个错误:

文件"/usr/local/lib/python3.7/site-packages/web3/contract.py",第1385行,在call_contract_function raise (Msg)中:无法处理/调用合同功能,合同是否正确部署,链是否同步? 127.0.0.1 - 25/Jan/2019 21:35:21“后/区块链/用户HTTP/1.1”500 -

这是我的python代码:

代码语言:javascript
复制
def check_gender(data):
    valid_list = ["male", "female"]
    if data not in valid_list:
        raise ValidationError(
            'Invalid gender. Valid choices are'+ valid_list
        )

class UserSchema(Schema):
    name = fields.String(required=True)
    gender = fields.String(required=True, validate=check_gender)


app = Flask(__name__)


# api to set new user every api call
@app.route("/blockchain/user", methods=['POST'])
def transaction():

    w3.eth.defaultAccount = w3.eth.accounts[0]
    with open("data.json", 'r') as f:
        datastore = json.load(f)
    abi = datastore["abi"]
    contract_address = datastore["contract_address"]

    # Create the contract instance with the newly-deployed address
    user = w3.eth.contract(
        address=contract_address, abi=abi,
    )
    body = request.get_json()
    result, error = UserSchema().load(body)
    if error:        
        return jsonify(error), 422
    tx_hash = user.functions.setUser(
        result['name'], result['gender']
    )
    tx_hash = tx_hash.transact()
    # Wait for transaction to be mined...
    w3.eth.waitForTransactionReceipt(tx_hash)
    user_data = user.functions.getUser().call()
    return jsonify({"data": user_data}), 200



if __name__ == '__main__':
    app.run()

`而json文件:

代码语言:javascript
复制
{
    "abi": [
        {
            "constant": false,
            "inputs": [
                {
                    "name": "name",
                    "type": "string"
                },
                {
                    "name": "gender",
                    "type": "string"
                }
            ],
            "name": "setUser",
            "outputs": [],
            "payable": false,
            "stateMutability": "nonpayable",
            "type": "function"
        },
        {
            "constant": false,
            "inputs": [],
            "name": "getUser",
            "outputs": [
                {
                    "name": "",
                    "type": "string"
                },
                {
                    "name": "",
                    "type": "string"
                }
            ],
            "payable": false,
            "stateMutability": "nonpayable",
            "type": "function"
        }
    ],
    "contract_address": "0xFCAd0B19bB29D4674531d6f115237E16AfCE377c"
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-25 18:19:24

错误是指出Ganache无法找到要与其交互的已部署的契约。

您的代码似乎有效,但此错误可能发生在以下一行:

代码语言:javascript
复制
tx_hash = user.functions.setUser(
    result['name'], result['gender']
)

代码试图设置用户,但找不到要与之交互的契约(即使ABI和contract实例是有效的)。

如果您使用的是Ganache,则很可能每次运行代码时都会重新部署契约,因此,如果您从静态文件中提取,下面的行可能无法工作:

代码语言:javascript
复制
contract_address = datastore["contract_address"]

如果每次部署,则需要从Ganache动态获取契约地址。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54370707

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档