bucketBlocks = []byte("b")
bucketTxRecords = []byte("t")
bucketCredits = []byte("c")
bucketUnspent = []byte("u")
bucketDebits = []byte("d")
bucketUnmined = []byte("m")
bucketUnminedCredits = []byte("mc")
bucketUnminedInputs = []byte("mi")
bucketCredits 存储未花费的UTXO,或者已花费,但是还没有确认的,这些都是我关注的 Txhash+blockNumber+blockHash+Index(outpoint中)=>UTXO Amount[8个字节]+其他信息 其他信息: v[8]第0位表示是否已消费 1 表示已消费 v[8]第1位表示是否是找零 1 为找零 如果已经消费,那么第9个字节后还会有TxHash+blockNumber+blockHash+Index 表示这个UTXO在哪里被消费了.
bucketUnspent 存储需要我关注的未消费的UTXO,一旦该UTXO被消费,就会删除相关记录 存储outPoint=>blockNumer+blocHash 该outpoint产生的block
bucketDebits 这个需要解释清楚 记录钱包中一笔被消费的UTXO, debit啥意思呢 Txhash+blockNumber+blockHash+Index(outpoint中)=>Amount[8字节]+Txhash+blockNumber+blockHash+Index
bucketUnmined 存储进入memPool,但是还未被打包的交易 TxHash=>ReceivedTime(8字节)+SeralizedTx
bucketUnminedCredits 存储那些Tx输出是到我的钱包地址的OutPoint,并且这些Tx还未被打包 outpoint=>UTXO Amount+change 参考bucketCredits
bucketUnminedInputs 保存已经消费的UTXO,但是还未被打包或者正在被打包 这些UTXO已经被进入mempool的Tx消费了. outpoint=>[TxHash1,TxHash2] TxHash1,TxHash2可能会消费这个outpoint
store是wallet与数据库打交道的接口,通过store来管理Tx以及Balance.
rec表示当前新收到的Tx, block不为空则是Tx所在块,空表示来自mempool的tx
func (s *Store) InsertTx(ns walletdb.ReadWriteBucket, rec *TxRecord, block *BlockMeta) error
对于来自MemPool中的Tx,则block为空,
对于来自于链上的Tx,有block信息
收到了一个我关注的Tx,其中某个Output的地址在我的钱包之中,这时候才调用AddCredit rec: 其中某个输出是给我的那个Tx index:第几个输出是给我的 block:包含这个rec的块 change: Internal returns true if the backing address was created for internal use such as a change output of a transaction. 我的理解就是找零地址 返回值
func (s *Store) AddCredit(ns walletdb.ReadWriteBucket, rec *TxRecord, block *BlockMeta, index uint32, change bool) error
block 是nil表示来自mempool
将这个outpoint放入bucketUnminedCredits
block 表示包含该Tx的块信息
如果bucketCredits包含该outpoint,结束
在bucketCredits记录该outpoint
调用putMinedBalance增加该outpoint的Amount到Balance
将该outpoint放入bucketUnspent
InsertTx和AddCredit的调用关系 一般是InsertTx(memPool),addCredit(mempool),InsertTx(block!=nil),addCredit(block!=nil)
当发生块重组的时候需要rollback
// Rollback removes all blocks at height onwards, moving any transactions within
// each block to the unconfirmed pool.
func (s *Store) Rollback(ns walletdb.ReadWriteBucket, height int32) error {
return s.rollback(ns, height)
}
这个函数非常复杂, 深入此函数也可以看出链重组的时候相关的数据应该如何处理. 相比与以太坊的StateTransition模型,这里要复杂很多.