繁体   English   中英

Eth,如何从智能合约中调用存款 function

[英]Eth, how to call a deposit function from a smart contract

我正在做一个项目,我需要将以太币从用户发送到智能合约,再从智能合约发送到用户。 智能合约是 Solidity 中的代码,我使用 python 和 web3.py 与其通信。

我设法这样做:从用户到我的 python 脚本中的智能合约:

#send transaction to the smart contract
web3.eth.sendTransaction({
    'to': address,
    'from': web3.eth.defaultAccount,
    'value': 10000000000000000000
})

从智能合约到使用这个 function 的用户:

function sendEther(address payable recipient, int _amount) public payable {
        recipient.transfer(_amout ether);
    }

请注意,这个 function 可以在智能合约中调用。

但后来我想在我的智能合约中创建一个 function 存款(从用户到智能合约):

function deposit(uint256 amount) payable public {
        require(msg.value == amount);
        // nothing else to do!
    }

所以基本上,如果我需要用我的 python 脚本调用这个 function,我需要这样进行:

contract.functions.deposit(10).transac({
        'to': address,
        'from': web3.eth.defaultAccount,
        'value': 10
    })

通过检查智能合约的余额,它可以正常工作。

但是,如果我想在我的智能合约中调用存款 function 并进行从用户到智能合约的交易,我需要如何进行? 当我在里面调用 function 时,如何解析智能合约中的'msg.value'? 这可能吗?

非常感谢,阿尔班

您需要从 Solidity 编译器创建的 ABI 文件中构造一个Contract object。

以下是如何调用合约 function 的示例:

>>> tx_hash = greeter.functions.setGreeting('Nihao').transact()

https://web3py.readthedocs.io/en/stable/contracts.html#contract-deployment-example

根据您的应用程序,通常用户通过他们的 web 浏览器调用合约,他们有一个使用 web3.js 连接的钱包。

这是一个很好的库,如何将您的 dApp 与您的用户钱包连接起来:

github.com/web3modal/web3modal

我认为问题出在您的代码上

function deposit(uint256 amount) payable public {
    require(msg.value == amount);
    // nothing else to do!
}

尝试改用这个:

function deposit(uint256 amount) payable public {
    require(msg.value != 0);
    // nothing else to do!
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM