Ethereum 如何使用另一个智能合约与部署的ERC20令牌交互?

Ethereum 如何使用另一个智能合约与部署的ERC20令牌交互?,ethereum,solidity,erc20,Ethereum,Solidity,Erc20,我通过在ERC20.sol文件中实现OpenZeppelin创建了一个基本的ERC20令牌: pragma-solidity^0.6.4; 进口”https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v3.4.0/contracts/token/ERC20/ERC20.sol"; 合同令牌是ERC20{ 构造函数(字符串内存\u名称,字符串内存\u符号) 公众的 ERC20(_名称,_符号) { _造币厂(msg.sender,1

我通过在ERC20.sol文件中实现OpenZeppelin创建了一个基本的ERC20令牌:

pragma-solidity^0.6.4;
进口”https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v3.4.0/contracts/token/ERC20/ERC20.sol";
合同令牌是ERC20{
构造函数(字符串内存\u名称,字符串内存\u符号)
公众的
ERC20(_名称,_符号)
{
_造币厂(msg.sender,100000000000000000000);
}
}
然后执行另一个contract.sol,如下所示:

导入“/ERC20.sol”; pragma-solidity^0.6.4; 合同银行{ 代币合同; 构造函数(令牌_令牌合同)公共{ tokenContract=_tokenContract; } 功能存款(uint amt)公共收益(bool){ 要求(金额!=0,“存款金额不能为零”); 代币合同转让(地址(本),金额); 返回true; } } 由于,我已经从地址0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2部署了这两个合约,所以它持有100000000000000000000个令牌。

但当我从同一地址调用
deposit
函数时,我得到了以下错误:

交易到SimpleBank.deposit错误:VM错误:还原。还原 事务已恢复到初始状态。提供的理由 合同:“ERC20:转让金额超过余额”。调试 事务以获取更多信息



那么,与部署的ERC20令牌交互的正确方式是什么,以便
deploy
功能工作

  • 用户地址
    0xAb8483…
    发送一个事务,执行
    SimpleBank
    的函数
    deposit()
    ,使
    0xAb8483…
    成为
    SimpleBank
    msg.sender
    的值

  • 但是,
    SimpleBank
    发送一个内部事务,执行
    Token
    的函数
    transfer()
    。这使得
    SimpleBank
    地址(不是
    0xAb8483…
    成为
    令牌中
    msg.sender
    的值

    因此代码片段
    tokenContract.transfer(地址(this),amt)正在尝试发送
    SimpleBank的令牌。不是用户的(
    0xAb8483…
    )令牌

  • 由于SimpleBank不拥有任何令牌,因此令牌的传输(从第2点)会恢复。这使得顶级事务(从第1点开始)也会恢复


    如果希望
    SimpleBank
    能够传输
    0xAb8483…
    的令牌,
    0xAb8483…
    需要
    approve()
    首先由
    SimpleBank
    使用的令牌。直接从他们的地址发送,以便他们是
    代币
    合同中的
    msg.sender

    只有
    SimpleBank
    才能执行
    transferFrom(0xAb8483…,地址(this),金额)
    (from,to,金额)


    TLDR:您的合同不能使用它不拥有的代币,除非所有者手动批准您的合同使用代币


    如果它可以在未经批准的情况下使用他人的代币,那么很容易从无法/不验证您的源代码的人那里窃取(通过使用他们的USDT、WETH和其他广泛使用的代币)。

    这是否回答了您的问题?我不清楚提供的链接中的答案。这是否意味着出于安全原因,其他帐户无法与ERC20.sol交互?你能帮我解决这个问题吗@PetrHejda?