以太坊原始碼分析(4)accounts包簡介
accounts包實現了以太坊客戶端的錢包和賬戶管理。
賬號的資料結構:
typeAccount struct {
Address common.Address `json:"address"` // Ethereum account addressderived from the key
URLURL `json:"url"` // Optional resource locator within a backend
}
錢包interface,是指包含了一個或多個賬戶的軟體錢包或者硬體錢包
type Wallet struct {
URL() URL // URL 用來獲取這個錢包可以訪問的規範路徑。它會被上層使用用來從所有的後端的錢包來排序。
Status() (string, error) // 用來返回一個文字值用來標識當前錢包的狀態。同時也會返回一個error用來標識錢包遇到的任何錯誤。
Open(passphrase string) error //Open初始化對錢包例項的訪問。如果你open了一個錢包,你必須close它。
Close() error // Close 釋放由Open方法佔用的任何資源。
Accounts() []Account // Accounts用來獲取錢包發現了賬戶列表。對於分層次的錢包,這個列表不會詳盡的列出所有的賬號,而是隻包含在帳戶派生期間明確固定的帳戶。
Derive(path DerivationPath, pin bool) (Account,error) //Derive嘗試在指定的派生路徑上顯式派生出分層確定性帳戶。如果pin為true,派生帳戶將被新增到錢包的跟蹤帳戶列表中。
SelfDerive(base DerivationPath,chain ethereum.ChainStateReader) //SelfDerive設定一個基本帳戶匯出路徑,從中錢包嘗試發現非零帳戶,並自動將其新增到跟蹤帳戶列表中。
SignHash(account Account, hash []byte)([]byte, error) // SignHash 請求錢包來給傳入的hash進行簽名。
SignTx(account Account, tx*types.Transaction, chainID *big.Int) (*types.Transaction, error) // SignTx 請求錢包對指定的交易進行簽名。
SignHashWithPassphrase(accountAccount, passphrase string, hash []byte) ([]byte, error) //SignHashWithPassphrase請求錢包使用給定的passphrase來簽名給定的hash
SignTxWithPassphrase(accountAccount, passphrase string, tx *types.Transaction, chainID *big.Int)(*types.Transaction, error) // SignHashWithPassphrase請求錢包使用給定的passphrase來簽名給定的transaction
}
後端Backend,Backend是一個錢包提供器。可以包含一批賬號。他們可以根據請求籤署交易。
type Backend struct {
Wallets() []wallet // Wallets獲取當前能夠查詢到的錢包
Subscribe(sink chan <-WalletEvent) event.Subscription // 訂閱建立非同步訂閱,以便在後端檢測到錢包的到達或離開時接收通知。
}
manager.go
Manager是一個包含所有東西的賬戶管理工具。可以和所有的Backends來通訊來簽署交易。
以太坊賬戶定義,在accounts.keystore.key.go中定義
以太坊賬戶主要包含三條資訊,ID,地址和公私鑰對。
type Keystruct {
IDuuid.UUID
Address common.Address
PrivateKey *ecdsa.PrivateKey
}
以太坊建立賬戶的流程:
1,使用者輸入一個密碼 (passphrase string)
2,內部通過橢圓曲線演算法隨機生成一個公私金鑰對(internal.ethapi.apinewAccount方法)
3,對公鑰hash得到地址
4,對密碼使用scrypt演算法加密,得到加密後的密碼derivedKey
5,用derivedKey的對私鑰使用AES-CTR演算法加密,得到密文cipherText
6,對derivedKey和cipherText進行hash得到mac,這個mac實際上起到了簽名的作用,在解密的時候去驗證合法性,防止別人篡改
7,儲存賬號地址和加密過程中寫死或隨機生成的引數到json檔案中,也就是就是上面的檔案
建立賬號的核心程式碼:(accounts.keystore.keystore_passphrase.go)
中的EncryptKey方法
funcEncryptKey(key *Key,authstring,scryptN,scryptPint) ([]byte,error)
其中,key是加密的賬號,包含ID,公私鑰,地址
auth是使用者輸入的密碼
scryptN,是scrypt演算法中的N
scryptP,scrypt演算法中的P
derivedKey, err := scrypt.Key(authArray, salt, scryptN, scryptR, scryptP, scryptDKLen)
對使用者名稱輸入的密碼使用scrypt加密,返回一個derivedKey
網址:http://www.qukuailianxueyuan.io/
欲領取造幣技術與全套虛擬機器資料
區塊鏈技術交流QQ群:756146052 備註:CSDN
尹成學院微信:備註:CSDN
相關文章
- 以太坊原始碼分析(5)accounts程式碼分析原始碼
- 以太坊原始碼分析(17)Internal包簡介原始碼
- 以太坊原始碼分析(6)accounts賬戶管理分析原始碼
- 以太坊原始碼分析(9)cmd包分析原始碼
- 以太坊原始碼分析(15)node包建立多重協議以太坊節點原始碼協議
- 以太坊原始碼分析(37)eth以太坊協議分析原始碼協議
- 以太坊原始碼分析(18)以太坊交易執行分析原始碼
- 以太坊原始碼分析(53)以太坊測試網路Clique_PoA介紹原始碼
- 以太坊原始碼分析(36)ethdb原始碼分析原始碼
- 以太坊原始碼分析(38)event原始碼分析原始碼
- 以太坊原始碼分析(41)hashimoto原始碼分析原始碼
- 以太坊原始碼分析(43)node原始碼分析原始碼
- 以太坊原始碼分析(51)rpc原始碼分析原始碼RPC
- 以太坊原始碼分析(52)trie原始碼分析原始碼
- 以太坊簡介
- 以太坊原始碼分析(13)RPC分析原始碼RPC
- 以太坊交易池原始碼分析原始碼
- 以太坊原始碼分析(52)以太坊fast sync演算法原始碼AST演算法
- 以太坊原始碼分析(8)區塊分析原始碼
- 以太坊原始碼分析(16)挖礦分析原始碼
- 5.4 以太坊原始碼詳解4原始碼
- 以太坊原始碼分析(35)eth-fetcher原始碼分析原始碼
- 以太坊原始碼分析(20)core-bloombits原始碼分析原始碼OOM
- 以太坊原始碼分析(24)core-state原始碼分析原始碼
- 以太坊原始碼分析(29)core-vm原始碼分析原始碼
- 以太坊原始碼分析(34)eth-downloader原始碼分析原始碼
- 以太坊原始碼分析(2)go ethereum 目錄大概介紹原始碼Go
- 以太坊原始碼分析(54)以太坊隨機數生成方式原始碼隨機
- 以太坊原始碼分析(3)以太坊交易手續費明細原始碼
- 以太坊原始碼分析(23)core-state-process原始碼分析原始碼
- 以太坊原始碼分析(31)eth-downloader-peer原始碼分析原始碼
- 以太坊原始碼分析(32)eth-downloader-peer原始碼分析原始碼
- 以太坊原始碼分析(33)eth-downloader-statesync原始碼分析原始碼
- 以太坊原始碼分析(10)CMD深入分析原始碼
- 以太坊原始碼分析(12)交易資料分析原始碼
- 以太坊原始碼分析(19)core-blockchain分析原始碼Blockchain
- 死磕以太坊原始碼分析之state原始碼
- 死磕以太坊原始碼分析之txpool原始碼