solidity - ERC20代币中的msg.sender、from和sender有什么区别?
问题描述
我的合同
contract Token{
string public name = "Dhruv";
string public symbol = "DhruvToken";
uint256 public decimals = 18;
uint256 public totalSupply;
mapping(address => uint) public balanceOf;
mapping(address => mapping(address => uint256)) public allowance;
constructor() public{
totalSupply = 1000000 * (10 ** decimals);
balanceOf[msg.sender] = totalSupply;
}
//events
event Transfer(address from, address to, uint256 value);
event Approve(address indexed from, address indexed to, uint256 indexed value);
function transfer(address _to, uint256 _value) public returns (bool success){
require(balanceOf[msg.sender] >= _value);
_transfer(msg.sender, _to, _value);
return true;
}
//internal function can be accessed only within the smart contract
function _transfer(address _from, address _to, uint256 _value) internal{
require(_to != address(0));
balanceOf[_from] = balanceOf[_from] - _value;
balanceOf[_to] = balanceOf[_to] + _value;
emit Transfer(_from, _to, _value);
}
// approve the tokens
function approve(address _spender, uint256 _value) public returns (bool success){
require(_spender != address(0));
allowance[msg.sender][_spender] = _value;
emit Approve(msg.sender, _spender, _value);
return true;
}
function transferFrom(address _from, address _to, uint256 _value) public returns (bool success){
// require(balanceOf[_from] >= _value);
allowance[_from][msg.sender] = allowance[_from][msg.sender] - _value;
_transfer(_from, _to, _value);
return true;
}
}
调用的函数
token.transferFrom(deployer, receiver, amount, { from: exchange })
token.approve(exchange, amount, { from: deployer });
token.allowance(deployer, exchange);
我的疑惑
token.allowance 允许交换,即花费者花费特定数量的代币,但在 transferFrom 中,我们正在重置花费者对 msg.sender 的允许以花费特定数量的代币,这会造成混淆,为什么会有角色切换
为什么我们使用花括号调用函数以及为什么我们不直接传递函数中的值
请说明msg.sender在交易中的作用为什么exchange不直接调用交易以及为什么需要中介
请回答我的疑问,我已经研究了很多,但这个疑问还没有消除
解决方案
抱歉,我想我无法回答你所有的问题。在没有更多上下文的情况下,据我了解,该合约的主要目的是让某人允许另一个人代表他将代币发送给潜在的第三方。
对我来说一个有效的场景是:
-“A”部署合约。
-“B”调用 token.approve 函数(所以 B 是这里的 msg.sender)以允许 C 代表它花费一个值。(假设这个例子:10)
allowance[B][C] = 10;
-“C”调用 token.transferFrom 函数将一些 B 的令牌发送给 D。(假设是 6。注意现在 C 是 msg.sender)
allowance[B][C] = allowance[B][C] - 6; (10-6 --> C still can send 4 tokens from now on)
现在有了这三个函数调用:
token.transferFrom(部署者,接收者,金额,{来自:交换})
allowance[deployer][exchange] = allowance[deployer][exchange] - _value;
token.approve(exchange, amount, { from: deployer });
allowance[deployer][exhange] = _value;
token.allowance(部署者,交易所);
您只需检索可以发送的更新后的令牌数量。这些函数调用的顺序对我来说不太有意义,因为我希望首先调用approve 函数。
关于花括号,我不熟悉这种语法。我更习惯于类似的东西
token.transferFrom(deployer, receiver, amount).send( { from: exchange } )
在 JavaScript 中。无论如何,这只是一种使用键值对作为函数参数的方法。可能第一个参数(在花括号中)用于 Token 成员函数,而在花括号之间的参数,则与我在上面作为示例给出的 send 函数等效。
希望这会对您有所帮助。
推荐阅读
- typescript - 严格路径符号数组类型的映射
- apache-spark - PySpark:org.apache.spark.sql.AnalysisException:找不到表或视图
- python - 在 csv 文件中加载带有标签的图像或使用它们的文件名
- mysql - where 子句获取匹配最多 2 个小数的记录
- azure-devops - KQL 中的字符串操作
- javascript - Google Apps 脚本 - 更新时将时间戳添加到多个单元格
- forms - 如何将 Mailerlite(或其他邮件服务)连接到 Google AMP 表单?
- java - 查找构成此字符串的代码的最小组合
- react-google-charts - 如何控制谷歌图表图例的字体系列、字体大小和颜色?
- javascript - 如何在VScode中调试Webdriverio黄瓜框架