Appearance
btcWallet中的数据库设计
Bucket相关
顶层Bucket
key列表: mgrVersionName mgrCreateDateName Bucket列表: 地址相关的
1. waddrmgrNamespaceKey
1.1 mainBucketName
stores the encrypted crypto keys that encrypt all other generated keys
1.2 syncBucketName
stores the current sync state of the root manager.
1.3 scopeBucketName
scopeBucketNme is the name of the top-level bucket within the
hierarchy. It maps: purpose || coinType to a new sub-bucket that
will house a scoped address manager. All buckets below are a child
of this bucket:
scopeBucket -> scope -> acctBucketName //account id=>dbDefaultAccountRow
scopeBucket -> scope -> addrBucketName //addressID Hash=>dbAddressRow
scopeBucket -> scope -> usedAddrBucketName // 一个地址是否被使用
scopeBucket -> scope -> addrAcctIdxBucketName //addressID hash => account id
scopeBucket -> scope -> acctNameIdxBucketName //accountName => account_id
scopeBucket -> scope -> acctIDIdxBucketName //account_id => accountName
scopeBucket -> scope -> metaBucket //metaData
scopeBucket -> scope -> metaBucket -> lastAccountNameKey //manager中的最后一个account
scopeBucket -> scope -> coinTypePrivKey //后面这两个代码没看到
scopeBucket -> scope -> coinTypePubKey
目前已知的Scope有KeyScopeBIP0044,KeyScopeBIP0049Plus等 从这里也看出比特币的Key是树形结构,
1.4 scopeSchemaBucketName
scopeSchemaBucket is the name of the bucket that maps a particular
manager scope to the type of addresses that should be derived for
particular branches during key derivation.
go
// KeyScopeBIP0049Plus is the key scope of our modified BIP0049
// derivation. We say this is BIP0049 "plus", as we'll actually use
// p2wkh change all change addresses.
KeyScopeBIP0049Plus = KeyScope{
Purpose: 49,
Coin: 0,
}
// KeyScopeBIP0084 is the key scope for BIP0084 derivation. BIP0084
// will be used to derive all p2wkh addresses.
KeyScopeBIP0084 = KeyScope{
Purpose: 84,
Coin: 0,
}
// KeyScopeBIP0044 is the key scope for BIP0044 derivation. Legacy
// wallets will only be able to use this key scope, and no keys beyond
// it.
KeyScopeBIP0044 = KeyScope{
Purpose: 44,
Coin: 0,
}
// DefaultKeyScopes is the set of default key scopes that will be
// created by the root manager upon initial creation.
DefaultKeyScopes = []KeyScope{
KeyScopeBIP0049Plus,
KeyScopeBIP0084,
KeyScopeBIP0044,
}
// ScopeAddrMap is a map from the default key scopes to the scope
// address schema for each scope type. This will be consulted during
// the initial creation of the root key manager.
ScopeAddrMap = map[KeyScope]ScopeAddrSchema{
KeyScopeBIP0049Plus: {
ExternalAddrType: NestedWitnessPubKey,
InternalAddrType: WitnessPubKey,
},
KeyScopeBIP0084: {
ExternalAddrType: WitnessPubKey,
InternalAddrType: WitnessPubKey,
},
KeyScopeBIP0044: {
InternalAddrType: PubKeyHash,
ExternalAddrType: PubKeyHash,
},
}
Tx相关的
2. wtxmgrNamespaceKey
Tx相关
buckets
bucketBlocks = []byte("b")
bucketTxRecords = []byte("t")
bucketCredits = []byte("c")
bucketUnspent = []byte("u")
bucketDebits = []byte("d")
bucketUnmined = []byte("m")
bucketUnminedCredits = []byte("mc")
bucketUnminedInputs = []byte("mi")
bucketBlocks 存储某个块有哪些Tx,没有考虑分叉 bucketBlocks: blockNumber=>blockHash+blockTime+TxCount+[ TxHash1,TxHash2...]
bucketTxRecords 存储序列化的Tx,已经被打包上链的, TxHash+blockNumber+blockHash=>SerializedTx
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 存储 outpoint=>UTXO Amount+change 参考bucketCredits
bucketUnminedInputs 保存已经消费的UTXO,但是还未被打包或者正在被打包 这些UTXO已经被进入mempool的Tx消费了. outpoint=>[TxHash1,TxHash2] TxHash1,TxHash2可能会消费这个outpoint