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