以太坊轻钱包开发笔录01

2019-12-27  本文已影响0人  devLionel

主流通用钱包设计流程

  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;
上一篇下一篇

猜你喜欢

热点阅读