Bitcoin钱包开发之地址生成教程

    2020-05-30 22:00:22 #btc钱包地址生成 #比特币钱包地址生成,比特币钱包开发

    优盾钱包www.uduncloud.com提供BTC_ETH_USDT_EOS_XRP等主流erc20代币对接交易所钱包充提币_转账支付归集_API/RPC的php/java开发接口。API快捷接入,多币种多地址钱包余额一键归集、私钥冷存储、多级复签、全终端支持。 点此立即试用



    以Bitcoin为首的加密货币从诞生发展至今,融入了多项先进技术,区块链技术的应用不仅保障了加密货币的流通便利性,更发挥其加密性、不可篡改两大优势,赋能于加密货币的交易,使之更加安全。

     

    区块链钱包的出现,更是为加密资产便捷流通的同时,增添了一份安全保障。区块链钱包指的是利用区块链技术开发的虚拟数字货币产品的管理工具,它应具备虚拟币可交易的特点,即收付款功能。

     

    Bitcoin钱包是基于BTC存在的,目的是让BTC存储更加安全,有效的避免黑客攻击,而且利用比特币钱包中随机生成的比特币地址,可以与其他人进行账户上的比特币转账。

     


    如何生成Bitcoin钱包地址

     

    Bitcoin地址作为一个随机查找的十六进制字符串,在Bitcoin网络中用于发送和接收Bitcoin。它属于公私不对称ECDSA密钥的公共部分。相应的私钥用于签署Bitcoin交易,作为交易时来自用户的确认和证明。

     

    从技术层面理解,Bitcoin地址是ECDSA密钥的公共部分生成的,使用SHA-256和RIPEMD-160进行hash,如下文演示文稿所述,经过处理获取结果hash,最终应用Base58校验编码对密钥进行编码。

     

    接下来一起了解如何使用JCE(java加密扩展),Bouncy Castle(RIPEMD-160)以及最后在bitcoinj库中使用Base58编码功能来完成所有这些工作。

     

    生成ECDSA密钥对

     

    BTC使用ECDSA代替RSA作为关键算法。生成如下:

     

    为Elliptic Curve算法创建KeyPairGenerator。

    KeyPairGenerator keyGen = KeyPairGenerator.getInstance("EC");

     

     

    利用指定椭圆曲线是secp256k1。

     

        ECGenParameterSpec ecSpec = new ECGenParameterSpec("secp256k1");

        keyGen.initialize(ecSpec);

     

    只要获取KeyPairGenerator,就能创建KeyPair即密钥对,从而得到公钥以及私钥。

     

        KeyPair kp = keyGen.generateKeyPair();

        PublicKey pub = kp.getPublic();

        PrivateKey pvt = kp.getPrivate();




    ECDSA私钥

     

    开发者能够对密钥的私有部分进行存储毕竟从私钥能够派生出公钥

     

        ECPrivateKey epvt = (ECPrivateKey)pvt;

        String sepvt = adjustTo64(epvt.getS().toString(16)).toUpperCase();

        System.out.println("s[" + sepvt.length() + "]: " + sepvt);

     

    静态方式adjustTo64()只对包含前导0的十六进制字符串经行填充所以总长度达到64个字符。

     

        static private String adjustTo64(String s) {

            switch(s.length()) {

            case 62: return "00" + s;

            case 63: return "0" + s;

            case 64: return s;

            default:

                throw new IllegalArgumentException("not a valid key: " + s);

            }

        }

     

    以上便是根据代码生成获取的示例私钥。

     

    s[64]: 024C8E05018319CED4BB04E184C307BFF115976A05F974C7D945B5151E490ADE

     

    上述这个值一般来说是由数字钱包存储的值。

     

    ECDSA公钥

     

    上述生成得到的密钥的公共部分被编码为BTC地址。第一步,ECDSA密钥根据椭圆曲线上的点表示。椭圆曲线上的X和Y坐标包括公钥在开头与“04”连接在一块表示公钥。

     

        ECPublicKey epub = (ECPublicKey)pub;

        ECPoint pt = epub.getW();

        String sx = adjustTo64(pt.getAffineX().toString(16)).toUpperCase();

        String sy = adjustTo64(pt.getAffineY().toString(16)).toUpperCase();

        String bcPub = "04" + sx + sy;

        System.out.println("bcPub: " + bcPub);

        # prints

        bcPub: 04CAAA5C0BDDAA22C9D3C0DDAEC8550791891BB2C2FB0F9084D02F927537DE4F443ACED7DEB488E9BFE60D6C68596E6C78D95E20622CC05474FD962392BDC6AF29

     

    执行SHA-256和RIPEMD-160 harsh

     

    因此当前必须在公钥上执行SHA-256,之后是RIPEMD-160。

     

        MessageDigest sha = MessageDigest.getInstance("SHA-256");

        byte[] s1 = sha.digest(bcPub.getBytes("UTF-8"));

        System.out.println("  sha: " + bytesToHex(s1).toUpperCase());

        # prints

          sha: 7524DC35AEB4B62A0F1C90425ADC6732A7C5DF51A72E8B90983629A7AEC656A0

     

    当前运用Bouncy Castle执行RIPEMD-160提供程序,毕竟JCE并无实现这种算法。

     

        MessageDigest rmd = MessageDigest.getInstance("RipeMD160", "BC");

        byte[] r1 = rmd.digest(s1);

     

    其次有必要在哈希开头添加一个0x00的版本字节。

     

        byte[] r2 = new byte[r1.length + 1];

        r2[0] = 0;

        for (int i = 0 ; i < r1.length ; i++) r2[i+1] = r1[i];

        System.out.println("  rmd: " + bytesToHex(r2).toUpperCase());

        # prints

          rmd: 00C5FAE41AB21FA56CFBAFA3AE7FB5784441D11CEC



    重复SHA-256哈希2

     

    咱们当前要对上结果执行2次SHA-256哈希。

     

        byte[] s2 = sha.digest(r2);

        System.out.println("  sha: " + bytesToHex(s2).toUpperCase());

        byte[] s3 = sha.digest(s2);

        System.out.println("  sha: " + bytesToHex(s3).toUpperCase());

     

    得出的2次散列结果的前4个字节用来作为地址校验和。它需要附加到上述的RIPEMD160哈希。得到25字节的BTC地址。

     

        byte[] a1 = new byte[25];

        for (int i = 0 ; i < r2.length ; i++) a1[i] = r2[i];

        for (int i = 0 ; i < 5 ; i++) a1[20 + i] = s3[i];

     

    运用Base58对地址执行编码

     

    当前需要运用bitcoinj库的Base58.encode()方式从而得到最后的BTC地址。(此演示文稿的代码仅用于学习,请勿将BTC发送到由该代码生成的BTC地址)

     

        System.out.println("  adr: " + Base58.encode(a1));

        # prints

          adr: 1K3pg1JFPtW7NvKNA77YCVghZRq2s1LwVF

     

     

    在这篇演示文稿中,可以生成btc地址的流程,即首先生成一个ECDSA密钥对,运用SHA256和RIPEMD160哈希密钥的公共部分。然后根据执行SHA256 2次并选择前4个字节用来计算校验和,该字节附加到上面的RIPEMD160哈希。结果运用Base58执行编码。

     

    随着数字货币的火热,市面上出现了5000+币种,Bitcoin钱包在币种资产存储、转账、支付等功能上无法满足用户多样化的需求,特别是交易所这种业务型系统,对于钱包功能性、token 支持以及地址管理、余额归集上要求更高,优盾钱包作为全球首款区块链企业钱包管理系统,支持全token,多资产多地址一键归集,实现了国际领先的防内鬼和防黑客技术,深受交易所、商城、游戏项目方的好评。


    优盾钱包,是目前国内最好用的企业钱包开放平台。API一键对接,支持当下多数主流币种、多资产多地址统一管理、用户提币初审+复核安全模式、系统代付自动放币、多员工多钱包多权限一键分配、资产交易查询、资金流动消息提醒等多种功能。

     

    防黑客技术上:

    API接口信息访问验签、基于HTTPS安全传输,拒绝被监听

    私钥不上传、不触网,并通过二次加密托管在客户端侧

    钱包绑定电脑MAC地址,拒绝非认证设备访问

    冷热钱包分离,大额资产用冷钱包离线保存


    防内鬼技术上:

    员工操作权限管理员一键设置

    员工操作记录管理员一键查询

    员工只接触管理独立小额子钱包

    超额转出交易需管理员复核

    员工在非公司指定电脑设备登录优盾账号需管理员同意


    便捷接入:

    ①免节点同步;

    ②标准接口;

    ③详细接口文档;

    ④接入DEMO;

    ⑤7*24小时技术支持。


    相关文章:

    1.细数交易所被盗史 如何避免交易所被盗黑天鹅

    2. 交易所接连被盗 交易所钱包如何选择

    3.币圈“黑科技”诞生,投资者重大利好!

    4.交易所系统3大升级计划公布!第2点中小客户必看


    在線客服

    申請試用

    申請試用

    設置