IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 区块链 -> 基于 sCrypt 智能合约的非托管比特币保险库 -> 正文阅读

[区块链]基于 sCrypt 智能合约的非托管比特币保险库

我们开发了一个基于智能合约的比特币保险库,其中锁定的比特币只能在延迟用户定义的时间后转移。

在这里插入图片描述

密钥盗窃是困扰比特币用户的一个主要问题。一种保护比特币的方法是将它们存储在不允许即时取款的保险库中。要花费保险库中比特币,需要两个连续的步骤。

  1. 通过第一笔交易发出将硬币移出金库的请求,这称为出库 (unvault)
  2. 等待预定义的时间, 称为出库期 (unvaulting),比如在第一笔交易入块后 24 小时,然后硬币可以在后续交易中移出。

这两个步骤都使用称为保险库密钥的密钥。另一个称为恢复密钥的密钥可以在 24 小时内阻止第二笔交易,以防保险库密钥被盗。通常,保险库密钥存储在热钱包中,而恢复密钥存储在冷钱包中。

实现

基于相对时间锁定,我们开发了以下保险库合约。

import "blockchain.scrypt";

contract Vault {
    // time to wait before the money in the vault can be spent after unvaulted, using the vault key
    int unvaultingPeriod;
    // vault key, typically stored in a hot wallet
    PubKey vaultKey;
    // recovery key, typically stored in a cold wallet
    PubKey recoveryKey;
    // maximal target for any block to be considered valid
    int blockchainTarget;

    // initialized to false
    @state
    bool unvaulted;

    // step 1
    public function unvault(Sig sig, SigHashPreimage txPreimage) {
        require(checkSig(sig, this.vaultKey));

        require(!this.unvaulted);
        this.unvaulted = true;

        bytes outputScript = this.getStateScript();
        bytes output = Utils.buildOutput(outputScript, SigHash.value(txPreimage));
        require(hash256(output) == SigHash.hashOutputs(txPreimage));
    }

    // step 2
    public function withdraw(Sig sig, BlockHeader utxoBh, BlockHeader latestBh, MerkleProof merkleproof, SigHashPreimage txPreimage) {
        require(this.unvaulted);
        require(checkSig(sig, this.vaultKey));

        // ensure UTXO has been locked long enough
        this.validateHelper(utxoBh, latestBh, merkleproof, txPreimage);
        // enough time has elapsed since being unvaulted
        require(latestBh.time - utxoBh.time >= this.unvaultingPeriod);
    }

    // cancel if vault key is stolen
    public function cancel(Sig sig) {
        require(checkSig(sig, this.recoveryKey));
    }
}

首先,通过在交易来调用的第 18unvault() 来出库锁定在合约中的硬币。它在 22 行将出库状态 unvaultedfalse 设置为 true,并在 2426传播状态。如果一切顺利,在第一笔交易入块后,等待超过预设的出库期 (unvaulting) 后,通过调用 30 行的 withdraw() 来提取硬币。第 35-37 行和以前一样使用相对时间锁。如果在此期间检测到盗窃企图,则恢复密钥可以撤消交易并将硬币移动其他地方,见 41 行。

讨论

  • 我们开发了一个延时提款的比特币保险库。与受信任的第三方(如 Coinbase)提供的保险库相比,它是非托管的。
  • 它不需要任何共识更改或新的操作码,例如 BIP 119 中的 OP_CheckTemplateVerify 或 比特币契约 中的 OP_CheckOutputVerify

可以添加其他措施以使保险库更加安全,例如白名单或支出限制。将这个方法应用到 Token 上也很简单。

[1] : 将其扩展为持有 Token 也很简单。有一些方法可以在不运行完整节点的情况下执行此操作,例如 mAPI 中的实时通知。

  区块链 最新文章
盘点具备盈利潜力的几大加密板块,以及潜在
阅读笔记|让区块空间成为商品,打造Web3云
区块链1.0-比特币的数据结构
Team Finance被黑分析|黑客自建Token“瞒天
区块链≠绿色?波卡或成 Web3“生态环保”标
期货从入门到高深之手动交易系列D1课
以太坊基础---区块验证
进入以太坊合并的五个数字
经典同态加密算法Paillier解读 - 原理、实现
IPFS/Filecoin学习知识科普(四)
上一篇文章      下一篇文章      查看所有文章
加:2022-01-12 00:02:42  更:2022-01-12 00:04:01 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 1:31:35-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码