上節(jié)介紹完交易是如何錢包里面進行選幣的苦囱,這次我們來看下如何對交易進行簽名。這節(jié)可能會長脾猛,這次盡量寫完撕彤。
接著上文我們知道,一筆交易的創(chuàng)建是需要進行vin的填充和vout的構(gòu)造的猛拴。當我們操作完畢后羹铅,我要對自己的交易里面的交易輸入進行簽名操作蚀狰,以證明該交易輸入填充進的交易輸出是你的,你具有支配權(quán)职员。
循環(huán)遍歷交易對象里面的所有的vin,并對其進行簽名操作麻蹋。nIn變量,表示你由幾個交易輸入的索引廉邑。從這里就這個看到哥蔚,你需要填充該筆交易的交易輸入有幾個。
從之前的講解我們知道蛛蒙,交易的構(gòu)建糙箍。這里不再贅述。
這個就是交易的簽名函數(shù)牵祟,第三個參數(shù)就是用來接收簽名信息的深夯。
從注釋可以知道,這是一個創(chuàng)建簽名的類诺苹,里面有一個純虛函數(shù)咕晋。
有類繼承于它,我們就是用的這個類收奔,進行對象的構(gòu)造掌呜。
構(gòu)造的函數(shù)的實現(xiàn),也很簡單坪哄,我就不粘貼圖了质蕉,大家自己去看下吧。就是一些賦值操作而已翩肌。
現(xiàn)在開始介紹簽名函數(shù)模暗。ProduceSignature();
txnouttype whichType;用來接收交易類型的對象。這個大家可以可以參照精通比特幣書籍去查找念祭,在這不在贅述兑宇。
SignStep();函數(shù)就是對交易進行簽名操作的第一步。
如果交易類型是TX_SCRIPTHASH(當時腳本哈希時粱坤,scriptSig是救贖腳本隶糕,還需在解析一次,最后還要把子腳本的下標序列化進簽名)站玄,看到枚驻,if里面又做了一次賦值操作的。
做完這些之后蜒什,就是測試解测秸。VerifyScript();函數(shù),這個先放一下,先把簽名搞完霎冯。
來看這個SignStep()函數(shù)铃拇。
先把用來接收簽名的信息的對象進行清空操作。然后調(diào)用Sovler()沈撞;進行求解操作慷荔,主要是接觸上一筆交易的交易類型和解信息。這個順帶說一下缠俺,這個解信息用處很大显晶,用來就可以做地址索引了。一個地址接收和花費的金額壹士,都可以用它來做磷雇,來看下這個函數(shù)。(這個函數(shù)一次粘不全躏救,一點一點進行講解)
CKeyID keyID;這個類繼承于uint160哈希唯笙,就是用來表示20個字節(jié)的地址的。
首先是一個向量模板對象盒使,如果該向是空的崩掘,就對它進行賦值操作,有三種格式少办。然后清空用來接收解的對象苞慢。
注釋一些,不在解釋英妓。
然后遍歷模板對象里面的腳本操作符挽放,然后根據(jù)相應(yīng)的腳本操作符進行賦值操作,有條件的建議自己去追蹤一下交易鞋拟,這樣印象就更加深刻骂维。如果這個都沒解出惹资,解為空贺纲,交易類型就是TX_NONSTANDARD類型。(圖不清晰的話褪测,大家自己去看下源碼猴誊,沒辦法啊)
然后就是根據(jù)你解出的交易類型,進行switch侮措,對號入座操作了懈叹。公鑰和空,非標準的就不解讀了分扎。
剩下的就是公鑰哈希類型澄成,腳本哈希和多重簽名了。我們挑一個最常見的公鑰哈希來講。
首先進行賦值操作墨状,先把地址拿到卫漫,然后調(diào)用signl()函數(shù)進行簽名,然后根據(jù)地址找對應(yīng)的私鑰對象肾砂,再由該私鑰對象獲取一個公鑰列赎,最后把公鑰序列化進簽名信息,不知道大家發(fā)現(xiàn)過沒有镐确。
標注的就是簽名信息包吝,這個由一部分是可以找到序列化的公鑰的。
解析十六進制的序列化腳本就可以看到的源葫,也間接的證明诗越,我的解釋是正確的。
下面直接看signl();
又回到開篇的第二個類上面了息堂,沒錯掺喻,就是由它進行創(chuàng)建的簽名的。函數(shù)調(diào)用成功后在賦值給我們一直傳遞的對象储矩,接著往下看創(chuàng)建函數(shù)感耙。因為是純虛函數(shù),這里就直接寫子類的實現(xiàn)函數(shù)了持隧。
由沒有很熟悉啊即硼,這里就是菜神給我們講過的公鑰和私鑰的生成部分,所有的簽名都是私鑰生成的屡拨。哈哈只酥,寫的差不多了,就不寫腳本檢測的那一塊了呀狼,留著下節(jié)寫啦裂允。