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

  • 相关阅读:
    优麒麟(UbuntuKylin)不是国产Linux操作系统
    中间件
    RapeLay(电车之狼R)的结局介绍 (隐藏结局攻略)
    HDU 4284 状压dp+spfa
    素数推断算法(高效率)
    【iOS开发-60】案例学习:多组数据的tableView设置、添加右側组索引、多层数据模型设置以及valueForKeyPath
    理解class.forName()
    Oracle经典查询案例
    Java抓取网页数据(原网页+Javascript返回数据)
    破解windows下MySQL服务启动不了的情况下不能对其进行全然卸载的解决方式
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13313343.html
Copyright © 2011-2022 走看看