BTC-脚本-09

345 阅读3分钟
  • 比特币交易结构meta data

    "result": {
        "txid": "921a...dd24",
        "hash": "921a...dd24",
        "version": 1,
        "size": 226,
        "locktime": 0,
        "vin": [{
            "txid": "c0cb...c57b",
            "vout": 0,
            "scriptSig": {
                "asm": 3045...0018,
                "hex": 4830...0018
            },
        }],
        "vout": [{
            "value": 0.22684000,
            "n": 0,
            "scriptPubKey": {
                "asm": "DUP HASH160 628e...d743 EQUAILVERIFY CHECKSIG",
                "hex": 76a9...88ac,
                "reqSigs": 1,
                "type": "pubkeyhash",
                "address": ["19z8LJkNXLrTv2QK5jqTncJCGUEEfpQvSr"]
            }
        },{
            "value": 0.53756644,
            "n": 1,
            "scriptPubKey": {
                "asm": "DUP HASH160 da7d...2cd2 EQUAILVERIFY CHECKSIG",
                "hex": 76a9...88ac,
                "reqSigs": 1,
                "type": "pubkeyhash",
                "address": ["1LvGTpdyeVLcLCDK2m9f7Pbh7zwhs7NYhX"]
            }
        }],
        "blockhash": "0000000000000000002c510d...5c0b",
        "confirmations": 23,
        "time": 1530846727,
        "blocktime": 1530846727
    }
    
    • 交易结构元数据中各字段含义:
      • txid: 交易ID
      • hash: 当前交易的哈希
      • version: 比特币协议版本
      • size: 交易大小
      • locktime: 0-立即生效
      • vin: 交易输入(数组)
        • txid: 币的来源的交易哈希值
        • vout: 币的来源交易中的几个输出
        • scriptSig: 输入脚本(证明你有权利花这个钱,后文用input script代替)
      • vout: 交易输出(数组)
        • value: 输出金额(1比特币=10的8次方聪satoshi
        • n: 这个交易里的第几个输出
        • scriptPubKey: 输出脚本(后文用output script代替)
          • asm: 脚本内容(包含操作)
          • reqSigs: 该输出需要多少个签名才能兑现
          • type: 输出类型
          • address: 输出地址
      • blockhash: 当前交易所在区块的哈希
      • cnfirmation: 该交易已有多少个确认信息
      • time: 交易产生的时间
      • blocktime: 区块产生的时间
  • 输出输出脚本的几种形式:

    • P2PK (Pay to Public Key) 输出脚本里直接给出收款人的公钥
      • 输入输出脚本形式:
        • input script:
          1. PUSHDATA(Sig)
        • output script:
          1. PUSHDATA(PubKey)
          2. CHECKSIG
    • P2PKH (Pay to Public Key Hash) 输出脚本里并不直接给出收款人的公钥,给出的是公钥的哈希,输入脚本则既要给出签名,也要给出公钥
      • 输入输出脚本形式:
        • input script:
          1. PUSHDATA(Sig)
          2. PUSHDATA(PubKey)
        • output script:
          1. DUP
          2. HASH160
          3. PUSHDATA(PubKeyHash)
          4. EQUALVERIFY
          5. CHECKSIG
    • P2SH (Pay to Script Hash) 输出脚本给出的不是收款人的公钥的哈希,而是收款人提供的一个赎回脚本的哈希;将来花这个钱时输入脚本里要给出redeemScript(这个赎回脚本的具体内容),同时还要给出让赎回脚本能够正确运行所需要的签名
      • 输入输出脚本形式:
        • input script:
          1. ...
          2. PUSHDATA(Sig)
          3. ...
          4. PUSHDATA(serialized redeemScript)
        • output script:
          1. HASH160
          2. PUSHDATA(redeemScriptHash)
          3. EQUAL
      • 进一步说明:
        • input script要给出一些签名(数目不定)及一段序列化的redeemScript,验证分两步:
          1. 验证序列化的redeemScript是否与output script中的哈希值匹配
          2. 反序列化并执行redeemScript,验证input script中给出的签名是否正确
        • redeemScript的形式:
          • P2PK形式
          • P2PKH形式
          • 多重签名形式
      • 赎回脚本实例一:用P2SH实现P2PK
        • redeemScript:
          1. PUSHDATA(PubKey)
          2. CHECKSIG
        • input script:
          1. PUSHDATA(Sig)
          2. PUSHDATA(serialized redeemScript)
        • output script:
          1. HASH160
          2. PUSHDATA(redeemScriptHash)
          3. EQUAL
      • 赎回脚本实例二:用P2SH实现多重签名
        • redeemScript:
          1. M
          2. PUSHDATA(pubKey_1)
          3. PUSHDATA(pubKey_2)
          4. ...
          5. PUSHDATA(pubKey_N)
          6. N
          7. CHECKMULTISIG
        • input script:
          1. x
          2. PUSHDATA(Sig_1)
          3. PUSHDATA(Sig_2)
          4. ...
          5. PUSHDATA(Sig_M)
          6. PUSHDATA(serialized RedeemScript)
        • output script:
          1. HASH160
          2. PUSHDATA(redeemScriptHash)
          3. EQUAL
    • Proof of Burn 销毁比特币,如果有一个交易的输入指向这个输出,执行到return时都会返回错误,所以这个output再无法被花出去,其对应的UTXO也就可以被剪枝了,无需保存
      • output script:
        • RETURN
        • ... [zero or more ops or text]
      • 应用场景
        1. 有些小的币种要求销毁一定数量的比特币才能够得到这个币种(即AltCoin (Alternative coin))
        2. 往区块链里写入一些内容(return之后可以放永久保存的内容,比如知识产权的哈希值,既没有泄漏内容,也可用于日后纠纷时证明,证明你在某个时间点已经知道某个知识了)。这个场景和coinbase域相似,但coinbase的方法只有获得记账权的那个节点才能用