blockchain - Msg.sender 在“视图”函数中不起作用,为什么?有解决方法吗?
问题描述
我想创建一个可查看的函数(需要向用户返回一个字符串)来搜索 msg.sender 的映射,如果 senders 值为 x,我希望合同相应地进行。这一切都在混音中有效,但如果我将它上传到 ropsten,它就不再适用了。这是一个已知的问题?我也尝试过 tx.origin ,结果相同。那是我尝试过的有问题的代码:
function getLink() public view returns(string){
if(tokenBalances[msg.sender]>0){
return link;
}else{
return "You need to purchase a token at first...";
}
}
编辑:我认为问题是,当使用可查看功能时,没有 msg.sender 因为没有实际交易?有没有办法在不使用“视图”功能的情况下向用户返回值?
解决方案
简短的回答
msg.sender
确实在功能中view
起作用,尽管它作为授权方案没有用。您使用的查找工具应该具有设置发件人的机制。
通话与交易
首先,了解call 和 transaction 之间的区别很重要。
看来您正在运行一个call
,它运行得很快并且不会改变区块链的状态。msg.sender
在事务和调用中都设置。在交易中,它不能被伪造:您必须拥有与给定帐户关联的私钥。但是在 a 中call
,您可以自由地将发件人设置为您喜欢的任何值。
设置发件人
如何设置发件人取决于您使用什么工具来调用。该工具可能是 web3.js、web3.py、Mist、MyEtherWallet、MyCrypto 等。它们都有(或可能没有!)在调用中设置发送者的机制。
我的以太钱包
在评论中,您特别提到了 MyEtherWallet。在快速搜索中,我没有找到有关如何设置发件人的任何信息。ethereum.stackexchange 上有一个未回答的问题,似乎值得关注,因为它问的问题大致相同:How to check msg.sender balance with MyEtherWallet contract
合同变通办法
是否可以为合同指定此类设置?
没有办法帮助某人从合约内部设置发件人。但是您可以提供一种不同的方法,将地址作为参数。然后像 MyEtherWallet 这样的工具将允许您设置感兴趣的地址。例如:
function getLink(address account) public view returns(string){
if(tokenBalances[account] > 0){
return link;
}else{
return "You need to purchase a token at first...";
}
}
隐藏数据
值得注意的是,通过检查隐藏数据msg.sender
是没有用的。任何人都可以在通话中设置假发件人(或直接检查区块链状态)。因此,绕过这种“保护”是微不足道的。
推荐阅读
- algorithm - 红黑树 - 按排序顺序返回所有大于 X 的值
- c - xv6中strcat之后的错误输出
- javascript - WooCommerce:根据所选的运输方式隐藏运输计算器
- php - 远程调用 PHP 脚本时未收到 POST 数据
- typescript - 如何使用 vue 3.0 + typescript 启用 IntelliSense
- spring-boot - 无法在 Vaadin 上使用春季会议
- javascript - 如何使用 JS 访问 chrome 控制台中显示的所有数据“浏览器本身触发的数据”
- typescript - 通过导入加载图像大小时,此表达式不是可调用错误
- excel - 排序日期并显示最近的 VBA
- node.js - 在多个项目之间共享和管理 rc 文件(或配置文件)