首頁 > 資訊 > 應用 > CITA:面向企業級應用高性能區塊鏈內核
CITA 的 nonce 有什么作用?
2019-11-01 14:04:10作者:CITA來源:CITA
比特幣是基于 UTXO 的賬號,交易是由 UTXO 來做組成,因為 UTXO 被消費后即失效,所以交易可以認為是唯一的。對于基于狀態機的賬號模型,用戶發送的交易,存在被其他用戶獲取并重新發送到鏈上的可能,由此造成交易的多次執行,這種攻擊行為稱為重放攻擊。為了避免重放攻擊,需要采取一定的策略。例如以太坊中,用戶發送的每一筆交易都必須包含一個自增的 nonce 值,交易一旦被確認,該用戶的合法 nonce 值會自增,含有同樣 nonce 的交易被認為是非法交易,這樣來防止重放。但是對于以太坊的這種設計有一個很大的缺陷,后一筆交易必須等待前一筆交易進交易池才可以,交易只能順序處理,限制了交易的并行性。例如,對于賬戶A向同一節點發送某一筆交易 T0 之后,只能等待 T0 打包入塊并處理完成后,才可以發送后續的交易,即便后續交易對 T0 沒有任何依賴關系,否則可能存在 T0 交易打包入塊失敗,而導致后續交易成功打包但是驗證 nonce 失敗。另外,在現實世界中存在同一賬戶被多人使用,或者向多個節點發送交易的情況,由于交易的 nonce 自增的特性,導致這種情況下,賬戶向多個節點同時發送交易會比較困難。
在 CITA 中 nonce 使用的是一個隨機的字符串(有一定的長度限制),來使交易生成不同的 hash,使用 hash 來作為交易的唯一性驗證。但是僅僅用 nonce 來保證哈希的唯一性,還是遠遠不夠的,因為同一個用戶發送交易足夠多,nonce 還是有很大概率重復,且在工程上去保證全局 nonce 的唯一也會嚴重影響性能。在 CITA 的交易中 nonce 和 valid_until_block 配合使用,由此只要保證在max_valid_until_block 范圍交易的 hash 沒有重復,就可以保證交易永遠不會重復。并且 max_valid_until_block 的值可以保證驗證 nonce 的緩存池不會過大。在兼顧性能和并行處理的同時,非常完美的解決了交易的唯一性問題,防止了重放攻擊。