基于 sCrypt 智能合约的预言机作弊惩罚
Posted freedomhero
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于 sCrypt 智能合约的预言机作弊惩罚相关的知识,希望对你有一定的参考价值。
预言机对于智能合约访问外部现实世界的数据是必不可少的。数据保真度对于这些智能合约的运行至关重要。提高数据保真度的一种方法是要求预言机针对他们提供的数据存入一些抵押品。如果预言机行为不端并提供欺诈性数据,抵押品将被没收(称为罚没)。如果抵押品由第三方托管,我们只是将信任问题从预言机转移到第三方,需要委托第三方对欺诈行为进行明智的监控和惩罚。
我们在本文中的创新是将抵押品直接锁定在智能合约中作为公共赏金,任何人只要能找到欺诈证据就可以获取赏金,无需任何受信任的第三方。通过确保任何不诚实的行为都会被发现并受到经济处罚,来激励预言机诚实行事,从而使依赖于它们的智能合约更加安全。我们以 Sensible 预言机为例进行说明。
Sensible 合约和预言机
Sensible 合约是一种开发和组织比特币智能合约的方式。它允许合约回溯到其发行交易,并识别位于同一交易相邻输入中的合约。它依赖于一种特定类型的预言机来验证链下数据的完整性,称为签名服务。请注意, Sensible 预言机 签署了以下元组:
(txid, index, satoshis, scriptHash)
基本上,它代表 txid
交易中的第 index
个输出包含 satoshis
数量的比特币,并且输出的脚本哈希散列为 scriptHash
。
预言机罚没
我们注意到元组中的所有信息都是公开的,每个人都可以独立检查。如果我们可以找到具有给定 txid
的交易,但在索引输出中包含不同的 satoshi
金额或脚本,那么我们已经找到了欺诈的证据,可以用来没收预言机的抵押品。为了实现这一点,需要预言机将抵押品锁定在以下合约中:
import "rabin.scrypt";
import "txUtil.scrypt";
// signed data format
struct PayloadU4Data
// outpoint
Sha256 txid;
int index; // 4 bytes
// satoshis in the outpoint; 8 bytes
int satoshis;
// hash of the script of the outpoint
Ripemd160 scriptHash;
// slash fraudulent Sensible oracles
contract SlashSensibleOracle
// oracle's public key
RabinPubKey pubKey;
public function slash(bytes fraudProofTx, bytes signedMsg, RabinSig sig)
// verify message is signed
require(RabinSignature.checkSig(signedMsg, sig, this.pubKey));
// deserialize into specified format
PayloadU4Data payload = deserialize(signedMsg);
// verify transaction is referenced in the signed message
require(hash256(fraudProofTx) == payload.txid);
// parse the output at the given index from the tx
Output output = TxUtil.readOutput(fraudProofTx, payload.index);
// fraud detected: either satoshi or script part of the output mismatches
require(output.satoshis != payload.satoshis || hash160(output.script) != payload.scriptHash);
static function deserialize(bytes msg) : PayloadU4Data
return Sha256(msg[: 32]), Utils.fromLEUnsigned(msg[32 : 36]), Utils.fromLEUnsigned(msg[36 : 44]), Ripemd160(msg[44 :]) ;
第 20
行确保数据确实由 Sensible 预言机签名;第 23
行将数据解析为所需的格式;第 26
行验证包含欺诈证明的交易与 txid
匹配;在第 29
行从交易中检索到指定的输出后,第 35
行通过验证预言机是否签署了错误的金额或脚本哈希,以此检查预言机是否作弊。
如果发现欺诈,任何人都可以调用合约并赎回预言机的抵押品。
延展
Sensible 预言机还签署另外一个元组:
(txid, index, satoshis, scriptHash, spendByTxID)
它不仅验证由对 (txid
, index
) 标识的输出具有指定的 satoshi
数量和脚本,而且还验证它是否被具有 spendByTxID
的交易所花费。为了检测这种欺诈行为,除了合约 SlashSensibleOracle
中所做的之外,我们还可以找到具有不同 txid
的交易。我们可以使用这种技术——从无需预言机的比特币智能合约中访问区块链数据,来验证交易确实在链上。
总结
我们只展示了如何使用智能合约来罚没作弊的 Sensible 预言机。它适用于任何可以在智能合约中验证欺诈证据的预言机。
例如,预言机可以进行纯/无状态但复杂的计算并对结果进行签名。智能合约可以导入签名结果并获得结果,而无需重新运行昂贵的计算。同时,每当预言机作弊时,通过简单地计算出不同但正确的结果,就能罚没他锁定在合约中的抵押品。
以上是关于基于 sCrypt 智能合约的预言机作弊惩罚的主要内容,如果未能解决你的问题,请参考以下文章
区块链 | 预言机从零开始使用Chainlink预言机- 智能合约中使用更安全的随机数-代码实战