bitcoin 通过脚本进行一段时间的资金冻结

该脚本的格式

  • scriptPubKey: < expiry time > OP_CHECKLOCKTIMEVERIFY OP_DROP OP_DUP OP_HASH160 < pubKeyHash > OP_EQUALVERIFY OP_CHECKSIG
  • scriptSig: < sig > < pubKey >
  • 允许一个交易的输出在未来某个时间之后才可以进行花费。即可以将资金锁定在未来的某个时间之后才可以使用。

程序的执行

操作码的执行

bool EvalScript(...){
    ...
    
    case OP_CHECKLOCKTIMEVERIFY: {
        //如果脚本的检测标识 没有启用该时间锁功能;
        if (!(flags & SCRIPT_VERIFY_CHECKLOCKTIMEVERIFY)) {
            // not enabled; treat as a NOP2  
            // 脚本检测标识是否也禁用该 操作码;如果是,退出报错
            if (flags &
                SCRIPT_VERIFY_DISCOURAGE_UPGRADABLE_NOPS) {
                return set_error(
                    serror,
                    SCRIPT_ERR_DISCOURAGE_UPGRADABLE_NOPS);
            }
            break;
        }
        //此时栈中应至少含有1项,锁定时间
        if (stack.size() < 1) {
            return set_error(serror, SCRIPT_ERR_INVALID_STACK_OPERATION);
        }
        //将栈顶项(锁定时间)转换为可比较的 类型
        const CScriptNum nLockTime(stacktop(-1), fRequireMinimal, 5);
        //当锁定时间小于0时,退出报错
        if (nLockTime < 0) {
            return set_error(serror, SCRIPT_ERR_NEGATIVE_LOCKTIME);
        }
        //检测该锁定时间是否合理
        if (!checker.CheckLockTime(nLockTime)) {
            return set_error(serror, SCRIPT_ERR_UNSATISFIED_LOCKTIME);
        }
        break;
    }
    ...
}

上述为脚本中包含OP_CHECKLOCKTIMEVERIFY 操作码时,执行的验证过程。

* 分别检测该功能是否启用;
* 此时栈上的数据量,因为此时栈中应至少含有脚本的锁定时间。
* 进行锁定时间的检测

时间的检测

bool TransactionSignatureChecker::CheckLockTime(const CScriptNum &nLockTime) const {
    // 此处为检测脚本的锁定时间应该与交易自身的时间戳在同一时间段(高度,或者时间); 
    if (!((txTo->nLockTime < LOCKTIME_THRESHOLD && nLockTime < LOCKTIME_THRESHOLD) ||
          (txTo->nLockTime >= LOCKTIME_THRESHOLD && nLockTime >= LOCKTIME_THRESHOLD))) {
        return false;
    }
    //当 脚本锁定时间大于交易时间时,标识该笔资金现在还处于冻结状态,不允许花费
    if (nLockTime > int64_t(txTo->nLockTime)) {
        return false;
    }
    //当该交易的nSequence字段为等于SEQUENCE_FINAL该值,该交易输入会被视为成熟,允许立即打包。这样就相当于绕过了脚本的时间锁定,不允许这样操做。
    //此处只检测指定的交易输入而不是所有的交易输入,是希望最大限度的减少数据量。
    if (CTxIn::SEQUENCE_FINAL == txTo->vin[nIn].nSequence) {
        return false;
    }
    //检测通过,该笔资金现在可以解冻。    
    return true;
}

上述为拿到脚本的锁定时间后进行的检测。

* 时间锁定分为两种:一种是基于区块高度的锁定,一种是基于时间的锁定;二者通过与 LOCKTIME_THRESHOLD 进行比较来区分;
    * 当小于LOCKTIME_THRESHOLD时,即为高度;否则为时间。
* 此时交易的时间戳应该与脚本的锁定时间处于同一 区间(高度或时间);否则无法进行比较,直接返回错误。
* 只有当交易的时间大于等于脚本时间时,该笔资金才会解冻;否则直接返回错误。
* 当该笔交易输入的 nSequence 字段 = SEQUENCE_FINAL该值时,相当于绕过了脚本的时间锁定,不允许这样做。

操作码的描述

OP_CHECKLOCKTIMEVERIFY : 如果栈顶项大于交易的时间戳字段,标识该交易无效,否则脚本继续执行。在以下几种情况时,同样标识脚本无效:

* 栈为空;
* 栈顶项为负数;
* 栈顶项大于等于LOCKTIME_THRESHOLD(500000000);而交易的时间戳小于LOCKTIME_THRESHOLD; 反之也无效。
* 交易输入的nSequence等于SEQUENCE_FINAL(0xffffffff).

OP_DROP : 移除栈顶项;

脚本的执行

未命名文件.png

本文由 Copernicus团队 姚永芯写作,转载无需授权。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,992评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,212评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,535评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,197评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,310评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,383评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,409评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,191评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,621评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,910评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,084评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,763评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,403评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,083评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,318评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,946评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,967评论 2 351

推荐阅读更多精彩内容

  • 一、快速术语检索 比特币地址:(例如:1DSrfJdB2AnWaFNgSbv3MZC2m74996JafV)由一串...
    不如假如阅读 15,913评论 4 87
  • 官网原文:本章原文 建议打开原版对照着英文版同时阅读。官网原文:在git上阅读 建议打开原版对照着英文版同时阅读。...
    阿龙学区块链阅读 1,044评论 0 2
  • 抛弃了你 我成了逃兵 在爱情的路上 我的心灵从此破碎支离 你恨我 你怨我 你要我给你理由 我不爱你 我要自由 这个...
    曾时获阅读 131评论 0 0
  • 九月是家里板栗开始成熟的时候,我把妈妈砸板栗的小视频发到我的一个好友群,分享一种来自从小对期待吃板栗的那种激动...
    喵豆味儿阅读 183评论 0 0
  • 第二篇产品体验分析报告,大概能摸清一篇产品报告怎么去写。但总感觉流露于产品表面东西太多,不能够侧重与深度分析,所以...
    时下人阅读 368评论 0 0