標籤:code accounts err 基本 pat nta account [] 工具
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來簽名給定的hashSignTxWithPassphrase(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包簡介