使用预授权签名加速 BSV 有状态合约更新

news2025/2/26 4:38:40

状态更新竞争

BSV 智能合约将状态存储在交易链的输出中。 当交易花费包含旧状态的输出并创建包含新状态的输出时,就会发生状态转换。 在任何给定时间,交易链末端的单个输出/UTXO 都具有最新状态。

当多个事务竞争同时更新共享状态时,就会出现问题。要了解原因,让我们考虑一个简单的类似 ERC-20 的 Token 智能合约,具有以下状态¹:

在这里插入图片描述

图 1:可替代 Token 合约的状态

状态记录每个用户拥有多少 Token。 假设 Alice 发送一笔交易将 5 个 Token 转移给 Charlie,将状态更新为 state3A,而 Bob 发送另一笔交易同时将 10 个 Token 转给 Dave,将其更新为 state3B。 其中一个交易将失败,因为它们双花包含 state2 的单个 UTXO。

在这里插入图片描述

图 2:竞争

假设 Bob 的交易失败。 他必须创建一个新的交易,花费新的 state3A 状态的UTXO ,而不是 state2 状态的UTXO,然后重试。 不难看出,当有很多用户几乎同时尝试更新时,一个更新事务可能需要多次尝试才能成功,造成不可预知的延迟和降低用户体验。

在这里插入图片描述

为了避免争用,一种简单的方法是将所有更新交易发送给一个称为排序器的中间协调器,后者对它们进行排序并将它们广播到区块链。

在这里插入图片描述

不幸的是,这种方法不起作用,因为批量交易可以花费一个 UTXO,就像图 2 中 Alice 和 Bob 的交易一样。 当排序器将它们在链中按顺序重新排序以避免如图 3 所示的双重花费时,Bob 的原始交易, state3B, 中的签名变得无效。 如果排序器必须在每次交易重新排序时都要求用户重新签名,那么将再次出现不可预测的延迟,我们又回到了原点。

预授权签名

签名用于预授权对状态的更新。我们需要一种方法来签署每个交易,即使排序器通过更改其输入重新排序它也不会失效。但是没有一个 SIGHASH 标志允许我们这样做。

受我们之前模拟 SIGHASH_NOINPUT 工作方案的启发,该方案不包括从签名中花费的输入,我们只对包含有关授权操作的特定详细信息的消息进行签名。

在我们的 Token 合约中,我们只签署接收者和金额。例如,Alice 将签署授权将 5 个 Token 转移给 Charlie。

+ import "ec.scrypt";

