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

使用契约的链上限价订单

我们开发了链上限价订单。 它基于一种称为契约的智能合约,只有在花费输出的交易满足特定条件时才可以花费输出。 为了演示其工作原理,我们实施了以比特币支付的 Ordinals 代币买卖限价订单,无需托管人。 它可以运行在任何比特币协议链上,例如Bitcoin SV和MVC。

限价订单

限价单使买方或卖方(通常称为制造商)能够确定他们愿意在市场上买卖资产的特定价格。 随后,另一个交易者可以选择“接受”该报价并进行交易。 这一过程通常在托管交易所中得到促进,交易所暂时持有双方的资金,并采用内部结算机制来相应地分配资金。 然而,这种方法涉及将资金信任给第三方,从而使他们面临因系统黑客或内部盗窃而造成的潜在损失,其中第三方可能会消失或盗用资金。

契约

比特币契约 限制了 UTXO 的使用方式。 它是在 sCrypt 中使用 ScriptContext 实现的。

例如,做市商可以下一个卖出订单,将 10 个 PEPE 代币锁定到契约合约中,允许任何购买者提取最多 10 个 PEPE 代币,只要他们向卖家支付,例如,他们移除的每个 PEPE 1000 聪。

如果买方希望交易的金额低于 10 个 PEPE 限制(例如 7 个),他们可以选择为其余 3 个 PEPE 创建受相同契约约束的代币找零输出。 在这种特殊情况下,卖方被确定为做市商,买方在限价订单的框架内扮演接受者的角色。 该机制有利于部分履行限价订单的过程。

该限价订单可以看作是 RUN 代币的 OrderLock 和 Ordinals 的 OrdinalLock 的扩展,只能进行全额交易。

如果订单未 100% 成交,合同还允许卖方取消订单并拿走剩余的 PEPE。

实现

我们使用 BSV-20 同质化代币 作为创建限价订单的示例,并用比特币进行交易。

限价卖出订单

一定数量的 BSV-20 代币被锁定在契约智能合约中。 买方可以从智能合约中获取部分或全部代币,前提是他在同一合约调用交易中向卖方支付要价。

描述卖出限价订单的交易图

买家可以通过在同一合约调用交易中将聪转移到买家的地址来兑换 BSV-20 代币。 这是在调用合约的“buy”公共方法时完成的。

还有一种“cancel”方法,允许买家在订单未 100% 成交时取回资金。

class BSV20SellLimitOrder extends BSV20V2 {// Total amount of tokens we're selling.@prop()readonly tokenAmt: bigint// Amount of tokens already sold.@prop(true)tokenAmtSold: bigint// The seller's public key.@prop()seller: PubKey// Asking price per BSV-20 token unit.@prop()pricePerUnit: bigint...@method()public buy(amount: bigint, buyerAddr: Addr) {// Check token amount doesn't exceed total.assert(this.tokenAmtSold + amount < this.tokenAmt,'insufficient tokens left in the contract')// Update cleared amount.this.tokenAmtSold += amount// Build transfer inscription.const transferInscription = BSV20V2.createTransferInsciption(this.id,amount)const transferInscriptionLen = len(transferInscription)// Fist output is the contract itself, holding the remaining tokens.// If no tokens are remaining, then terminate the contractconst tokensRemaining = this.tokenAmt - this.tokenAmtSoldlet outputs = toByteString('')if (tokensRemaining > 0n) {outputs = this.buildStateOutput(1n)}// Ensure the sold tokens are being payed out to the buyer.outputs += BSV20V2.buildTransferOutput(pubKey2Addr(this.seller),this.id,amount)// Ensure the next output is paying the to the Bitcoin to the seller.const satsForSeller = this.pricePerUnit * amountoutputs += Utils.buildPublicKeyHashOutput(hash160(seller), satsForSeller)// Add change output.outputs += this.buildChangeOutput()// Check outputs.assert(hash256(outputs) == this.ctx.hashOutputs, 'hashOutputs mismatch')}@method()public cancel(buyerSig: Sig) {assert(this.checkSig(buyerSig, this.seller))}
}

BSV20SellLimitOrder

限价买入订单

限价卖出订单非常相似。 只是这一次,智能合约中锁定了一定数量的比特币,而不是 BSV-20 代币。

描述买入限价订单的交易图

由于智能合约本身无法确认 BSV-20 代币的真实性,因此使用了预言机服务。 预言机通过签署其引用以及金额和代币的铭文来保证代币的有效性。 智能合约验证此签名。

