交易是如何被創(chuàng)建和打包的5

上節(jié)介紹完交易是如何錢包里面進(jìn)行選幣的,這次我們來看下如何對(duì)交易進(jìn)行簽名。這節(jié)可能會(huì)長(zhǎng),這次盡量寫完。

接著上文我們知道,一筆交易的創(chuàng)建是需要進(jìn)行vin的填充和vout的構(gòu)造的。當(dāng)我們操作完畢后,我要對(duì)自己的交易里面的交易輸入進(jìn)行簽名操作,以證明該交易輸入填充進(jìn)的交易輸出是你的,你具有支配權(quán)。

循環(huán)遍歷交易對(duì)象里面的所有的vin,并對(duì)其進(jìn)行簽名操作。nIn變量,表示你由幾個(gè)交易輸入的索引。從這里就這個(gè)看到,你需要填充該筆交易的交易輸入有幾個(gè)。

從之前的講解我們知道,交易的構(gòu)建。這里不再贅述。

這個(gè)就是交易的簽名函數(shù),第三個(gè)參數(shù)就是用來接收簽名信息的。

從注釋可以知道,這是一個(gè)創(chuàng)建簽名的類,里面有一個(gè)純虛函數(shù)。

有類繼承于它,我們就是用的這個(gè)類,進(jìn)行對(duì)象的構(gòu)造。

構(gòu)造的函數(shù)的實(shí)現(xiàn),也很簡(jiǎn)單,我就不粘貼圖了,大家自己去看下吧。就是一些賦值操作而已。

現(xiàn)在開始介紹簽名函數(shù)。ProduceSignature();

txnouttype whichType;用來接收交易類型的對(duì)象。這個(gè)大家可以可以參照精通比特幣書籍去查找,在這不在贅述。

SignStep();函數(shù)就是對(duì)交易進(jìn)行簽名操作的第一步。

如果交易類型是TX_SCRIPTHASH(當(dāng)時(shí)腳本哈希時(shí),scriptSig是救贖腳本,還需在解析一次,最后還要把子腳本的下標(biāo)序列化進(jìn)簽名),看到,if里面又做了一次賦值操作的。

做完這些之后,就是測(cè)試解。VerifyScript();函數(shù),這個(gè)先放一下,先把簽名搞完。

來看這個(gè)SignStep()函數(shù)。

先把用來接收簽名的信息的對(duì)象進(jìn)行清空操作。然后調(diào)用Sovler();進(jìn)行求解操作,主要是接觸上一筆交易的交易類型和解信息。這個(gè)順帶說一下,這個(gè)解信息用處很大,用來就可以做地址索引了。一個(gè)地址接收和花費(fèi)的金額,都可以用它來做,來看下這個(gè)函數(shù)。(這個(gè)函數(shù)一次粘不全,一點(diǎn)一點(diǎn)進(jìn)行講解)

CKeyID keyID;這個(gè)類繼承于uint160哈希,就是用來表示20個(gè)字節(jié)的地址的。

首先是一個(gè)向量模板對(duì)象,如果該向是空的,就對(duì)它進(jìn)行賦值操作,有三種格式。然后清空用來接收解的對(duì)象。

注釋一些,不在解釋。

然后遍歷模板對(duì)象里面的腳本操作符,然后根據(jù)相應(yīng)的腳本操作符進(jìn)行賦值操作,有條件的建議自己去追蹤一下交易,這樣印象就更加深刻。如果這個(gè)都沒解出,解為空,交易類型就是TX_NONSTANDARD類型。(圖不清晰的話,大家自己去看下源碼,沒辦法啊)

然后就是根據(jù)你解出的交易類型,進(jìn)行switch,對(duì)號(hào)入座操作了。公鑰和空,非標(biāo)準(zhǔn)的就不解讀了。

剩下的就是公鑰哈希類型,腳本哈希和多重簽名了。我們挑一個(gè)最常見的公鑰哈希來講。

首先進(jìn)行賦值操作,先把地址拿到,然后調(diào)用signl()函數(shù)進(jìn)行簽名,然后根據(jù)地址找對(duì)應(yīng)的私鑰對(duì)象,再由該私鑰對(duì)象獲取一個(gè)公鑰,最后把公鑰序列化進(jìn)簽名信息,不知道大家發(fā)現(xiàn)過沒有。

標(biāo)注的就是簽名信息,這個(gè)由一部分是可以找到序列化的公鑰的。

解析十六進(jìn)制的序列化腳本就可以看到的,也間接的證明,我的解釋是正確的。

下面直接看signl();

又回到開篇的第二個(gè)類上面了,沒錯(cuò),就是由它進(jìn)行創(chuàng)建的簽名的。函數(shù)調(diào)用成功后在賦值給我們一直傳遞的對(duì)象,接著往下看創(chuàng)建函數(shù)。因?yàn)槭羌兲摵瘮?shù),這里就直接寫子類的實(shí)現(xiàn)函數(shù)了。

由沒有很熟悉啊,這里就是菜神給我們講過的公鑰和私鑰的生成部分,所有的簽名都是私鑰生成的。哈哈,寫的差不多了,就不寫腳本檢測(cè)的那一塊了,留著下節(jié)寫啦。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 欠你一個(gè)擁抱
    你說我懂閱讀 253評(píng)論 0 0
  • 圖&文|半山煙雨 看到一棵繁花滿枝的樹,只會(huì)贊嘆,倘若延綿數(shù)里的繁花展現(xiàn),剩下的唯有驚艷了。花開花落又一年,每年的...
    半山煙雨閱讀 681評(píng)論 3 5
  • 【知-學(xué)習(xí)】 1.《增廣賢文全集》誦讀5分鐘。 2.《六項(xiàng)精進(jìn)》大綱誦讀1遍。 【經(jīng)典名句分享】 只有十年如一日把...
    玉_蓮子閱讀 157評(píng)論 0 0

友情鏈接更多精彩內(nèi)容