Solidity基础知识:什么是“msg.sender”

28

我刚开始学习Solidity,这是我个人的挑战。我不是一名开发者,所以我还有很长的路要走。

我正在按照Ethereum.org的教程进行学习,以下是我对其中的一点有疑问:什么是[msg.sender]?我猜它是触发合约的钱包地址,但我不确定。


RTFM"msg.sender (地址): 消息发送者(当前调用)" - Sumak
3个回答

41

我自己也是一个初学者,所以为了明确起见:在合约中,msg.sender通常可以描述为当前与该合约交互的“实体”的地址吗? - c0mr4t

4

让我们简单明了地说。

There are two types of accounts in the Ethereum Chain
1). Externally Owned Accounts(EOA) [Person]
2). Contracts Accounts [Contracts on Chain]

两个账户都有它们自己的地址。

  • 现在,看一个例子。

personA 的钱包地址是 (EOA) 0x0cE446987406E92DF41614C46F1d6df9Cc925847

Math.sol 的合约地址是 0x0cE446987406E92DF41614C46F1d6df9Cc753869, 并且 Math.sol 包含 ContractA

Addition.sol 的合约地址是 0x0cE446987406E92DF41614C46F1d6df9Cc357241, 并且 Addition.sol 包含 ContractB

这里,ContractA 中的一个函数从 ContractB 中调用。

所以,当 personA 调用 ContractA 的任何函数时。

In this scenario, if you print or get `msg.sender` and `tx.origin` inside function of `ContractB` then the result would be like this

msg.sender = `0x0cE446987406E92DF41614C46F1d6df9Cc753869` // You will get address of `ContractA`
tx.origin  = `0x0cE446987406E92DF41614C46F1d6df9Cc925847` // personA's (EOA) Wallet Address

1
functionC()在哪里?Math.sol在哪里?请提供更多关于这个解决方案的背景。这可能会澄清msg.sender和txt.origin,这对初学者来说是一个重要的概念。 - Sam Tseng
答案已被编辑。 - Prince Dholakiya

0

在这里,

msg.sender (address):表示消息的发送者(当前调用)

另一方面

address owner = msg.sender;

msg.sender 是调用或启动函数或创建交易的地址。现在,这个地址可以是合同的地址,也可以是像你和我这样的人。

这就是为什么您可以使用 msg.sender 而不是 msg.sender() 的原因。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接