class BSV20BuyLimitOrder extends BSV20V2 {// Total amount of tokens we're buying.@prop()readonly tokenAmt: bigint// Amount of tokens already cleared.@prop(true)tokenAmtCleared: bigint// Public key of the oracle, that is used to verify the transfers// genesis.@prop()oraclePubKey: RabinPubKey// The buyer's public key.@prop()buyer: PubKey// Offered price per BSV-20 token unit.@prop()pricePerUnit: bigint...@method()public sell(oracleMsg: ByteString, oracleSig: RabinSig, sellerAddr: Addr) {// Check oracle signature.assert(RabinVerifier.verifySig(oracleMsg, oracleSig, this.oraclePubKey),'oracle sig verify failed')// Get token amount held by the UTXO from oracle message.const utxoTokenAmt = byteString2Int(slice(oracleMsg, 36n, 44n))// Check token amount doesn't exceed total.const remainingToClear = this.tokenAmt - this.tokenAmtClearedassert(utxoTokenAmt <= remainingToClear,'UTXO token amount exceeds total')// Update cleared amount.this.tokenAmtCleared += utxoTokenAmt// Build transfer inscription.const transferInscription = BSV20V2.createTransferInsciption(this.id,utxoTokenAmt)const transferInscriptionLen = len(transferInscription)// Check that the ordinal UTXO contains the right inscription.assert(slice(oracleMsg, 44n, 44n + transferInscriptionLen) ==transferInscription,'unexpected inscription from oracle')// Ensure the tokens are being payed out to the buyer.let outputs = BSV20V2.buildTransferOutput(pubKey2Addr(this.buyer),this.id,this.tokenAmt)// Ensure the second output is paying the Bitcoin to the seller.const satsForSeller = this.pricePerUnit * utxoTokenAmtoutputs += Utils.buildPublicKeyHashOutput(sellerAddr, satsForSeller)// If there's tokens left to be cleared, then propagate contract.if (this.tokenAmtCleared == this.tokenAmt) {outputs += this.buildStateOutput(this.ctx.utxo.value - satsForSeller)}// Add change output.outputs += this.buildChangeOutput()// Check outputs.assert(hash256(outputs) == this.ctx.hashOutputs, 'hashOutputs mismatch')}@method()public cancel(buyerSig: Sig) {assert(this.checkSig(buyerSig, this.buyer))}
}

BSV20BuyLimitOrder

相关文章:

使用契约的链上限价订单

我们开发了链上限价订单。 它基于一种称为契约的智能合约&#xff0c;只有在花费输出的交易满足特定条件时才可以花费输出。 为了演示其工作原理&#xff0c;我们实施了以比特币支付的 Ordinals 代币买卖限价订单&#xff0c;无需托管人。 它可以运行在任何比特币协议链上&…...

Iceberg学习笔记(1)—— 基础知识

Iceberg是一个面向海量数据分析场景的开放表格式&#xff08;Table Format&#xff09;&#xff0c;其设计的目的是解决数据存储和计算引擎之间的适配的问题 表格式&#xff08;Table Format&#xff09;可以理解为元数据以及数据文件的一种组织方式&#xff0c;处于计算框架&…...

springboot中动态api如何设置

1.不需要编写controller 等mvc层&#xff0c;通过接口动态生成api。 这个问题&#xff0c;其实很好解决&#xff0c;以前编写接口&#xff0c;是要写controller&#xff0c;需要有 RestController RequestMapping("/test1") public class xxxController{ ApiOperat…...

Java —— 抽象类和接口

目录 1. 抽象类 1.1 抽象类概念 1.2 抽象类语法与特性 1.3 抽象类的作用 2. 接口 2.1 接口的概念 2.2 接口的语法规则与特性 2.3 实现多个接口(解决多继承的问题) 2.4 接口间的继承 2.5 抽象类和接口的区别 2.6 接口的使用实例 2.7 Clonable 接口和深拷贝 2.7.1 Cloneable接口 …...

数字IC前端学习笔记:异步复位,同步释放

相关阅读 数字IC前端https://blog.csdn.net/weixin_45791458/category_12173698.html?spm1001.2014.3001.5482 异步复位 异步复位是一种常见的复位方式&#xff0c;可以使电路进入一个可知的状态。但是不正确地使用异步复位会导致出现意想不到的错误&#xff0c;复位释放便是…...

Linux内核移植之网络驱动更改说明一

