我经常听到以下的说法:
Contract Accounts cannot send Messages to EOAs. They can only:
1. send Messages to other Contract Accounts
2. send Ether to EOAs..。参见,例如,这里:合同能够向EOA发送信息吗?
这句话对我来说没什么意义。根据Ethereum (见http://www.ethdocs.org/en/latest/contracts-and-transactions/account-types-gas-and-transactions.html#what-is-a-message),一条消息包含: 1.消息的发送方(隐式) 2.消息的接收方3. VALUE字段--用于传输4.可选数据字段5. STARTGAS值的数量
因此,当合同帐户将以太发送到EOA时,它会发送一条带有空数据字段的消息,并包含要在VALUE字段中传输的以太/魏的数量,对吗?
也就是说,契约帐户确实向EOAs发送消息,但是这些消息的数据字段是空的,对吗?
发布于 2018-04-14 03:34:37
事实是这两种说法在某种程度上都是正确的。
合同在转帐到外部拥有的帐户时可以附加一条消息。但是,对于外部帐户来说,要读取该消息并不容易。
pragma solidity ^0.4.19;
contract A {
// Make a transfer to who and attach message m
function bar(address who, bytes m) public payable returns (bytes32) {
address a = who;
uint l = m.length;
uint v = msg.value;
assembly {
if iszero(call(gas, a, v, add(m, 0x20), l, 0, 0)) {
revert(0, 0)
}
}
return 0;
}
}外部帐户可以检测其余额是否发生了变化,以及从什么事务中进行了更改。但是要读取消息,它必须执行事务。
https://ethereum.stackexchange.com/questions/45625
复制相似问题