Ethereum 如何使用另一个智能合约与部署的ERC20令牌交互?
我通过在ERC20.sol文件中实现OpenZeppelin创建了一个基本的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
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
能够传输0xAb8483…
的令牌,0xAb8483…
需要approve()
首先由SimpleBank
使用的令牌。直接从他们的地址发送,以便他们是代币
合同中的msg.sender
只有SimpleBank
才能执行transferFrom(0xAb8483…,地址(this),金额)
(from,to,金额)
TLDR:您的合同不能使用它不拥有的代币,除非所有者手动批准您的合同使用代币
如果它可以在未经批准的情况下使用他人的代币,那么很容易从无法/不验证您的源代码的人那里窃取(通过使用他们的USDT、WETH和其他广泛使用的代币)。这是否回答了您的问题?我不清楚提供的链接中的答案。这是否意味着出于安全原因,其他帐户无法与ERC20.sol交互?你能帮我解决这个问题吗@PetrHejda?