一. 简介 本文学习 NXP官方Linux内核移植网络驱动的更改。 为了方便后面 Linux驱动的开发调试&#xff0c;所以&#xff0c;必须要把网络驱动调试好。 如果在做 Linux驱动开发时&#xff0c;写了一个 app或驱动&#xff0c;就需要将系统全部文件&#xff08;即 uboot&#…...

邮件|gitpushgithub报错|Lombok注解

基于 Spring Boot 搭建一个定时发送邮件的项目可以按照以下步骤进行&#xff1a; 创建一个新的 Spring Boot 项目&#xff0c;并添加所需的依赖。在 pom.xml 文件中添加以下依赖项&#xff08;根据你的需要进行调整&#xff09;&#xff1a; xml org.springframework.boot sp…...

【前端知识】Node——events模块的相关方法

一、events模块的常用方法 // 事件总线 const EventsEmitter require(events);const emitter new EventsEmitter();function HLog(msg){console.log(msg); }// 监听 emitter.on(hlog, HLog);setTimeout(() > {// 触发&#xff0c;打印emitter.emit(hlog, hello emitter!)…...

广州华锐互动VRAR | VR课件内容编辑器解决院校实践教学难题

VR课件内容编辑器由VR制作公司广州华锐互动开发&#xff0c;是一款专为虚拟现实教育领域设计的应用&#xff0c;它能够将传统的教学内容转化为沉浸式的三维体验。通过这款软件&#xff0c;教师可以轻松创建和编辑各种虚拟场景、模型和动画&#xff0c;以更生动、直观的方式展示…...

Wireshark抓包:理解TCP三次握手和四次挥手过程

TCP是一种面向连接、端到端可靠的协议&#xff0c;它被设计用于在互联网上传输数据和确保成功传递数据和消息。本节来介绍一下TCP中的三次握手和四次挥手。 文章目录 1 TCP头部格式2 wireshark抓包分析2.1 SEQ和ACK2.2 三次握手2.3 四次挥手 3 程序 1 TCP头部格式 TCP头部占据…...

网络工程师-HCIA网课视频学习

这里是速成的&#xff0c;只积累下&#xff0c;自己未曾学习到的东西。通过书本补充知识点。 视频&#xff1a;hcia17-链路聚合_哔哩哔哩_bilibili hcia16-路由高级特性&#xff1a; hcia17-链路聚合&#xff1a; 由于如果根据视频来学习的话&#xff0c;感觉视频的总结并不…...

【每日刷题——语音信号篇】

思考与练习 练习2.1 语音信号在产生的过程中&#xff0c;以及被感知的过程中&#xff0c;分别要经过人体的哪些器官&#xff1f; 1.产生过程&#xff1a; 肺部空气 → \rightarrow →冲击声带 → \rightarrow →通过声道&#xff08;可以调节&#xff09; → \rightarrow →…...

Linux进程通信——IPC、管道、FIFO的引入

