调用应付功能后,交易中可以看到哪些信息?
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:永远不要在区块链上存储私人数据。
我想知道当 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:永远不要在区块链上存储私人数据。