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

來源:互聯網
上載者:User

標籤: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包簡介

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.