进程间的通信——IPC 进程间通信 (IPC&#xff0c;InterProcess Communication) 是指在不同进程之间传播或交换信息。 IPC的方式通常有管道 (包括无名管道和命名管道) 、消息队列、信号量、共享存储、Socket、Streams等。其中 Socket和Streams支持不同主机上的两个进程IPC。 …...

数理统计的基本概念(一)

文章目录 总体、样本与统计量总体及其分布样本及其分布统计量统计量概念样本矩顺序统计量及其分布样本中位数与样本极差经验分布函数 参考文献 总体、样本与统计量 总体及其分布 在数理统计中&#xff0c;称所研究的对象的全体为总体&#xff0c;总体中的元素称为个体。若总体…...

clickhouse分布式之弹性扩缩容的故事

现状 社区不支持喔&#xff0c;以后也不会有了。曾经尝试过&#xff0c;难道是是太难了&#xff0c;无法实现吗&#xff1f;因为他们企业版支持了&#xff0c;可能是利益相关吧&#xff0c;谁知道呢&#xff0c;毕竟开源也要赚钱&#xff0c;谁乐意一直付出没有回报呢。 社区…...

数据结构--串的基本概念

目录 串的基本概念 串的定义 串与线性表对比 ​串的基本操作​ 串的比较 字符集编码 乱码问题​编辑 总结 ​串的存储结构 ​串的顺序存储​编辑 串的链式存储 串的基本操作 1、求字串 2、比较 3、定位操作 总结 串的基本概念 串的定义 串与线性表对比 串的…...

音视频流媒体之 IJKPlayer FFmpeg Android 编译

FIJK dockerfile 编译环境 FROM --platformlinux/amd64 ubuntu:18.04RUN apt-get update && apt-get install -y \wget \unzip \git \gcc \g \make \python \yasm \pkg-config \protobuf-compiler \sudoRUN apt-get install -y openjdk-8-jdkENV ANDROID_HOME…...

记录一次较为完整的Jenkins发布流程

文章目录 1. Jenkins安装1.1 Jenkins Docker安装1.2 Jenkins apt-get install安装 2. 关联github/gitee服务与webhook2.1 配置ssh2.2 Jenkins关联2.3 WebHook 3. 前后端关联发布 1. Jenkins安装 1.1 Jenkins Docker安装 Docker很好&#xff0c;但是我没有玩明白如何使用Docke…...

Virtual安装centos后,xshell连接centos 测试及遇到的坑

首先来一张官方的图--各种网络模式对应的连接状况&#xff1a; 1. 网络使用Host-Only模式动态分配IP&#xff0c;点确定后&#xff0c;centos 上运行 system restart network &#xff0c;使用ifconfig查看新的ip&#xff0c;XShell可以直接连上centos&#xff0c; 但是由于使用…...

【算法】最优乘车——bfs(stringsteam的实际应用,getline实际应用)

题目 H 城是一个旅游胜地&#xff0c;每年都有成千上万的人前来观光。 为方便游客&#xff0c;巴士公司在各个旅游景点及宾馆&#xff0c;饭店等地都设置了巴士站并开通了一些单程巴士线路。 每条单程巴士线路从某个巴士站出发&#xff0c;依次途经若干个巴士站&#xff0c;…...

DockerHub与私有镜像仓库在容器化中的应用与管理

哈喽&#xff0c;大家好&#xff0c;我是左手python&#xff01; Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库&#xff0c;用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

Linux简单的操作

ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序

一、开发环境准备 ​​工具安装​​&#xff1a; 下载安装DevEco Studio 4.0&#xff08;支持HarmonyOS 5&#xff09;配置HarmonyOS SDK 5.0确保Node.js版本≥14 ​​项目初始化​​&#xff1a; ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

【AI学习】三、AI算法中的向量

在人工智能&#xff08;AI&#xff09;算法中&#xff0c;向量&#xff08;Vector&#xff09;是一种将现实世界中的数据&#xff08;如图像、文本、音频等&#xff09;转化为计算机可处理的数值型特征表示的工具。它是连接人类认知&#xff08;如语义、视觉特征&#xff09;与…...

【HTTP三个基础问题】

面试官您好&#xff01;HTTP是超文本传输协议&#xff0c;是互联网上客户端和服务器之间传输超文本数据&#xff08;比如文字、图片、音频、视频等&#xff09;的核心协议&#xff0c;当前互联网应用最广泛的版本是HTTP1.1&#xff0c;它基于经典的C/S模型&#xff0c;也就是客…...

根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:

根据万维钢精英日课6的内容&#xff0c;使用AI&#xff08;2025&#xff09;可以参考以下方法&#xff1a; 四个洞见 模型已经比人聪明&#xff1a;以ChatGPT o3为代表的AI非常强大&#xff0c;能运用高级理论解释道理、引用最新学术论文&#xff0c;生成对顶尖科学家都有用的…...

GC1808高性能24位立体声音频ADC芯片解析

1. 芯片概述 GC1808是一款24位立体声音频模数转换器&#xff08;ADC&#xff09;&#xff0c;支持8kHz~96kHz采样率&#xff0c;集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器&#xff0c;适用于高保真音频采集场景。 2. 核心特性 高精度&#xff1a;24位分辨率&#xff0c…...

LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》

这段 Python 代码是一个完整的 知识库数据库操作模块&#xff0c;用于对本地知识库系统中的知识库进行增删改查&#xff08;CRUD&#xff09;操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 &#x1f4d8; 一、整体功能概述 该模块…...

C#中的CLR属性、依赖属性与附加属性

CLR属性的主要特征 封装性&#xff1a; 隐藏字段的实现细节 提供对字段的受控访问 访问控制&#xff1a; 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性&#xff1a; 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑&#xff1a; 可以…...

Java求职者面试指南:计算机基础与源码原理深度解析

Java求职者面试指南&#xff1a;计算机基础与源码原理深度解析 第一轮提问&#xff1a;基础概念问题 1. 请解释什么是进程和线程的区别&#xff1f; 面试官&#xff1a;进程是程序的一次执行过程&#xff0c;是系统进行资源分配和调度的基本单位&#xff1b;而线程是进程中的…...