【问题标题】:Best practice for protecting sensitive information on solidity?保护关于solidity的敏感信息的最佳实践?
【发布时间】:2021-05-09 17:31:21
【问题描述】:

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

contract MyContract {
    string private secretField
}

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

}

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

【问题讨论】:

    标签: ethereum solidity smartcontracts


    【解决方案1】:

    如果它位于公共区块链(主网、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 不会返回任何内容,因为getSecretField() 不再是view 函数。

    【讨论】:

    • 它将在公共区块链上。 strage_slot 方法使保护变得不可能。我想我需要找到另一种模式。
    • @MiratCanBayrak 也许您的用例将允许散列 - (公开)仅存储某个秘密的散列并针对散列进行验证(请注意,交易也是公开的,因此您可能还希望您的用户传递散列 - 不是散列之前的值,例如密码)。但总的来说,公有链并不是存储私有数据的好方法。
    猜你喜欢
    • 2013-03-09
    • 2011-05-17
    • 1970-01-01
    • 2011-02-22
    • 1970-01-01
    • 1970-01-01
    • 2020-12-24
    • 2010-10-28
    • 1970-01-01
    相关资源
    最近更新 更多