// a basic ERC20-like fungible token
contract ERC20 {
    PubKey minter;

    @state
    HashedMap<PubKey, int> balances;
    
    // transfer tokens from sender to receiver
    public function transferFrom(PubKey sender, PubKey receiver, int amount, Sig senderSig, int senderBalance, int senderKeyIndex, int receiverBalance, int receiverKeyIndex, SigHashPreimage preimage) {
        // authenticate
-       require(checkSig(senderSig, sender));
        
+       bytes msg = receiver + pack(amount);
+       // check signature against the new message
+       require(EC.verifySig(msg, sig, sender));
具有预授权签名的 ERC20 合约

有了 Alice 的签名,包括排序器在内的任何人都可以创建一个交易,将 5 个 Token 从 Alice 转移到 Charlie。 攻击者无法通过将转账重定向给他或更改转账金额来窃取,这将使 Alice 的签名无效。

在这种方法中,排序器可以尽可能快地更新状态,因为他可以创建交易,使用商业化硬件每秒可以处理数百万笔交易。他不再因等待用户重新签署重新排序的交易而受阻。

此外,尽管创建交易是链下顺序的,这非常容易和快速,但由于 BSV 的 UTXO 模型,矿工可以并行处理其中的智能合约。

重放攻击

请注意,只要提供有效的签名,令牌就可以转移。 Alice 的签名消息中没有任何内容可以防止重复使用相同的签名。

Bob(实际上是任何人)都可以重复使用相同的签名并向自己发送来自 Alice 的另外 5 个令牌。他甚至可以重复多次,直到 Alice 的余额耗尽。

为了对抗重放攻击,我们可以使用应用程序级的随机数。 “Nonce”是密码学中“使用一次的数字”的简写。我们可以为每个签名使用一个 nonce,并将下一个 nonce 存储在合约中。


+ struct Value {
+   int balance;
+   int nonce;
+ }

// a basic ERC20-like fungible token
contract ERC20 {
    PubKey minter;

    @state
-   HashedMap<PubKey, int> balances;
+   HashedMap<PubKey, Value> balances;
    
    // transfer tokens from sender to receiver
    public function transferFrom(PubKey sender, PubKey receiver, int amount, Sig senderSig, int senderBalance, int senderNonce, int senderKeyIndex, int receiverBalance, int receiverKeyIndex, SigHashPreimage preimage) {
        // authenticate
-      bytes msg = receiver + pack(amount);
+      bytes msg = receiver + pack(amount) + pack(senderNonce);
       // check signature against the new message
       require(EC.verifySig(msg, sig, sender));

-       require(this.balances.canGet(sender, senderBalance, sendererKeyIndex));
+       require(this.balances.canGet(sender, {senderBalance, senderNonce}, sendererKeyIndex));
        require(senderBalance >= amount);
-       require(this.balances.set(sender, senderBalance - amount, senderKeyIndex));
+       require(this.balances.set(sender, {senderBalance - amount, ++senderNonce}, senderKeyIndex));

合约级别

如果两个合约使用相同的消息编码(例如,有另一个可替代的 Token 合约),一个合约使用的签名也可能对另一个有效,即使是 nonce。我们需要一些关于合约的识别信息来防止这种类型的重放攻击。

我们规定,在这样的有状态合约中使用的任何公钥/地址都不能在其他合约中重用。这与为每个新的 BSV 交易生成一个新地址的标准做法是一致的。

抗审查

如果排序器审查用户的交易,用户总是可以直接将其提交给链上的有状态合约。

给定的有状态合约也可以有多个排序器,如果一个人拒绝处理他的交易,用户可以提交给替代排序器。这些排序器可以在矿工网络之外的覆盖网络中进行协调。在访问最新状态时,可以采用标准调度技术(如轮询)来解决它们之间的竞争。


[1] 可以通过将每个表条目存储在 Merkle 树中来压缩状态,并且仅将树的根存储为智能合约中的状态。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/105516.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Anchor2

Anchor也是第二季了~~ 来一起来学习Faster R-CNN中的RPN及Anchor 说到RPN和Anchor&#xff0c;应该立马就能想到Faster R-CNN网络框架 首先我先将几类经典的目标检测网络做一个对比&#xff0c;然后开始说说今天要讲的知识。 最开始出现的是R-CNN&#xff0c;如下图&#xff…

什么是编程?程序员主要做啥工作?如何学习呢?

对编程的理解 编程换成通俗的语言可以理解为使用一些英文单词组成的指令发送给计算机&#xff0c;做指定的事情。 编程的种类 如今在互联网市场中&#xff0c;编程的工作一共分为了3大类&#xff1a; 前端编程 后台编程 运维编程 前端编程&#xff1a; 什么是前端&#…

门诊地图导航怎么做,零成本的医院室内导航解决方案

现在很多医院都比较大&#xff0c;科室众多&#xff0c;往往让人不知道要找的科室在哪里&#xff0c;不了解看病的流程&#xff0c;只能去咨询台询问&#xff0c;费时又费力……电子地图作为大家最喜闻乐见的高效应用形式&#xff0c;可高效为病患提供导医服务&#xff0c;并为…

XML介绍和基本用法(一文彻底搞懂XML!)

文章目录1.XML1.1概述1.2标签的规则1.3语法规则1.4xml解析1.5DTD约束1.6schema约束1.XML 1.1概述 万维网联盟(W3C) 万维网联盟(W3C)创建于1994年&#xff0c;又称W3C理事会。1994年10月在麻省理工学院计算机科学实验室成立。 建立者&#xff1a; Tim Berners-Lee (蒂姆伯纳斯李…

智能图像水位识别监测 基于OpenCv

智能图像水位识别监测利用OpenCVyolo网络学习模型对河道江河湖泊等区域进行实时监测&#xff0c;当监测到水位刻度尺超标时立即抓拍。OpenCV的全称是Open Source Computer Vision Library&#xff0c;是一个跨平台的计算机视觉处理开源软件库&#xff0c;支持与计算机视觉和机器…

【Linux】编辑器的天花板vim

​&#x1f320; 作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《学会Linux》 &#x1f387; 座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录&#x1f449;前言&…

14.SpringAop

1. Aop简介 AOP(Aspect Oriented Programming)面向切面编程&#xff0c;一种编程范式&#xff0c;指导开发者如何组织程序结构 OOP(Object Oriented Programming)面向对象编程 作用&#xff1a;在不惊动原始设计的基础上为其进行功能增强。简单的说就是在不改变方法源代码的基…

C语言必背18个经典程序

1、/*输出9*9口诀。共9行9列&#xff0c;i控制行&#xff0c;j控制列。*/ #include "stdio.h" main() {int i,j,result;for(i1;i<10;i){for(j1;j<10;j){resulti*j;printf("%d*%d%-3d",i,j,result);/*-3d表示左对齐&#xff0c;占3位*/}printf("…

数字化转型必读书籍:27个案例让小白也能搞懂以中台战略主导的数字化转型产品建设

各位茶馆的读者朋友们大家好&#xff0c;一转眼《中台产品经理宝典》一书已经上市了2年半&#xff0c;在这期间创造了近2万册的销售记录&#xff0c;并多次冲上各大网站的销售记录。 就在今年双十一还创造了当当网细分类目销量第71名的成绩&#xff0c;这对一本已经出版了2年半…

LeetCode题解 15 (5,96) 最长回文子串,不同的二叉搜索树

文章目录最长回文子串代码解答&#xff1a;不同的二叉搜索树代码解答&#xff1a;最长回文子串 首先我们应该先了解什么是回文子串: 单个字符 例如 a 这也是回文字符串 2个字符 aa 或者 bb 这也是回文字符串 3个字符 aba 或者 bab 多个字符 abba ababa 这些也被叫做回文子串 从…

【源码透视】SpringBoot的SPI机制

一、从java类加载机制说起 java中的类加载器负载加载来自文件系统、网络或者其他来源的类文件。jvm的类加载器默认使用的是双亲委派模式。三种默认的类加载器Bootstrap ClassLoader、Extension ClassLoader和System ClassLoader&#xff08;Application ClassLoader&#xff09…

开源项目 Spartacus 的 git 提交流程规范

Spartacus 开源项目由一组库组成。为了更容易知道哪个版本的库与另一个版本兼容&#xff0c;库版本在所有包中同步。 这意味着当我们要发布 1.5.0 版本时&#xff0c;我们会发布该版本下的所有库&#xff0c;即使某些库与上一个版本相比没有任何变化。 这样一来&#xff0c;我们…

NKOJ P5676 SuperGCD【超级GCD】

为什么NKOJ的题交JAVA会被keyword卡System&#xff0c;还不能用python水高精度…… 题目分析 回归正题&#xff0c;由于本题数据范围0≤A,B≤10100000 \le A,B \le 10^{10000}0≤A,B≤1010000两个100001000010000位的整数算GCD,所以用高精度欧几里得GCD的话会使得算法时间复杂…

数据治理工程师必备证书DAMA-CDGA/CDGP,含金量高

DAMA认证为数据管理专业人士提供职业目标晋升规划&#xff0c;彰显了职业发展里程碑及发展阶梯定义&#xff0c;帮助数据管理从业人士获得企业数字化转型战略下的必备职业能力&#xff0c;促进开展工作实践应用及实际问题解决&#xff0c;形成企业所需的新数字经济下的核心职业…

Nacos的Java SDK

配置管理 在界面上添加配置 我们在界面上新建了一个json类型的配置 使用SDK来获取配置 public String getConfig(String dataId, String group, long timeoutMs) throws NacosException名称类型描述dataIdstring配置 ID&#xff0c;采用类似 package.class&#xff08;如com…

10分钟vue初步入门

基础原理 使用vue开发&#xff0c;对于新手需要了解的两个关键点是 MVVM MVC模式变化而来&#xff0c;相对于MVC强调控制-模型-视图的责任分离之外&#xff0c;最大的特点就是引入ViewModel&#xff0c;支持双向绑定 比如你改变一个输入框 Input 标签的值&#xff0c;会自动…

仓库管理系统GreaterWMS的安装

本文是应网友 ubuntu 和 Nathan 要求写的&#xff1b;因为看起来 Nathan 比较着急&#xff0c;就突击了一下&#xff0c;因为时间仓促&#xff0c;错误在所难免&#xff0c;敬请谅解~ 什么是 GreaterWMS &#xff1f; GreaterWMS是完全开源的仓库管理系统。该库存管理系统是目前…

心脏病_冠心病智能预测模型(人工智能,机器学习,用于论文作业_专利_企业建模__项目申报_科研报告,收藏)

作者Toby&#xff0c;来自心脏病_冠心病智能预测模型 ​ 心脏病&#xff08;heart disease&#xff09;是心脏疾病的总称&#xff0c;包括风湿性心脏病、先天性心脏病、高血压性心脏病、冠心病、心肌炎等各种心脏病。 人体“发动机” 心脏是一个强壮的、不知疲倦、努力工作的…

更适合运动的耳机,设计时尚轻巧好用,南卡Runner CC3上手

很多喜欢健身的朋友&#xff0c;在锻炼的时候都会戴上一副耳机&#xff0c;这样可以在音乐的节奏中享受运动的乐趣。在运动耳机当中&#xff0c;骨传导耳机是这两年很受欢迎的一种类型&#xff0c;相比于更常见的真无线耳机&#xff0c;骨传导耳机因为特殊的发声方式&#xff0…

品优购项目-头部底端和整个页面底端制作

品优购项目(二) 3). nav 制作 nav 盒子通栏有高度 而且有个下边框1号盒子 左侧浮动 dorpdown 下拉导航 里面包含 dt dd2号盒子右侧浮动 navitems 导航栏组 11. logo 优化 logo 里面 首先放一个 h1 标签 &#xff0c;目的是为了提权&#xff0c;告诉搜索引擎&#xff0c;这个地方…