HPB钱包基本概念

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文件就是加密的账户私钥,需要配合密码使用。

猜你喜欢

转载自blog.csdn.net/shangsongwww/article/details/89063611