Ethereum 保护有关可靠度的敏感信息的最佳做法?

Ethereum 保护有关可靠度的敏感信息的最佳做法?,ethereum,solidity,smartcontracts,Ethereum,Solidity,Smartcontracts,我的合同中有一个字段。是这样的: contract MyContract { string private secretField } function getSecretField() public view returns { ... some controls here... return secretField; } 我希望从后端服务器访问该secretField,并保护它不受任何其他请求者的攻击。这方面的最佳实践是什么?如果它位于公共区块链(mainnet、rop

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

contract MyContract {
    string private secretField
}

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

}

我希望从后端服务器访问该secretField,并保护它不受任何其他请求者的攻击。这方面的最佳实践是什么?

如果它位于公共区块链(mainnet、ropsten testnet等)上,则总是可以通过查询包含
secretField
值的链外应用程序来访问它。无论Solidity
private
visibility修饰符如何,因为存储查询是在较低的层上执行的

示例:如果
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;
}

请注意,为了访问数据,您的后端应用程序必须从
0x123
地址发送一个事务。简单的
调用
不会返回任何内容,因为
getSecretField()
不再是
视图
函数。

它将位于公共区块链上。strage_槽法使保护变得不可能。我想我需要找到另一种模式。@MiratCanBayrak也许您的用例将允许散列-(公开)只存储某个秘密的散列,并根据散列进行验证(请注意,事务也是公开的,因此您可能还希望您的用户传递散列,而不是散列之前的值,如密码)。但一般来说,公共区块链不是存储私人数据的好方法。