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

这篇具有很好参考价值的文章主要介绍了使用预授权签名加速 BSV 有状态合约更新。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

状态更新竞争

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

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

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

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

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

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

图 2:竞争

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

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

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

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

不幸的是,这种方法不起作用,因为批量交易可以花费一个 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 树中来压缩状态,并且仅将树的根存储为智能合约中的状态。文章来源地址https://www.toymoban.com/news/detail-402071.html

到了这里,关于使用预授权签名加速 BSV 有状态合约更新的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Solidity合约中签名验证的一点实践

    在目前NFT概念国内外火爆的背景下,涌现了很多项目,特别是公链以太坊上,社区与新团队更是层出不穷,让人眼花缭乱。 而一个新项目上线的成功与否,往往与其社区支持力度息息相关。现在很多新项目方为了拥有更多的热度,人为的设置了白名单这个玩法和门槛,于是我

    2024年02月08日
    浏览(42)
  • 骗子骗术在升级,合约授权需谨慎!!!

    币圈还是那个币圈,而骗子已经不是当年的那一批骗子了,他们也在成长,他们的骗术也在升级。 今天就合约授权这个骗术,来聊聊骗子的套路。 其实这也分好几种情况: 1、钓鱼链接。 在我撸空投的那段日子,我就发现这种骗局。市面上大多数的空投是很难撸到的,可以

    2024年02月15日
    浏览(52)
  • solidity函数签名的实现-solidity实现智能合约教程(8)

    猛戳订阅学习专栏🍁🍁 👉 solidity系列合约源码+解析 👈 🍁🍁 函数选择器: solidity调用函数时,calldata的前4个字节为指定要调用的函数,这4个字节称为函数选择器。 以下面的代码为例。它通过地址addr的调用合约的transfer方法。 abi.encodeWithSignature(…)返回的前4个字节是函数

    2024年02月16日
    浏览(50)
  • 【自学笔记】在SQL Server中创建用户角色及授权(使用SQL语句)更新2023.07.06

    使用SSMS数据库管理工具创建用户登录,这个可视化操作比起用sql语句来创建是在是简单多了 登录数据库,在安全性→登录名(鼠标右击)→新建登录名 在弹出新建登录名窗口的“常规”中,输入登录名和密码,密码一定要设置复杂一点,要不然会报错, 如果想设置简单的密

    2024年02月12日
    浏览(50)
  • 关于web3.js中与交易发送、交易签名、智能合约函数调用相关api的理解

    web3.js中有一些与交易发送、签名、合约函数调用相关的api,初学者(如me)常常搞不清什么情况下应该调用哪个,以及它们之间的区别。现将个人浅见记录如下,备忘。 sendTransaction web3.eth.sendTransaction(transactionObject [, callback]) transactionObject对象设置交易的各种参数(不包括签名r,

    2023年04月09日
    浏览(123)
  • 智能合约漏洞:未被权限保护的状态变量

    智能合约新手 前几天浏览Solidity源代码发现一个有趣的现象,一个contract可以在状态变量中声明未被实现的其他contract,部署后通过setter改变状态变量的address,从而将代码逻辑添加到主contract中。 但是,如果状态变量的修改权限没有被保护,将导致该合约执行攻击者撰写的恶

    2023年04月09日
    浏览(30)
  • 【区块链技术开发】OpenZeppelin智能合约库:提高智能合约的安全性和可靠性,加速去中心化应用DApp的开发与部署。

    专栏:【区块链技术开发】 前期文章: 【区块链技术开发】使用Infura连接以太坊节点和OpenZeppelin库来构建安全、可靠的智能合约 【区块链技术开发】 Solidity使用Truffle Box工具实现预构建模板、自动化部署、创建智能合约示例代码 【区块链技术开发】 Solidity使用truffle工具创建

    2023年04月24日
    浏览(57)
  • WEB攻防-Java安全&JWT攻防&Swagger自动化&算法&签名&密匙&Druid未授权

    知识点: 1、Java安全-Druid监控-未授权访问信息泄漏 2、Java安全-Swagger接口-文档导入联动批量测试 2、Java安全-JWT令牌攻防-空算法未签名密匙提取 参考:https://developer.aliyun.com/article/1260382 Druid是阿里巴巴数据库事业部出品,为监控而生的数据库连接池。Druid提供的监控功能,监

    2024年02月04日
    浏览(40)
  • 安卓 APK 签名证书过期问题 及 更新签名方案 v3

    最近突然发现公司祖传的签名证书要过期了,急忙开始研究解决方案,在这里记录下我们采取的方式。 首先, 签名证书过期是没办法进行续期或者重新生成的 。而更换证书,那原来安装的 App 就必须要卸载后才能安装版本,而如果 App 已经上架应用市场,那么证书不一致的

    2024年02月03日
    浏览(38)
  • 百兆版UU加速盒加速switch下载红灯导致状态异常的解决方法

    最初的百兆版UU加速盒(黑色),有一个十分实用的功能,无线中继,中继已有的wifi,并发送出新wifi,并可以提供加速,但从去年开始,使用该加速盒给switch加速时,如果switch下载或者更新游戏,会导致加速盒状态灯变红(不可用),但稍后又会恢复正常,同样在给xbox加速

    2024年02月10日
    浏览(91)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包