上節(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é)寫啦。