调用应付功能后,交易中可以看到哪些信息?

What information are visible in transaction after a call to a payable function?

我想知道当 EOA(外部拥有地址)调用智能合约上的支付功能时,哪些信息是公开可见和可理解的,带有一些参数和 return 值。

假设我有下面的智能合约功能,问题是:'is the return value visible somewhere on the blockchain?'。我正在使用 Solidity 0.8.12.

function askForSecretCode(uint time) external payable returns (bytes32) {
    require(msg.value == 42, 'Need to pay 42 wei.');
    secretCodes[secretCodesNum] = keccak256(abi.encodePacked(msg.sender, time);
    return keccak256(abi.encodePacked(msg.sender, time);
}

任何人都可以看到输入 time 参数值作为调用 askForSecretCode 函数的交易的一部分。

即使您不发布合约源代码,字节码也是 public,并且有反编译器可以(有一定的错误率)帮助从字节码生成源代码。所以我们假设源代码也可用。

从源代码(或者通常甚至是反编译器生成的伪代码),任何人都可以确定 secretCodesNum 的存储槽(从上下文来看似乎是 属性合同)并使用 eth_getStorageAt RPC 方法检索其值,包括历史值。

使用这些 secretCodesNum 值,他们可以使用相同的方法来确定任何 secretCodes[secretCodesNum] 的存储槽及其值。

TLDR:永远不要在区块链上存储私人数据。