保护敏感信息的最佳实践?

Best practice for protecting sensitive information on solidity?

我的合同中有一个字段。是这样的:

contract MyContract {
    string private secretField
}

function getSecretField() public view returns {
  ... some controls here...
  return secretField;

}

我想从我的后端服务器访问那个 secretField 并保护它不受任何其他请求者的影响。这方面的最佳做法是什么?

如果它在 public 区块链(主网、ropsten 测试网等)上,它总是可以通过查询包含 secretField 值的 storage slot 来访问链下 应用程序。与Solidity无关private可见性修饰符,因为存储查询是在较低层执行的。

示例:如果secretField是第一个定义的合约(在这个地址上)的第一个属性,它的值存储在存储槽0中。


但是如果你只想对 链上 请求者隐藏它,你可以保留 属性 private 并要求 getter 只能从特定地址访问。

// removed `view` because it's going to interact with the transaction data
function getSecretField() public returns {
    // reverts if the sender address is not 0x123
    require(msg.sender == address(0x123);

    return secretField;
}

请注意,您的后端应用程序必须 send 来自 0x123 地址的交易才能访问数据。简单 call 不会 return 任何东西,因为 getSecretField() 不再是 view 函数。