1. 程式人生 > >區塊鏈教程以太源碼分析accounts包簡介

區塊鏈教程以太源碼分析accounts包簡介

pre sub 而是 let 狀態 nal text 帳戶 pen

accounts包實現了eth客戶端的錢包和賬戶管理。
賬號的數據結構:
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來通信來簽署交易。
eth賬戶定義,在accounts.keystore.key.go中定義
eth賬戶主要包含三條信息,ID,地址和公私鑰對。
type Keystruct {
IDuuid.UUID
Address common.Address
PrivateKey ecdsa.PrivateKey
}
eth創建賬戶的流程:
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

區塊鏈教程以太源碼分析accounts包簡介