当前位置: 首页 > news >正文

将 Ordinals 与比特币智能合约集成:第 2 部分

在上一篇文章中,我们展示了一种将 Ordinal 与智能合约集成的方法,即将Ordinal和合约放在同一个 UTXO 中。 今天,我们介绍了一种集成它们的替代方案,即它们位于单独的 UTXO 中。

作为展示,我们开发了一个智能合约,可以实现序号的链上拍卖。 智能合约保证拍卖师将获得最高出价,而投标人将获得 Ordinal。

基本思想

在 UTXO 模型中,一笔交易可以包含多个输入,每个输入消耗一个单独的 UTXO。 其中一个 UTXO 是我们的智能合约,另一个是锁定在非合约(即 P2PKH)UTXO 中的 Ordinal。 比特币智能合约能够访问相邻的输入,在 sCrypt 中称为 ScriptContext由于 Ordinal 也基于 UTXO,因此智能合约可以访问相邻输入中花费的 Ordinal,从而决定其传输。

Ordinal 拍卖

为了演示这个想法是如何体现的,我们构建了一个拍卖 Ordinal 的合约。 它是公开透明的,每个人都可以参与,在规定的截止日期后投标结束,出价最高者获胜。

有两种与合约交互的方式。 让我们看看它们是如何实现的。

1. 投标

当出现更高出价时,更新当前最高出价者,并退还之前最高出价者。

上图显示了两笔此类竞价交易,其中 Bob 和 Charles 成功竞价。 它们都有 3 个输入和 2 个输出。

@method()
public bid(bidder: PubKey, bid: bigint) {const highestBid: bigint = this.ctx.utxo.valueassert(bid > highestBid,'the auction bid is lower than the current highest bid')// Change the public key of the highest bidder.const highestBidder: PubKey = this.bidderthis.bidder = bidder// Auction continues with a higher bidder.const auctionOutput: ByteString = this.buildStateOutput(bid)// Refund previous highest bidder.const refundOutput: ByteString = Utils.buildPublicKeyHashOutput(hash160(highestBidder),highestBid)let outputs: ByteString = auctionOutput + refundOutput// Add change output.outputs += this.buildChangeOutput()assert(hash256(outputs) == this.ctx.hashOutputs,'hashOutputs check failed')
}

出价方法非常简单。 它首先检查出价是否足够大。 如果是,它会更新最高出价者。 其余的,它检查新交易的输出。 第一个输出只是具有更新状态的下一个拍卖实例。 此输出中锁定的值将等于新的出价。 第二个输出将按照最后最高出价者的出价金额偿还。 最后它添加了找零输出。

2. 关闭拍卖

当拍卖到期时,拍卖师可以关闭拍卖并接受报价。 拍卖师还必须将 ordinal 转让给最高出价者。 这是关闭合约的条件。

上图右侧显示了一笔平仓交易。 它与竞价交易的不同之处在于输入和输出。

  • 有一个附加输入(第一个输入)包含我们正在拍卖的 Ordinal
  • 有一个输入(第一个输出)将 Ordinal 传输给中标者。

合约在第二个输入中被调用,而 Ordinal 在第一个输入中被引用。 它们位于单独的 UTXO 中,但合约可以控制 Ordinal 的传输。

// Output of auctioned ordinal (txid + vout).
@prop()
readonly ordnialPrevout: ByteString@method()
public close(sigAuctioneer: Sig) {// Check if using block height.assert(this.ctx.locktime >= this.auctionDeadline,'auction is not over yet')// Check signature of the auctioneer.assert(this.checkSig(sigAuctioneer, this.auctioneer),'signature check failed')// Ensure the first input in spending the auctioned ordinal UTXO.assert(slice(this.prevouts, 0n, 36n) == this.ordnialPrevout,'first input is not spending specified ordinal UTXO')// Ensure the 1sat ordinal is being payed out to the winning bidder.let outputs = Utils.buildPublicKeyHashOutput(hash160(this.bidder), 1n)// Ensure the second output is paying the bid to the auctioneer.outputs += Utils.buildPublicKeyHashOutput(hash160(this.auctioneer),this.ctx.utxo.value)// Add change output.outputs += this.buildChangeOutput()// Check outputs.assert(hash256(outputs) == this.ctx.hashOutputs, 'hashOutputs mismatch')
}

close 方法稍微复杂一些。 首先,它在第 8 行使用典型的时间锁定模式检查调用是否是在截止日期之后发出的。然后,它在第 14 行验证拍卖师的签名,这是唯一允许结束拍卖的签名。

ScriptContext 中的 this.prevouts 包含指向输入中引用的 UTXO 的所有指针,称为 outpoints。 出点包含两部分:

  1. 交易ID: 32 字节
  2. 输出索引: 4 字节

UTXO 位于由此类出点唯一标识的交易的输出中。

在第 21 行,我们提取第一个输入的出点(前 36 个字节),并将其与实际 Ordinal 的 UTXO 进行比较,在拍卖开始和部署合约时进行硬编码。 这保证了 Ordinal 的真实性并且它不能被伪造。

