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格式的數據包 是否進行離線簽名的選項