區塊鏈中的Transaction文檔心得總結

Transaction對象由字段集合構成

字段又含有兩個部分組成:

公共字段:交易類型,發起交易的帳號

特殊字段:特定於交易類型的相關信息的字段集合

 

交易對象的兩種表示方法:JSON對象、二進制對象

在JSON中表示爲"TransactionType":"Payment", 而採用二進制表示時,

Name是由一個數值對<Type, Code>表示, Value則是一個16位的數值.

 

交易類的每一個字段都是鍵值對 pair

 

字段信息:

Transaction類型

貨幣類型

貨幣類型有三個部分組成:

1.貨幣代碼:160bits的整形表示 全0 表示原生貨幣SDA

2.貨幣發行商帳號

3.貨幣值 採用科學計數法

 

字段序列化

爲了簽名的二進制形式有序 唯一需要對字段進行排序 也就是進行字段序列化

Name由 <Type,Code>兩個整數表示

1.先對字段名Name序列化,序列化是兩個數值的編碼

2.對字段值Value序列化,取決於字段類型

3. 對於特殊類型 STI_OBJECT STI_ARRAY字段需要添加結束標記

 

貨幣類型序列化

NotNative 0爲原生貨幣 1爲非原生貨幣

NotNegative 貨幣value符號爲 0正1負

Offset 科學計數法中的值

Value 科學計數法

 

對於非原生貨幣 也就是NotNative爲1的時候 需要就愛上貨幣代碼和發行商帳號信息 160bits

變長字節數組序列化

1.編碼數組長度

2.將數組中的L字節按順序依次存儲

 

256bits 整型數組序列化

1.計算數組的字節數 SIZE 並且按照變長字節數組長度的方式編碼SIZE

2.順序地遍歷數組 序列化表示每個整形的32字節數組

 

路經集合序列化

 

以上是對字段的序列化……

 

交易對象序列化

對於整個對象的序列化不是簡單的序列化它所包含的字段 爲了保證一致性 我們還要保證交易對象序列化內容的確定性;所以要保證對象字段的序列化順序,具體做法:

根據字段Name構造一個用於排序的32位整型的Key = (type << 16) | Code

對象可能嵌套 也就是說一個對象字段包含的是另一個對象

 

簽名流程

爲了檢驗交易的合法性,必須由交易發起人對交易對象進行數字簽名,一個完成的簽名是一個閉環過程,不僅僅涉及發起交易的人,還要由處理交易的人對簽名進行校驗,驗證合法性,整個流程如下:

1.交易發起人,提取Transaction對象中的簽名數據進行序列化,結果記爲5

2.選擇交易簽名的算法A,目前底層支持兩種簽名算法secop256k1 ed25519 默認前者

3.將S作爲輸入。選擇交易發起帳號所對應的簽名密鑰 交給簽名算法A 獲得簽名結果R

4.將簽名結果R作爲字段TxnSignature 增加到 Transaction對象中 Name爲<STI_VL,14>

5.將驗證簽名的公鑰,作爲字段SigningPubKey增加到Transaction對象中

6.序列化Transaction對象,通過其結果構造交易請求 發送到底層SDChain

7.SDChain 反序列化獲得的交易對象,從中獲取交易發起人帳號信息Account和簽名驗證公鑰SigningPubKey確認後者是否屬於前者的簽名驗證公鑰,如果是,則執行步驟8否則判定爲交易不合法

8.底層從Transaction對象中獲取簽名數據進行序列化 獲得輸出S*

9.根據簽名公鑰SigningPubKey 獲得簽名算法A*

10.從Transaction對象中獲取TxnSignature字段的值R* 並結合S* A*和SigningPubKey驗證簽名合法性

 

Transaction對象簽名數據

交易簽名數據是從Transaction對象字段集合中提取的用於簽名的字段子集,具體的組成取決於交易類型,但無論這個子集是什麼,其處理於交易對象序列胡一樣,對於這個自己的字段根據字段Key進行增序排序,然後根據此順序依次序列化獲得簽名數據 各個交易類型的簽名字段及

簽名算法

無論選擇什麼簽名算法,簽名基本思想都是一樣的

1.根據輸入的種子Seed(一個足夠大的隨機數) 生成密鑰對 保存SecKey公開PubKey

2.用SecKey加密數據 生成簽名

3.用PubKey從簽名中解密數據 驗證與原數據是否一致

 

目前, 底層支持兩種簽名算法Secp256K1和Ed25519, 用戶可在使用時自行選擇, 爲了讓底層區分或理解上層應用選擇的那種簽名算法, 我們在編碼公鑰時, (可以理解爲)會加上算法類型前綴: 對於Secp256K1的公鑰, 其第一個字節是0x02或0x03; 對於Ed25519的公鑰, 其第一個字節是0xED. 另外, 兩個算法的私鑰長度都是32字節, 公鑰的長度是33字節.

 

Seed的生成

爲了防止密鑰對被破解 Seed應該是一個足夠大的隨機數 128bits整型,但在實際應用時有的時候也需要根據一個給定輸入的Passphrase產生 底層支持的四種Seed獲取方式

1.用戶直接給出 通常以十六進制存儲

2.用戶輸入Passphrase 使用SHA512計算出hash值 取前128bits作爲Seed

3.用戶輸入一個引文短語 由12個英文單詞構成 然後轉化成128bits的Key 反序後作爲Seed

4.根據一個加密安全的僞隨機數產生器產生一個128bits隨機數作爲Seed

 

 

觀察一個sign功能 他的第一個參數是私鑰 也就是賬戶發起者的私鑰 然後是json格式的數據包 是否進行離線簽名的選項

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章