然后我们像以前一样构造并确认输出。 第一个输出是定期 P2PKH 转账给最高出价者。 第二个输出支付给拍卖师。 最后,如有必要,我们添加找零输出。

请注意,合约确保 Ordinal 出现在第一个输入中,因此它最终出现在第一个输出中并转移给获胜者。

一个例子

以下是执行比特币 Ordinal 拍卖结束的交易示例:

69335ac678c19704c1564877f5d100f1b99212273f83a5536bb2c6deca40d0c8

这个 Ordinal 刻有“Hello, sCrypt!”文字,拍卖价格高达 8 聪! Ordinal 被转移给地址为 1NHJoK2ANVb8MtK7Er1uEqBckgbpZK7QUz 的最高出价者。

完整的代码和测试可以在 GitHub 上找到。

相关文章:

将 Ordinals 与比特币智能合约集成:第 2 部分

在上一篇文章中,我们展示了一种将 Ordinal 与智能合约集成的方法,即将Ordinal和合约放在同一个 UTXO 中。 今天,我们介绍了一种集成它们的替代方案,即它们位于单独的 UTXO 中。 作为展示,我们开发了一个智能合约&…...

PCL 法线空间采样(C++详细过程版)

法线空间采样 一、概述二、代码实现三、结果展示1、原始点云2、采样结果一、概述 法线空间采样在PCL里有现成的调用函数,具体算法原理和实现代码见:PCL 法线空间采样。为充分了解法线空间采样算法实现的每一个细节和有待改进的地方,使用C++代码对算法实现过程进行复现。 二…...

论文阅读:AugGAN: Cross Domain Adaptation with GAN-based Data Augmentation

Abstract 基于GAN的图像转换方法存在两个缺陷:保留图像目标和保持图像转换前后的一致性,这导致不能用它生成大量不同域的训练数据。论文提出了一种结构感知(Structure-aware)的图像转换网络(image-to-image translation network)。 Proposed Framework…...

CNC 3D浮雕 Aspire 11.55 Crack

Aspire 提供了功能强大且直观的软件解决方案,用于在 CNC 铣床上创建和切割零件。有用于 2D 设计和计算 2D 刀具路径的工具,例如仿形、型腔加工和钻孔以及 2.5D 刀具路径,包括:V 形雕刻、棱镜雕刻、成型刀具路径、凹槽、 倒角刀具路…...

【Clickhouse2022.02 查询优化】

