我的问题是,如何验证智能合同的身份,或者基本上如何验证合同的身份。
据我所知,合同没有私钥,也不能保留私钥,因为它的所有内容都是公开的。
那么,我如何认证并授权一个合同来访问链外的秘密数据呢?
谢谢!
发布于 2018-10-12 00:20:31
我不认为你的问题不清楚(有人标记了它),但它与Ethereum的概念工作方式相去甚远。让我们从大的开始。
Ethereum中的所有内容都是确定性的,这意味着验证正确性是可能的。事实上,每个节点现在和将来都必须能够验证每一个计算。考虑到这一职能:
function adder(uint x, uint y) public pure return(uint sum) {
return x+y;
}这里没有问题,因为我们可以说,对于任何给定的输入,结果总是一样的。我们甚至可以草草记下结果,以便以后:
uint public z;
function adder(uint x, uint y) public {
z = x + y;
}我们将拥有发送给函数的所有事务的不可变历史记录,而z的值将是唯一可能给出的事务历史记录(所有节点都同意的)。
如果这还不清楚,历史会是这样的:
0x123...0x123...和(2,3)发送了一个事务。它有一个事务哈希,它成为规范链的一部分。大家都同意发生了这件事。z()在0x123,响应是5,每个人都可以看到,这是唯一可能的结果,鉴于历史。不太明显的是,从根本上来说,不可能创建一个检查外部世界的函数。如果我们这么做了,比如说.要检查API的响应,我们怎么可能知道给定的API总是返回与现在相同的值?我们做不到。因此,这将使另一个节点无法在将来验证区块链。这与前面示例中的(2,3)有何不同?有人与(2,3)签署了交易协议。
嗯,...kay,但是检查外面的世界是有用的。
解决此问题的一个解决方案是使用Oracle模式。一般来说,这意味着一个受信任的帐户将注入一些信息(今天的天气,股票报价,其他的.)并在留言上签名。重要的是,区块链不能(不能)验证输入的准确性。网络确实验证了签名。任何节点(在未来)都可以验证甲骨文说今天的温度是37度。信息是通过签署的交易进入合同的。
有关Oracles的更多信息:甲骨文服务是如何在幕后运作的?
这是一种公认的模式。在您的情况下,解决方案可能是在合同中给予“秘密”信息的保管人特权。例如,对其他人都没有的信息采取行动的特权。
另一个被公认为更具有实验性且不易掌握的解决方案是使用零知识证明的想法。您可以在这里找到一个简化的描述,以考虑这是否是您要寻找的内容:https://medium.com/@robhitchens/selective-disclosure-with-proof-f6a1ac7be978
希望能帮上忙。
发布于 2018-10-12 02:57:06
合同不能单独访问其他人的信息。他们可以调用其他合同来获取信息,但只有在别人指示他们这样做时才能这样做。
例如,智能契约不能移动属于其他人的ERC20令牌,但如果所有者批准了它们,则可以移动它们。
是合同的责任,持有执行确认的信息。例如,ERC20有批准的概念。
智能契约的标识是它自己的地址,如果您从该地址接收到一个事务,您很确定它是从智能契约(*)生成的。
(*)理论上,有一些私钥产生与智能契约相同的地址。他们可以代表合同进行交易。实际上,很难找到地址之间的冲突。
https://ethereum.stackexchange.com/questions/60438
复制相似问题