先說說什麼是帳本
帳本就是用來紀錄收入與支出用的
所以上面會有消費的明細
例如今天去7-11買了個飯糰
那就紀錄成:
我 給 7-11 飯糰的價格
當然也有可能是父母匯款 , 那就紀錄成
父母 給 我 xxxx元
這邊在分散式帳本
上面的: 我 , 父母 , 7-11
就是address
基本上 , 帳本就是這樣的東西 , 包含收款人 , 付款人 , 轉移的金額
假設帳本如下
這三筆是address的初始資訊
剩下就是交易
所以目前各address的餘額
分別是
我 : ()
相關的交易:
父母 : ()
相關交易:
7-11 : ()
相關交易:
注意到 , 帳本是有時間順序的
所以每筆交易要有時間的紀錄 , 或有時間上的偏序關係(誰比誰先)
簡單說 , 就是算出來有address , 餘額是負的 , 或有要花錢時 , 錢不夠的情況
例如:
來算餘額
我 : ()
它 : ()
這樣是錯的
因為在
就會發現 : 我 的餘額只剩4元
根本不夠錢可以給人10元
那這在單一帳本是不會出現的
每次有新交易進來 , 都會檢查餘額是否正確
但分散式帳本就不一定了
帳本例子 :
這邊 我 , 它 的餘額都是正常的
但是 , 如果有人把第三條
改成
那就會變成不合理的帳本
所以分散式帳本 , 要有不可篡改性的理由就是這樣來的
帳本例子:
這邊
這兩筆就是衝突的交易
如果兩筆交易都算是合法的 , 算餘額就有address會錯(我 的餘額是負的(-6)) , 所以對帳本的程式來說 , 要選擇兩筆都不接受或接受其中一筆
基本上 , 一筆交易只會有一個address與value
解釋為什麼
上面提到的交易紀錄 , 其中一個例子
我 給 它 6
這在IRI內稱為
每個 會拆成數個
以上面例子為例 , 會拆成
我 -6
它 6
這是兩筆交易
我 -6
稱為
它 6
稱為
跟 可以多個
通常 , 一個 的錢不會一次買賣就花光 , 由於address花錢需要簽名 , 而簽名是一次性的
所以一個 通常會有兩個
其中一個 是找零的address
address餘額計算非常簡單
不考慮衝突的話
把所有內含address的交易拿出來 , value直接相加就是餘額了
假設"我"這個address的餘額為10
有兩個 如下情況
我 -10
它 10
我 -10
他 10
這樣 , "我" 的餘額是負的
所以這兩個bundle衝突
不過IRI花錢需要簽名 , 只能簽一次
按照之前重複簽名事件的處理 , "我"的餘額會被轉移到別的address , 需要基金會的tool或人員才能拿回餘額
如下
假設一開始"我"的餘額是10
我 -10
它 6
餘額一 4
他 8
餘額二 2
它 6
餘額一 4
與
他 8
餘額二 2
這是兩組衝突的交易
目前 的實做
是 與 都有field是hash function的輸入
所以要製造衝突的交易有難度 , 尤其雙花的Output address是任意組合的時候
iota是可以有0元交易的
從算帳的角度看
0元交易 , node可收也可以不收 , 可以廣播也可以不廣播
所以可推論出
攻擊者要篡改帳本 , 很大可能是發0元交易
道理很簡單 , 要發交易增加權重 , 當然是單位時間內 , 發起交易的數量越多越好
任何的address , 餘額都不是無限多的
, 所以發的交易會有上限
而且任何address最好只花一次 , 多次會有別人偽造交易的問題 , 偽造交易會破壞攻擊者增加權重的意圖
當帳本從單一node變成多node保存相同的交易紀錄與address初始餘額時
狀況就更複雜了
由於多個node都要保存相同的交易紀錄
所以有個規則
某個node發起新的一筆交易都要廣播給其他帳本接收 , 0元交易可以不用廣播
那自然 , 在分散式系統 , 就會出現下列狀況
再考慮有惡意 , 來亂的帳本
就更多亂七八糟的情況了
交易偽造需要靠密碼學的方法來處理
簡單說 , 就是發一筆有值交易需要簽名
而簽名用的私鑰只有擁有相關 的人才有
IOTA IRI rocksdb data storage structure
IOTA