美文网首页
以太坊轻钱包开发笔录01

以太坊轻钱包开发笔录01

作者: devLionel | 来源:发表于2019-12-27 14:34 被阅读0次

    主流通用钱包设计流程

      1、随机生成一组助记词
      2、生成 一个种子seed
      3、根据seed生成公钥、私钥、地址
      4、根据公钥、 私钥、 密码生成钱包文件,也就是Keystore
    

    中心化钱包设计

     Java这里就不演示了,这里代码演示的是世界上开发效率最快的语言PHP创建以太坊钱包
     Composer 安装对应组件
        {
            "require": {
                "sop/asn1": "^3.3",
                "sop/crypto-encoding": "^0.2.0",
                "sop/crypto-types": "^0.2.1",
                "kornrunner/keccak": "^1.0",
                "symfony/dotenv": "^4.0",
                "sc0vu/web3.php": "dev-master"
        }
    
            $config = [
                'private_key_type' => OPENSSL_KEYTYPE_EC,
                'curve_name' => 'secp256k1'
            ];
            $res = openssl_pkey_new($config);
            if (!$res) {
                echo 'ERROR: Fail to generate private key. -> ' . openssl_error_string();
                exit;
            }
            // 生成私钥
            openssl_pkey_export($res, $priv_key);
            // 获取公钥
            $key_detail = openssl_pkey_get_details($res);
    
            $pub_key = $key_detail["key"];
            $priv_pem = PEM::fromString($priv_key);
            // 转换为椭圆曲线私钥格式
            $ec_priv_key = ECPrivateKey::fromPEM($priv_pem);
            // 然后将其转换为ASN1结构
            $ec_priv_seq = $ec_priv_key->toASN1();
    
            // HEX中的私钥和公钥
            $priv_key_hex = bin2hex($ec_priv_seq->at(1)->asOctetString()->string());
            $priv_key_len = strlen($priv_key_hex) / 2;
            $pub_key_hex = bin2hex($ec_priv_seq->at(3)->asTagged()->asExplicit()->asBitString()->string());
            $pub_key_len = strlen($pub_key_hex) / 2;
    
            // 从公钥导出以太坊地址
            // 每个EC公钥始终以0x04开头,
            // 我们需要删除前导0x04才能正确hash它
            $pub_key_hex_2 = substr($pub_key_hex, 2);
            $pub_key_len_2 = strlen($pub_key_hex_2) / 2;
            // Hash
            $hash = Keccak::hash(hex2bin($pub_key_hex_2), 256);
    
            // 以太坊地址长度为20个字节。 (40个十六进制字符长)
            // 我们只需要最后20个字节作为以太坊地址
            $wallet_address = '0x' . substr($hash, -40);
            $wallet_private_key = '0x' . $priv_key_hex;
    

    相关文章

      网友评论

          本文标题:以太坊轻钱包开发笔录01

          本文链接:https://www.haomeiwen.com/subject/hmldoctx.html