Skip to content

HPB钱包开发之创建钱包

BlockGeek edited this page Apr 28, 2019 · 1 revision

1 基本概念

1.1 什么是账户?

一个钱包地址就代表着一个账户。地址是账户的标识。地址表示的是该账户公钥的后20字节(通常会以0x开头,例如,0xed37f755e56b1d49642dce8ff2b788ae33263c94`)。每个账户都由一对钥匙定义,一个私钥(Private Key)和一个公钥(Public Key)。 账户以地址为索引,地址由公钥衍生而来,取公钥的最后20个字节。

1.2 私钥、公钥和地址

  1. 先生成一个私钥,由随机的256bit组成。
  2. 使用加密算法椭圆曲线签名算法elliptic curve cryptography将私钥映射生成公钥。一个私钥只能映射出一个公钥。
  3. 用公钥低位的160bit通过SHA-3加密hash算法计算得到地址。

1.3 Keystore文件

Keystore文件是JSON格式的:

{  
   "address":"0xed37f755e56b1d49642dce8ff2b788ae33263c94",
   "crypto":{  
      "cipher":"aes-128-ctr",
      "ciphertext":"41c14f88ec8f35c9fe57cd39121a76c2dadbd82ea8fec59866468bc0d7371f2e",
      "cipherparams":{  
         "iv":"43443bf394e8f6ebcc687e13bc0effb9"
      },
      "kdf":"scrypt",
      "kdfparams":{  
         "dklen":32,
         "n":262144,
         "p":1,
         "r":8,
         "salt":"aaef6847d09cb1e9f5ceadaf5865d96a7493df1cae146b24e31092cc0a7844af"
      },
      "mac":"5e9781c587db5795c6d41cb4f001bf086cc3db33b6e7eefcc2ef472145e76821"
   },
   "id":"bcd61a88-283f-4d81-8457-30ec9c11521f",
   "version":3
}

通过keystore文件中的内容,我们可以看到其中包括了私钥加密的相关信息:

  • address:该账户的地址
  • cipher:加密方法使用的是AES-128-CTR算法^4
  • ciphertext:加密后的密文
  • cipherparams:AES-128-CTR算法加密所需的相关参数
  • kdf:秘钥生成函数,用于使用密码对keystore文件进行加密
  • kdfparams:kdf算法所需的参数
  • mac:用于验证密码的编码

2 创建代码

2.1 创建EthereumKeystoreV3对象

在web3siwft中找到EthereumKeystoreV3.swift文件,创建EthereumKeystoreV3对象。构造函数生成对象:

    //随机生成私钥
    public init? (password: String = "BANKEXFOUNDATION") 
     
    //指定私钥   
    public init? (privateKey: Data, password: String = "BANKEXFOUNDATION") 
       

在构造方法中会调用encryptDataToStorage方法通过ECC去给keystoreParams赋值。

2.2 创建kstore文件并存入本地

对EthereumKeystoreV3的keystoreParams属性进行编码并存在本地。

具体代码实现:

    static func generateKstoreFileBy(_ privateKey: Data,password: String,complete: ((String,String)->Void)?) 
       -> WalletManagerResult{
        
        guard let ethereumKeystore = try? EthereumKeystoreV3(privateKey: privateKey, password: password),let ks = ethereumKeystore else{
            return WalletManagerResult(false,"生成Keystore文件出错")
        }
        guard  let keydata = try? JSONEncoder().encode(ks.keystoreParams)
            else{
            return WalletManagerResult(false,"获取Keystore文件出错")
        }
        guard let adress = ks.getAddress() else{
           return WalletManagerResult(false,"获取Keystore文件出错")
        }
        //创建普通的keystore文件
        let filename = HPBFileManager.generateFileName(address: adress.addressData)
        if FileManager.default.createFile(atPath: HPBFileManager.getKstoreDirectory() + filename, contents: keydata, attributes: nil){
            complete?(filename,adress.address.lowercased())
            return WalletManagerResult(true,nil)
        }else{
            return  WalletManagerResult(false,"生成Keystore文件出错")
        }
    }

到此,一个新的账户就创建成功了,keystore文件就是加密的账户私钥,需要配合密码使用。

--

下一节我们会讲解助记词生成和备份。

Clone this wiki locally