基于 ECDSA 的 BSV 预言机
我们开发了一种有效的算法来验证 BSV 智能合约中某一方签署的任意数据。与之前基于 Rabin 签名 的签名算法相比,它是基于 ECDSA 签名算法的,因此可以直接重用原生比特币密钥来生成和验证。
图片来自bitnove
概述
BSV 智能合约需要预言机导入外部数据,例如天气和商品价格。导入后,智能合约需要验证数据实际上来自授权的预言机。更具体地说,我们需要解决以下问题。
如何验证一条数据是否由具有已知公钥的预言机签名?
P 和 p 分别表示预言机的公钥和私钥。我们首先对要签名的数据进行哈希处理。结果与 p 相加,产生一个新的私钥 p’ 。
x = sha256(data)
p’ = p + x
对应的公钥 P’ 可以如下推导出:
P’ = p’ * G = (p + x) * G = P + x * G
G 是比特币中使用的椭圆曲线的基点。
预言机使用派生的私钥 p’ 来签名,而不是原始的 p。
这里的一切都是公开的,除了私钥 p。由于只有预言机知道 p,所以只有他知道 p’,并且可以用它来对 P’ 签名。要计算合约中的 P’,我们需要计算 x * G,然后将结果与 P 相加。
在脚本中高效计算 x * G
计算 x * G 的简单方法是在椭圆曲线上使用点乘法。但是,它的计算成本很高。我们注意到 G 是椭圆曲线上的一个特殊点。如果我们把 x 看作一个私钥,那么 x * G 本质上就是 x 的公钥 X。
X = x * G
因此,验证 (x, X) 是一个有效的私钥和公钥对就足够了。
为了验证这一点,我们利用了 OP_PUSH_TX 技术。在 OP_PUSH_TX 中,我们使用私钥对 sighash 原像进行签名,并使用本机签名检查 OP_CHECKSIG 来根据相应的公钥检查生成的签名。如果检查通过,我们可以确定 sighash 原像一定是当前支出交易的原像。此外,公钥必须从私钥派生。我们选择 (x, X) 作为 OP_PUSH_TX 中的密钥对,从而验证 X 确实是 x 的公钥。
高效的公钥点加法
使用之前的椭圆曲线库,我们可以高效地将 P 和 X 相加。
P’ = P + X
一旦我们有了 P’,我们就可以使用本机 OP_CHECKSIG
来验证包含数据的支出交易是否由预言机使用 p’ 签名。完整代码如下所示。
import "ec.scrypt";
import "util.scrypt";// an oracle library signing any data using ECDSA
library Oracle {// verify data is signed by the oracle with given public keystatic function verifyData(bytes data, Sig sig, PubKey oraclePubKey, PubKey derivedOraclePubKey, PubKey X,int lambda, SigHashPreimage txPreimage) : bool {// sha256 databytes hash = sha256(data);PrivKey x = PrivKey(Util.fromLEUnsigned(hash));// verify X = x * G?require(Tx.checkPreimageAdvanced(txPreimage, x, X, Util.invK, Util.r, Util.rBigEndian, SigHashType(SigHash.NONE | SigHash.FORKID)));// verify P' = P + Xrequire(EC.isPubKeySum(oraclePubKey, X, lambda, derivedOraclePubKey));// verify signature is from oracle, who knows p' = p + xreturn checkSig(sig, derivedOraclePubKey);}
}
基于 ECDSA 的 Oracle
第 16
行使用 OP_PUSH_TX 验证 X = x * G。第 19
行验证 P’ = P + X。第 22
行检查签名是用 p’ 生成的。
值得注意的是,预言机参与了交易的签署,其中数据在其输入之一的解锁脚本中。为了最大程度地灵活创建交易的剩余部分,他可以在签名时使用 sighash 标志,例如 SIGHASH_NONE | SIGHASH_ANYONECANPAY
。相比之下,基于 Rabin 签名的预言机可以简单地发布签名数据,而无需参与创建交易。
总结
通过重用比特币密钥对,基于 ECDSA 的预言机可以利用 BSV 生态系统已经提供的现有基础设施和网络效应(包括所有 BSV 钱包和许多服务提供商,例如区块浏览器),从而显着降低开发成本。在实践中,它成为基于 Rabin 签名的预言机的竞争替代方案,尽管后者的脚本大小更小,交易成本更低。
致谢
本文是 nChain 专利 WO2018189634 的扩展,作者 Ying Chan 现在在 Cambridge Cryptographic.
基于 ECDSA 的 BSV 预言机相关推荐
- Chainlink Price Feeds现已上线Moonbeam,实现波卡构建者访问领先预言机提供商Chainlink的Price Feeds
Chainlink现已支持波卡上最活跃的DApp生态系统 2022年6月15日,基于波卡的领先多链应用平台Moonbeam宣布将Chainlink Price Feeds作为预言机解决方案原生集成至其 ...
- 马烈:预言机板块上涨是基于乐观预期,实践之路仍需探索
今年以来,预言机代表项目ChainLink受到市场的广泛关注,其代币LINK价格不断创新高,截至发稿时,LINK价格为 12.46美元,冲进了加密货币市值排行榜前十,排名第6位.受到LINK价格上涨的 ...
- 基于区块链的自动抽奖系统从0到1实现探析预言机与跨链技术的融合发展
可信接入外部服务之预言机Truora介绍 区块链预言机 (oracle mechanism)一般指帮助区块链系统访问链外信息的一种机制. 预言机和跨链有不少相似之处,都是为了打破区块链平台壁垒,以链接 ...
- 预言机理解:A Scalable Architecture for On-Demand, Untrusted Delivery of Entropy
阅读背景 由于要做智能合约随机数监测相关的内容,所以也需要调研清楚目前智能合约随机数生成的手段之一:预言机. 本文来自链接智能合约预言机随机数生成案例的github主页,感兴趣也可以阅读. 概览 Th ...
- BCH区块链上的预言机项目——Oracles
近日,加密开发人员cgcardona在r/btc论坛发布了一个由个人开发的BCH相关项目,项目命名为Oracles(预言),它可用于预测市场.无信任下注等,目的是为了提供一种快速引导Oracles数据 ...
- Chainlink平台预言机
1. Chainlink 预言机的双层结构 开源的去中心化数据获取机 两层结构 1.1 多个预言机节点 实现了预言机的去中心化,保证数据上链服务的可靠性.多个预言机节点保证了当任意一个预言机出现问题( ...
- 智能合约重构社会契约 (4)预言机基础说明
1. 区块链如何获取现实世界的数据? 由于网络.节点处理速度等原因,各节点直接获取外界数据时可能会有偏差,从而造成结果不同. eg. 理想的区块链和预言机1对1模型(实际上是不行的) 1.1 预言机提 ...
- 甲骨文预言机平台(1)业务流程
甲骨文预言机平台Oracle Blockchain Platform 1. Oracle Functions (Fn)和OCI Streaming服务 OBP's REST API provides ...
- Oracle预言机项目发展概览
预言机项目发展概览 今年涌现了不少专注做Oracle预言机的项目,作为与现实世界与区块链数据交互的入口逐渐在区块链的架构体系中发挥更加重要的作用. 常见的应用诸如博彩.游艺,但是,预言机真正发挥价值的 ...
最新文章
- 取消Eclipse等号、分号、空格代码自动补全
- DPDK — 安装部署(CentOS 7)
- XHTML与HTML的区别
- 前端学习(3046):vue+element今日头条管理-页面布局和面包屑筛选
- python的数据结构包括那些_python算法与数据结构-什么是数据结构
- Eclipse Memory Analyzer分析内存使用总结
- 如何在ViewModel中正确地使用Timer(定时器)
- DLL注入——使用远程线程
- 《控制论导论》读书:机构-黑箱
- python qt designer
- 23位子网掩码是多少_23位子网掩码包含哪几个网段
- STM32F103C8T6实现流水灯
- 跟这台计算机连接的一个USB设备运行不正常,Windows无法识别
- python解包wxapkg_小程序反编译之获取wxapkg包
- 香农编码的C++实现及求平均码长和编码效率
- idea打不开eclipse项目的问题
- 清理kdevtmpfsi、dbused挖矿木马程序
- php kingcms 模型调用,KingCMS 中模板、模块、模型区别
- docker出现Error starting userland proxy: listen tcp4 0.0.0.0:3306: bind: address already in use的解决方法
- ioctl函数详细说明(网络)
热门文章
- PDF转换成excel,如何做?
- js websocket同步等待_javascript – 如何等待WebSocket的readyState更改
- 试用版升级到许可版本的 Tableau Server
- 基于stm32单片机RFID门禁刷卡/指纹识别系统
- 深度学习(三)denoise autoencoder的Python实现
- multiwii 2.4配置页面中文注释
- imx6ull u-boot 下载/编译/烧写/运行
- BZOJ2331: [SCOI2011]地板
- tf.maximun(a,b)_tf.minimum(a,b)
- RCAR会议---论文遵从验证