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

  • 相关阅读:
    supervisor安装(sentos7)
    linux网络管理----远程登录工具
    asp.net mvc 文件压缩下载
    JavaScript 逗号表达式
    SQL面试题——查询课程
    js中== ===的区别
    网易笔试题目:三列布局,中间自适应宽度,双飞翼布局,及问题
    搜狐面试题:有12个球,外形都一样,其中有一个质量和其他的不一样,给你一架天平,请问最少称几次可以把那个不同的球找出来。
    行内元素对齐:display:inline-block;
    respond.js第六行 SCRIPT5: 拒绝访问。跨域问题
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13313343.html
Copyright © 2020-2023  润新知