是否有可能将数据保存在合同中,就像我们可以创建钱包合同一样?想知道是否有可能保留这些数据,然后根据合同中的其他代码来管理对这些“隐藏”数据的访问。
这里的更高层次是,我将为一个应用程序实现一个mvp,在这个应用程序中,一个人能够保证它发送资金的用户钱包中有x或y个数据。仍然不确定的是ethereum是最好的选择,但由于在nodejs应用程序上使用web3在测试网络上可能实现的方便性,所以进行查询。
希望有更多的想法或地方能得到更多的信息!
发布于 2019-02-06 02:46:09
在一个为透明而优化的平台上保守秘密是非常困难的。也有高成本的连锁存储需要考虑。
您可以探索诸如zkSnarks、starks和防弹等概念,以确定是否有解决方案。在这里,我只想说明一下挑战的本质。
考虑到所有完整的节点,包括矿工,都必须拥有完整的状态,才能评估状态转换。也就是说,除非他们有数据,否则他们不能运行合同。你可以轻松地做一些事情,比如提交/揭露,但是当你不愿意的时候,你经常会遇到暴露“秘密”的问题。
假设一个储蓄罐在收到密码后释放资金。我们将对密码进行散列,这样没有人能够确定实际密码是什么。这绝不是可以使用的。我希望它尽可能简单来说明一些事情。
pragma solidity 0.5.1;
contract PiggyBank {
bytes32 public secretHash;
constructor(bytes32 hash) public {
secretHash = hash;
}
function deposit() public payable returns(bool) {
// emit event
// great! we have money
return true;
}
function withdrawEverything(bytes32 password) public returns(bool) {
require(keccak256(abi.encodePacked(password)) == secretHash);
// emit ...
// great! Someone knew the password
msg.sender.transfer(address(this).balance);
return true;
}
}因此,secretHash被传递到constructor中,并且很容易被检查。事实上,所有的完整节点都有它,所以public只是为了方便。如果public被移除,它仍然不会安全地避开坚定的眼睛。
没关系,对吧?因为对secretHash的了解并不能真正帮助人们计算出密码。
看看withdraw是如何要求password工作的?这意味着密码将在使用函数的时候显示出来。是“烧掉”了。如果这是一个真正的储蓄罐,人们可以强制修改密码作为提取过程的一部分。这可能对你的案子不好。
关于“零知识证明”有很多有前途的研究--本质上证明一个人拥有信息,而不透露信息本身。你可以集中精力研究可用的解决方案。根据您所想到的细节,您可能会发现这种模式很有前途:https://medium.com/@robhitchens/selective-disclosure-with-proof-f6a1ac7be978
有可能披露一个来源或一组来源发布或核对的信息,而不披露信息本身。还可以以提供一份符合早先承诺披露的信息为条件来支付信息。
大致如下:
第一步,我有一个令人满意的信息,符合您的所有标准。这就是这方面的证据。
第二步,转入代管。
第三步,我提供了承诺的信息,买方现在被列为收货人。这是这方面的证据,所以我现在有权得到这些资金。
没有必要将数据本身公开给块链,这样就可以保证数据不会在过程中公开。这一过程将在很大程度上依赖于仔细安排数据,以便能够有选择地披露。
这些都是棘手的问题。
希望能帮上忙。
发布于 2019-02-06 02:45:37
你不能有隐藏的数据在Ethereum区块链上。一切都是公开的,任何人都可以看到。
至于MVP,您当然可以编写一个智能契约钱包,根据用户可能设置的或不设置的变量的值与传入的以太进行不同的决策。然而,这个变量将是公开的,让每个人都能看到。
https://ethereum.stackexchange.com/questions/66676
复制相似问题