Sawtooth Lake學(xué)習(xí)筆記(四)

二、交易和批次

通過創(chuàng)建和應(yīng)用交易來對(duì)狀態(tài)進(jìn)行修改心例∠瑁客戶創(chuàng)建一個(gè)交易并發(fā)送給驗(yàn)證組件。驗(yàn)證組件應(yīng)用該交易止后,從而狀態(tài)改變瞎惫。

交易往往都打包進(jìn)一個(gè)批次。一個(gè)批次里的所有交易要么一起被遞交译株,要么都不遞交瓜喇。所以,批次是引發(fā)狀態(tài)變化的最小單位歉糜。

交易批次的整體結(jié)構(gòu)包括批次乘寒、批次頭、交易和交易頭匪补。

1.?交易數(shù)據(jù)結(jié)構(gòu)

交易采用Protocol Buffers來序列化伞辛。它包括數(shù)值字節(jié)和字符串烂翰,兩種信息類型。

在交易(Transaction)里存放三部分信息蚤氏,分別是標(biāo)頭內(nèi)容(header)甘耿、標(biāo)頭簽名(header_signature)、負(fù)載信息(payload)竿滨。其中標(biāo)頭內(nèi)容是序列化的交易頭文件佳恬。

在交易頭文件(TransactionHeader)里,存放十項(xiàng)信息:分別是批次公鑰(batcher_public_key),依賴條件(dependences)于游,家族名稱(family_name)毁葱,家族版本(family_version),輸入(inputs)贰剥,隨機(jī)數(shù)(nonce)倾剿,輸出(outputs),加密負(fù)載信息(payload_encoding)鸠澈,負(fù)載信息哈希值(payload_sha512)柱告,簽名者公鑰(signer_public_key)。

1.1?交易頭笑陈,簽名际度,公鑰

交易(Transaction)的標(biāo)頭內(nèi)容(header)存放的是一個(gè)序列化的交易頭文件(TransactionHeader)。標(biāo)頭內(nèi)容(header)被交易發(fā)起者用私鑰進(jìn)行簽名(私鑰不會(huì)隨同交易發(fā)送)涵妥,完成的簽名被存放在交易(Transaction)中的header_signature乖菱。標(biāo)頭內(nèi)容(header)以序列化的字節(jié)形式呈現(xiàn),這樣就可以通過交易回執(zhí)上的簽名來驗(yàn)證它蓬网。

在交易頭文件(TransactionHeader)里:

? ? ? ?(1)驗(yàn)證處理(程序)將用signer_public_key里的公鑰來對(duì)標(biāo)頭字符進(jìn)行簽名并存放結(jié)果到交易(Transaction)的標(biāo)頭簽名(header_signature)窒所。

? ? ? ?(2)batcher_public_key區(qū)域必須和用來對(duì)該交易所在的批次進(jìn)行簽名的公鑰相匹配。

? ? ? ? (3)交易完成后的序列化文件使用交易執(zhí)行者的私鑰(橢圓曲線加密)來簽名帆锋。

驗(yàn)證組件接受標(biāo)準(zhǔn)化的64字節(jié)壓縮簽名吵取,這是簽名的R部分和S部分的結(jié)合體。一些資料庫會(huì)包含一個(gè)額外的頭字節(jié)锯厢,可恢復(fù)的身份域皮官,或提供DER加密簽名。鋸齒湖拒絕任何非64字節(jié)的簽名实辑。

注意:橢圓曲線簽名必須采用“l(fā)ow S”形式(即“l(fā)ow S”簽名)捺氢。也就是說這里的橢圓曲線簽名必須計(jì)算(R,S)和(R,N-S),此處的N是secp256k1曲線的階剪撬。有效的簽名是在(S,N-S)中取最小值摄乒。否則,鋸齒湖將拒絕交易簽名。Python3的鋸齒湖SDK和來自于比特幣的橢圓曲線加密資料庫的不存在以上問題馍佑。如果使用如mbed TLS和openSSL的資料庫详炬,就不是采用以上標(biāo)準(zhǔn)化簽名方法礁叔。

提示:因?yàn)榘l(fā)送交易者生成的原始的頭字節(jié)將被用于驗(yàn)證簽名著觉。所以纠俭,最好采用原始的頭字節(jié)來做驗(yàn)證,而不是先反序列化到一個(gè)對(duì)象(例如一個(gè)python對(duì)象)穷劈,然后再序列化成字節(jié)。因?yàn)樾蛄谢倪^程會(huì)受到編程語言和資料庫的影響踊沸,導(dǎo)致序列化后的結(jié)果與原來的簽名不匹配歇终。

1.2?交易家族

在鋸齒湖里,交易家族是指一個(gè)可擴(kuò)展體系逼龟,它制定了一組可行的交易集合评凝。制定和實(shí)施一個(gè)新的交易家族將添加現(xiàn)有可用交易的分類。比如說腺律,在應(yīng)用開發(fā)者指南中將介紹如何寫自己的交易家族奕短。我們制定了一個(gè)名叫“XO“的交易家族,它制定了一系列玩“石頭剪刀布“的交易匀钧。

