以太坊原始碼分析(4)accounts包簡介

尹成發表於2018-05-13

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嘗試在指定的派生路徑上顯式派生出分層確定性帳戶。如果pintrue,派生帳戶將被新增到錢包的跟蹤帳戶列表中。

        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

    }

 

 

後端BackendBackend是一個錢包提供器。可以包含一批賬號。他們可以根據請求籤署交易。

    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,對derivedKeycipherText進行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

     scryptPscrypt演算法中的P

derivedKey, err := scrypt.Key(authArray, salt, scryptN, scryptR, scryptP, scryptDKLen)

對使用者名稱輸入的密碼使用scrypt加密,返回一個derivedKey








網址:http://www.qukuailianxueyuan.io/



欲領取造幣技術與全套虛擬機器資料

區塊鏈技術交流QQ群:756146052  備註:CSDN

尹成學院微信:備註:CSDN



相關文章