github.com/linapex/ethereum-dpos-chinese@v0.0.0-20190316121959-b78b3a4a1ece/mobile/accounts.go (about)

     1  
     2  //<developer>
     3  //    <name>linapex 曹一峰</name>
     4  //    <email>linapex@163.com</email>
     5  //    <wx>superexc</wx>
     6  //    <qqgroup>128148617</qqgroup>
     7  //    <url>https://jsq.ink</url>
     8  //    <role>pku engineer</role>
     9  //    <date>2019-03-16 12:09:42</date>
    10  //</624342652757741568>
    11  
    12  
    13  //包含来自帐户包的所有包装器以支持客户端密钥
    14  //移动平台管理。
    15  
    16  package geth
    17  
    18  import (
    19  	"errors"
    20  	"time"
    21  
    22  	"github.com/ethereum/go-ethereum/accounts"
    23  	"github.com/ethereum/go-ethereum/accounts/keystore"
    24  	"github.com/ethereum/go-ethereum/common"
    25  	"github.com/ethereum/go-ethereum/crypto"
    26  )
    27  
    28  const (
    29  //标准加密是加密算法的n个参数,使用256MB
    30  //在现代处理器上占用大约1秒的CPU时间。
    31  	StandardScryptN = int(keystore.StandardScryptN)
    32  
    33  //StandardScryptP是加密算法的P参数,使用256MB
    34  //在现代处理器上占用大约1秒的CPU时间。
    35  	StandardScryptP = int(keystore.StandardScryptP)
    36  
    37  //lightscryptn是加密算法的n个参数,使用4MB
    38  //在现代处理器上占用大约100毫秒的CPU时间。
    39  	LightScryptN = int(keystore.LightScryptN)
    40  
    41  //lightscryptp是加密算法的p参数,使用4MB
    42  //在现代处理器上占用大约100毫秒的CPU时间。
    43  	LightScryptP = int(keystore.LightScryptP)
    44  )
    45  
    46  //帐户表示存储的密钥。
    47  type Account struct{ account accounts.Account }
    48  
    49  //帐户代表帐户的一部分。
    50  type Accounts struct{ accounts []accounts.Account }
    51  
    52  //SIZE返回切片中的帐户数。
    53  func (a *Accounts) Size() int {
    54  	return len(a.accounts)
    55  }
    56  
    57  //GET从切片返回给定索引处的帐户。
    58  func (a *Accounts) Get(index int) (account *Account, _ error) {
    59  	if index < 0 || index >= len(a.accounts) {
    60  		return nil, errors.New("index out of bounds")
    61  	}
    62  	return &Account{a.accounts[index]}, nil
    63  }
    64  
    65  //set在切片中的给定索引处设置帐户。
    66  func (a *Accounts) Set(index int, account *Account) error {
    67  	if index < 0 || index >= len(a.accounts) {
    68  		return errors.New("index out of bounds")
    69  	}
    70  	a.accounts[index] = account.account
    71  	return nil
    72  }
    73  
    74  //GetAddress检索与帐户关联的地址。
    75  func (a *Account) GetAddress() *Address {
    76  	return &Address{a.account.Address}
    77  }
    78  
    79  //GetURL检索帐户的规范URL。
    80  func (a *Account) GetURL() string {
    81  	return a.account.URL.String()
    82  }
    83  
    84  //keystore管理磁盘上的密钥存储目录。
    85  type KeyStore struct{ keystore *keystore.KeyStore }
    86  
    87  //newkeystore为给定目录创建一个keystore。
    88  func NewKeyStore(keydir string, scryptN, scryptP int) *KeyStore {
    89  	return &KeyStore{keystore: keystore.NewKeyStore(keydir, scryptN, scryptP)}
    90  }
    91  
    92  //hasAddress报告具有给定地址的密钥是否存在。
    93  func (ks *KeyStore) HasAddress(address *Address) bool {
    94  	return ks.keystore.HasAddress(address.address)
    95  }
    96  
    97  //getaccounts返回目录中存在的所有密钥文件。
    98  func (ks *KeyStore) GetAccounts() *Accounts {
    99  	return &Accounts{ks.keystore.Accounts()}
   100  }
   101  
   102  //如果密码短语正确,则删除帐户匹配的密钥。
   103  //如果a不包含文件名,则地址必须与唯一键匹配。
   104  func (ks *KeyStore) DeleteAccount(account *Account, passphrase string) error {
   105  	return ks.keystore.Delete(account.account, passphrase)
   106  }
   107  
   108  //signhash为给定哈希计算ECDSA签名。生成的签名
   109  //格式为[R V],其中V为0或1。
   110  func (ks *KeyStore) SignHash(address *Address, hash []byte) (signature []byte, _ error) {
   111  	return ks.keystore.SignHash(accounts.Account{Address: address.address}, common.CopyBytes(hash))
   112  }
   113  
   114  //signtx用请求的帐户对给定的事务进行签名。
   115  func (ks *KeyStore) SignTx(account *Account, tx *Transaction, chainID *BigInt) (*Transaction, error) {
   116  if chainID == nil { //从移动应用程序传递的空值
   117  		chainID = new(BigInt)
   118  	}
   119  	signed, err := ks.keystore.SignTx(account.account, tx.tx, chainID.bigint)
   120  	if err != nil {
   121  		return nil, err
   122  	}
   123  	return &Transaction{signed}, nil
   124  }
   125  
   126  //如果与给定地址匹配的私钥可以
   127  //用给定的密码短语解密。生成的签名在
   128  //[R_S_V]格式,其中V为0或1。
   129  func (ks *KeyStore) SignHashPassphrase(account *Account, passphrase string, hash []byte) (signature []byte, _ error) {
   130  	return ks.keystore.SignHashWithPassphrase(account.account, passphrase, common.CopyBytes(hash))
   131  }
   132  
   133  //signtxpassphrase如果私钥与
   134  //给定的地址可以用给定的密码短语解密。
   135  func (ks *KeyStore) SignTxPassphrase(account *Account, passphrase string, tx *Transaction, chainID *BigInt) (*Transaction, error) {
   136  if chainID == nil { //从移动应用程序传递的空值
   137  		chainID = new(BigInt)
   138  	}
   139  	signed, err := ks.keystore.SignTxWithPassphrase(account.account, passphrase, tx.tx, chainID.bigint)
   140  	if err != nil {
   141  		return nil, err
   142  	}
   143  	return &Transaction{signed}, nil
   144  }
   145  
   146  //解锁无限期地解锁给定的帐户。
   147  func (ks *KeyStore) Unlock(account *Account, passphrase string) error {
   148  	return ks.keystore.TimedUnlock(account.account, passphrase, 0)
   149  }
   150  
   151  //lock从内存中删除具有给定地址的私钥。
   152  func (ks *KeyStore) Lock(address *Address) error {
   153  	return ks.keystore.Lock(address.address)
   154  }
   155  
   156  //timedunlock使用密码短语解锁给定的帐户。帐户保持不变
   157  //在超时期间解锁(纳秒)。超时0将解锁
   158  //帐户,直到程序退出。帐户必须与唯一的密钥文件匹配。
   159  //
   160  //如果帐户地址在一段时间内已解锁,则TimedUnlock将扩展或
   161  //缩短活动解锁超时。如果地址以前是解锁的
   162  //无限期地超时不会改变。
   163  func (ks *KeyStore) TimedUnlock(account *Account, passphrase string, timeout int64) error {
   164  	return ks.keystore.TimedUnlock(account.account, passphrase, time.Duration(timeout))
   165  }
   166  
   167  //newaccount生成一个新密钥并将其存储到密钥目录中,
   168  //用密码短语加密。
   169  func (ks *KeyStore) NewAccount(passphrase string) (*Account, error) {
   170  	account, err := ks.keystore.NewAccount(passphrase)
   171  	if err != nil {
   172  		return nil, err
   173  	}
   174  	return &Account{account}, nil
   175  }
   176  
   177  //更新帐户更改现有帐户的密码。
   178  func (ks *KeyStore) UpdateAccount(account *Account, passphrase, newPassphrase string) error {
   179  	return ks.keystore.Update(account.account, passphrase, newPassphrase)
   180  }
   181  
   182  //exportkey作为json密钥导出,用newpassphrase加密。
   183  func (ks *KeyStore) ExportKey(account *Account, passphrase, newPassphrase string) (key []byte, _ error) {
   184  	return ks.keystore.Export(account.account, passphrase, newPassphrase)
   185  }
   186  
   187  //importkey将给定的加密JSON密钥存储到密钥目录中。
   188  func (ks *KeyStore) ImportKey(keyJSON []byte, passphrase, newPassphrase string) (account *Account, _ error) {
   189  	acc, err := ks.keystore.Import(common.CopyBytes(keyJSON), passphrase, newPassphrase)
   190  	if err != nil {
   191  		return nil, err
   192  	}
   193  	return &Account{acc}, nil
   194  }
   195  
   196  //importecdsakey将给定的加密JSON密钥存储到密钥目录中。
   197  func (ks *KeyStore) ImportECDSAKey(key []byte, passphrase string) (account *Account, _ error) {
   198  	privkey, err := crypto.ToECDSA(common.CopyBytes(key))
   199  	if err != nil {
   200  		return nil, err
   201  	}
   202  	acc, err := ks.keystore.ImportECDSA(privkey, passphrase)
   203  	if err != nil {
   204  		return nil, err
   205  	}
   206  	return &Account{acc}, nil
   207  }
   208  
   209  //importpresalekey解密给定的以太坊预售钱包和商店
   210  //密钥目录中的密钥文件。密钥文件使用相同的密码短语加密。
   211  func (ks *KeyStore) ImportPreSaleKey(keyJSON []byte, passphrase string) (ccount *Account, _ error) {
   212  	account, err := ks.keystore.ImportPreSaleKey(common.CopyBytes(keyJSON), passphrase)
   213  	if err != nil {
   214  		return nil, err
   215  	}
   216  	return &Account{account}, nil
   217  }
   218