除了交易家族的名稱(family_name)翎碑,每個(gè)交易還會(huì)制定家族版本信息(family_version)。借助版本信息之斯,可以協(xié)調(diào)網(wǎng)絡(luò)中所有節(jié)點(diǎn)共同升級(jí)某個(gè)交易家族日杈。

1.3?依賴條件、輸入和輸出地址

由于一個(gè)交易可能基于其他交易之上佑刷,所以它必須等那些它依賴的交易執(zhí)行完畢后再執(zhí)行莉擒。

交易中的依賴條件區(qū)域會(huì)明確說明必須先執(zhí)行的依賴交易。明確的依賴條件將有利于那些存在依賴關(guān)系但又無法放在同一個(gè)批次里執(zhí)行的交易(比如說這些互相依賴的交易是在不同時(shí)間段里發(fā)送的)瘫絮。

為協(xié)助并行處理涨冀,一個(gè)交易的輸入和輸出區(qū)域里包含了狀態(tài)地址。通過與狀態(tài)交互麦萤,計(jì)劃器決定了交易與交易之間明確的依賴關(guān)系鹿鳖。狀態(tài)地址可能與葉子節(jié)點(diǎn)的地址或者與部分前綴地址完全匹配。輸入地址會(huì)被狀態(tài)讀取频鉴,輸出地址會(huì)寫入狀態(tài)栓辜。當(dāng)輸入和輸出地址被客戶指定后,交易執(zhí)行時(shí)輸入和輸出會(huì)在交易中被聲明垛孔。部分地址信息可以作為通配符使用以便交易指定默克爾樹的局部(包括分叉)而不只是葉子節(jié)點(diǎn)藕甩。

1.4負(fù)載(信息)

在交易執(zhí)行時(shí),負(fù)載(信息)作為一個(gè)傳遞變化給狀態(tài)的方式。只有執(zhí)行中的交易家族可反序列化負(fù)載(信息)狭莱。系統(tǒng)中的其他組件看到的負(fù)載(信息)只是一組字符序列僵娃。

作為標(biāo)頭的一部分,Payload_sha512包含了負(fù)載(信息)字符的SHA-512哈希值腋妙,它經(jīng)過簽名并將被驗(yàn)證默怨,但負(fù)載(信息)區(qū)域不會(huì)(被簽名和驗(yàn)證)≈杷兀可以通過計(jì)算負(fù)載(信息)的SHA-512值匙睹,并和Payload_sha512匹配來驗(yàn)證負(fù)載(信息)是否和標(biāo)頭匹配。

1.5?隨機(jī)數(shù)

隨機(jī)數(shù)區(qū)域里包含了一個(gè)由客戶隨機(jī)生成的字符串济竹。如果兩個(gè)交易碰巧擁有相同的內(nèi)容痕檬,借助隨機(jī)數(shù)可以確保兩個(gè)交易會(huì)生成不一樣的標(biāo)頭簽名。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末送浊,一起剝皮案震驚了整個(gè)濱河市梦谜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌袭景,老刑警劉巖唁桩,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異耸棒,居然都是意外死亡荒澡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門榆纽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來仰猖,“玉大人,你說我怎么就攤上這事奈籽〖⑶郑” “怎么了?”我有些...
    開封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵衣屏,是天一觀的道長躏升。 經(jīng)常有香客問我,道長狼忱,這世上最難降的妖魔是什么膨疏? 我笑而不...
    開封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮钻弄,結(jié)果婚禮上佃却,老公的妹妹穿的比我還像新娘。我一直安慰自己窘俺,他們只是感情好饲帅,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般灶泵。 火紅的嫁衣襯著肌膚如雪育八。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天赦邻,我揣著相機(jī)與錄音髓棋,去河邊找鬼。 笑死惶洲,一個(gè)胖子當(dāng)著我的面吹牛按声,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播湃鹊,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼儒喊,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了币呵?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤侨颈,失蹤者是張志新(化名)和其女友劉穎余赢,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體哈垢,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡妻柒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了耘分。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片举塔。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖求泰,靈堂內(nèi)的尸體忽然破棺而出央渣,到底是詐尸還是另有隱情,我是刑警寧澤渴频,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布芽丹,位于F島的核電站,受9級(jí)特大地震影響卜朗,放射性物質(zhì)發(fā)生泄漏拔第。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一场钉、第九天 我趴在偏房一處隱蔽的房頂上張望蚊俺。 院中可真熱鬧,春花似錦逛万、人聲如沸泳猬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽暂殖。三九已至价匠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間呛每,已是汗流浹背踩窖。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留晨横,地道東北人洋腮。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像手形,于是被迫代替她去往敵國和親啥供。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354