談到交易窑业,要明確三件事:參與者钦幔,交易內(nèi)容,交易格式
e.g. A,B把10比特幣轉(zhuǎn)給C,D
交易者:在比特幣里常柄,交易者被稱為輸入與輸出鲤氢,輸入對(duì)應(yīng)的是上一筆交易的輸出。
交易內(nèi)容:轉(zhuǎn)賬10比特幣
交易格式:全網(wǎng)需要對(duì)格式有統(tǒng)一的設(shè)計(jì)與解釋西潘,所謂共識(shí)
比特幣網(wǎng)絡(luò)中傳播的交易是一串序列化的字節(jié)流卷玉,稱為raw transaction
其格式如下:
解釋幾個(gè)容易疑惑的地方
nLockTime
鎖定時(shí)間,一個(gè)交易只有被鎖定了才能放入?yún)^(qū)塊中
字段解釋:0即總是鎖定中秸架;this. nLockTime<= 5 * 10 ^ 8揍庄,字段被解釋為區(qū)塊號(hào),否則解釋為Unix時(shí)間
鎖定條件:超過指定的區(qū)塊號(hào)或時(shí)間后东抹,該交易即被鎖定蚂子,可以打包入塊沃测。
該字段是否生效,受nSequence字段限制食茎,具體見下文:Final Transaction
hash
outpoint -> (hash, n) , hash = TxID
TxID = sha2(sha2(raw transaction))
raw transaction就是上面這個(gè)表的流化
TxID是32字節(jié)流蒂破,其在raw transaction中的順序和計(jì)算出來時(shí)存在內(nèi)存中的字節(jié)順序一致,叫internal byte order别渔,有人拿小端序來類比理解附迷。
VarInt (1-9bytes)
網(wǎng)絡(luò)傳輸數(shù)字編碼格式,用于減少傳輸帶寬哎媚,格式如下
簡(jiǎn)單說就是要編碼數(shù)字var喇伯,
var <= 252時(shí),var-encode = var
否則拨与,var-encode = 標(biāo)記(1 byte) + var的小端序表示
e.g. 0x21 -> 0x21稻据,0x0203 -> 0xfd0302 , 0x010203 -> 0xfe030201
這樣編碼的好處是:
1. 在傳輸字節(jié)數(shù)較少時(shí),可以減少帶寬
2. 可擴(kuò)展性強(qiáng)
Coinbase Transaction
三點(diǎn)注意:
1. hash 為全0买喧,n為全f捻悯;
2. 只有一個(gè)輸入輸出,輸出為挖礦獎(jiǎng)勵(lì)加交易費(fèi)之和
3. scriptSig字段比較特殊淤毛,如下
解釋下:
假設(shè)這個(gè)交易產(chǎn)生在高度為0x010203的塊里
blockHeightLen指出塊高度這個(gè)字段有幾個(gè)字節(jié)今缚,本例是3個(gè)字節(jié)
然后blockHeight字段是塊高度的小端序表示,本例為0x030201
arbitraryData字段咋用剩下的字節(jié)數(shù)低淡,里面的內(nèi)容自由發(fā)揮姓言,像中本聰那樣放段新聞。
可以通過改變這個(gè)字段來改變merkel root查牌,解決pow puzzel
Standard Transaction
一個(gè)交易是標(biāo)準(zhǔn)交易才可以被轉(zhuǎn)發(fā)和打包事期,其需滿足以下6個(gè)要求,注意跟蹤這些規(guī)則的實(shí)效性:
1. sizeof(one raw transaction) <= 10000Bytes
2. transaction version = 1, for now
3. TX is final纸颜,下面兩個(gè)只要滿足一個(gè)兽泣,該交易就是final的
1)nLockTime 已被滿足鎖定條件
2) ?All transaction inputs are final (即 nSequence = 0xffffffff).
4. 解鎖腳本限制
1) ?大小 <= 500 bytes. 可能要變成1650字節(jié)
2) ?only data push opcodes 0x00-0x60 are permitted.
3)?Canonical Pushes The scripting language allows to push data on the stack in different ways. This rule enforces that only data pushes intended for a particular data size are allowed.
(這個(gè)對(duì)大小的限制要看下代碼和https://en.bitcoin.it/wiki/Script)
5. 輸出限制
1)鎖定腳本的類型是標(biāo)準(zhǔn)類型,我會(huì)另開一篇詳細(xì)介紹腳本類型
2) 交易是Non-Dust Transaction
6. 一筆交易中Nulldata Transaction Count 至多一個(gè)
說下什么叫Non-Dust Transaction胁孙,計(jì)算公式如下
MinTxFeeRate:最小交易費(fèi) Satoshi/kB
TxOutSize:某個(gè)輸出的字節(jié)數(shù)
nValue:該輸出的交易輸出值
一句話:如果一筆交易中某個(gè)輸出的value低于這個(gè)輸出對(duì)應(yīng)的交易費(fèi)的三倍唠倦,那么這個(gè)交易就是dust transaction,說白了涮较,交易費(fèi)占的比例太高稠鼻;
該規(guī)則限制了每個(gè)輸出的最小value狂票,現(xiàn)在大概是546Satoshi候齿。
值得注意的是,該規(guī)則對(duì)Nulldata Transaction無效,因此Nulldata Transaction可以把value設(shè)為0
再說下什么是Nulldata Transaction
scriptPubkey: OP_RETURN [SMALLDATA]
scriptSig:
就是OP_RETURN慌盯,沒有收款人周霉,沒有解鎖腳本,不用遵守dust transaction亚皂,可以在SMALLDATA里攜帶任意字段俱箱,大小目前限制在210字節(jié)
一筆交易只允許有一個(gè)Nulldata?Transaction輸出,這樣是為了防止block blooding攻擊