一、现场场景概述 现场每天每张表入库数据量大约2-4亿条,页面涉及到自定义时间段查询(白天08:00-15:00,夜晚23:00-06:00)与不同时间段(最近一天、一周、一个月和全部)的统计指标查询。 二、主要问题 时间跨度大无查询或查询条件命中数据过多的分页查询场景速度慢 (主要是数据…...

PMP证书在国内已经泛滥了,还有含金量吗?

没有泛滥吧?这个证书现在就是趋向于项目管理人士要去考的呀,也不是考了没用,提升自身个人的能力、找工作方面和晋升加薪方面确实有用呀,不然报名费那么贵,为什么越来越多人考呢? 1、提升自身个人的能力 首…...

SolidJs节点级响应性

前言 随着组件化、响应式、虚拟DOM等技术思想引领着前端开发的潮流,相关的技术框架大行其道,就以目前主流的Vue、React框架来说,它们都基于组件化、响应式、虚拟DOM等技术思想的实现,但是具有不同开发使用方式以及实现原理&#…...

数据采集技术在MES管理系统中的应用及效果

在现代制造业中,MES生产管理系统已成为生产过程中不可或缺的一部分。MES管理系统能够有效地将生产计划、生产执行、质量管理等各个生产环节有机地衔接起来,从而实现生产过程的全面优化。本文将以某车间为例,探讨结合MES系统的数据采集技术的应…...

php函数usort使用方法

在 PHP 中,usort() 函数用于对数组进行排序,它允许你使用自定义的比较函数来确定元素的顺序。以下是 usort() 函数的使用方法: usort(array &$array, callable $cmp_function): bool参数说明: $array:要排序的数…...

35.浅谈贪心算法

概述 相信大家或多或少都对贪心算法有所耳闻,今天我们从一个应用场景展开 假设存在下面需要付费的广播台,以及广播台信号可以覆盖的地区。 如何选择最少的广播台,让所有的地区都可以接收到信号? 广播台覆盖地区k1北京、上海、天津…...

QT时间日期定时器类(1.QDate类)【QT基础入门 Demo篇】

使用时候需要包含头文件   创建一个 QDate 实例   设置 QDate 的日期   获取 QDate 的日期   获取当前是周几   判断 QDate 的有效性  格式化 QDate 的显示字符串   计算 QDate 的差值  QDate显示格式   年月日转换时间戳时间戳转换年月日 QDate相关…...

记一次实战案例

1、目标:inurl:news.php?id URL:https://www.lghk.com/news.php?id5 网站标题:趋时珠宝首饰有限公司 手工基础判断: And用法 and 11: 这个条件始终是为真的, 也就是说, 存在SQL注入的话, 这个and 11的返回结果必定是和正常页…...

Serv-U FTP服务器结合cpolar内网穿透实现共享文件并且外网可远程访问——“cpolar内网穿透”

文章目录 1. 前言2. 本地FTP搭建2.1 Serv-U下载和安装2.2 Serv-U共享网页测试2.3 Cpolar下载和安装 3. 本地FTP发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1. 前言 科技日益发展的今天,移动电子设备似乎成了我们生活的主角,智能…...

EasyWindow - Android 悬浮窗框架

官网 https://github.com/getActivity/EasyWindow 项目介绍 本框架意在解决一些极端需求,如果是普通的 Toast 封装推荐使用 Toaster 集成步骤 如果你的项目 Gradle 配置是在 7.0 以下,需要在 build.gradle 文件中加入 allprojects {repositories {/…...

tp5连接多个数据库

一、如果你的主数据库配置文件都在config.php里 直接在config.php中中定义db2&#xff1a; 控制器中打印一下&#xff1a; <?php namespace app\index\controller; use think\Controller; use think\Db; use think\Request; class Index extends Controller {public fun…...

SAP PO运维(一):系统概览异常处理

打开SAP PIPO Netweaver Administration界面,系统概览下显示异常: 参考SAP note: 2577844 - AS Java Monitoring and Logging parametrization best practice service/protectedwebmethods = SDEFAULT -GetVersionInfo -GetAccessPointList -ListLogFiles -ReadLogFile -Para…...

安全厂商安恒信息加入龙蜥社区,完成 与 Anolis OS 兼容适配

近日&#xff0c;杭州安恒信息技术股份有限公司&#xff08;以下简称“安恒信息”&#xff09;签署了 CLA&#xff08;Contributor License Agreement&#xff0c;贡献者许可协议&#xff09;&#xff0c;正式加入龙蜥社区&#xff08;OpenAnolis&#xff09;&#xff0c;并成为…...

maven找不到jar包

配置settings.xml文件之后出现报错找不到jar包 先改maven设置: 然后在重新清理构建项目: 可以通过执行以下命令清理本地 Maven 仓库 mvn dependency:purge-local-repository...

MySQL的数据目录

文章目录 MySQL的数据目录1. MYSQL目录结构2. 数据库与文件系统的关系2.1 查看默认数据库2.2 数据库在文件系统中的表示2.1.1 MyISAM存储引擎模式2.1.2 InnoDB存储引擎模式 2.3 视图在文件系统中的表示2.4 小结 MySQL的数据目录 1. MYSQL目录结构 查询主要目录结构&#xff1a…...

详解MySQL索引+面试题

前言: 📕作者简介:热爱编程的小七,致力于C、Java、Python等多编程语言,热爱编程和长板的运动少年! 📘相关专栏Java基础语法,JavaEE初阶,数据库,数据结构和算法系列等,大家有兴趣的可以看一看。 😇😇😇有兴趣的话关注博主一起学习,一起进步吧! 一、索引概述…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子&#xff0c;用于处理异步操作&#xff08;如数据加载&#xff09;中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误&#xff1a;捕获在 loader 或 action 中发生的异步错误替…...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中&#xff0c;接口是一种抽象类型&#xff0c;它定义了一组方法的集合&#xff1a; // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的&#xff1a; // 矩形结构体…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)

🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

关于 WASM:1. WASM 基础原理

一、WASM 简介 1.1 WebAssembly 是什么&#xff1f; WebAssembly&#xff08;WASM&#xff09; 是一种能在现代浏览器中高效运行的二进制指令格式&#xff0c;它不是传统的编程语言&#xff0c;而是一种 低级字节码格式&#xff0c;可由高级语言&#xff08;如 C、C、Rust&am…...

基于matlab策略迭代和值迭代法的动态规划

经典的基于策略迭代和值迭代法的动态规划matlab代码&#xff0c;实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

Java线上CPU飙高问题排查全指南

一、引言 在Java应用的线上运行环境中&#xff0c;CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时&#xff0c;通常会导致应用响应缓慢&#xff0c;甚至服务不可用&#xff0c;严重影响用户体验和业务运行。因此&#xff0c;掌握一套科学有效的CPU飙高问题排查方法&…...

Python Einops库:深度学习中的张量操作革命

Einops&#xff08;爱因斯坦操作库&#xff09;就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库&#xff0c;用类似自然语言的表达式替代了晦涩的API调用&#xff0c;彻底改变了深度学习工程…...

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)

前言&#xff1a; 双亲委派机制对于面试这块来说非常重要&#xff0c;在实际开发中也是经常遇见需要打破双亲委派的需求&#xff0c;今天我们一起来探索一下什么是双亲委派机制&#xff0c;在此之前我们先介绍一下类的加载器。 目录 ​编辑 前言&#xff1a; 类加载器 1. …...