[币严区块链]BitcoinCash - BCH钱包地址生成与扫块充值监控(JAVA版)

本文的方案无需自建节点,因为BCH当前区块数据大小已经达到200G以上,BTC区块数据也已超过300G,若每个币都自建节点,对云服务器的消耗会非常大。

认识BitcoinCash(BCH)

Bitcoin Cash(BCH)是比特币的分叉币,与比特币相同,是一种基于去中心化,采用点对点网络与共识主动性,开放源代码,以区块链作为底层技术的加密货货币。比特币社区围绕扩容问题争论了三年之久,终于在2017年8月1日,比特币现金在区块高度478558执行硬分叉,按照比特币1:1分发,总量2100万,删除隔离见证、区块上限升级为8M,后升级为32M,通过链上扩容解决了旧版比特币系统中手续费高、确认慢、实用性差等问题,履行比特币作为「点对点电子现金」的承诺。

BCH的源头最早可以追溯到2008年,中本聪发表了白皮书《比特币:一种点对点的电子现金系统》,白皮书中构建了一个基于P2P网络传输的去中心化货币体系,相比于法币体系它排除了第三方信任机制的引入。随着比特币的用户群体进一步扩大,1M区块大小无法承载日益增加的交易量,比特币网络开始出现拥堵,手续费过高,交易长时间无法打包等情况。

社区中开始出现了扩容的声音,而以核心开发者Core为代表的小区块者们则是希望用过隔离见证+闪电网络的方式缓解比特币的拥堵问题。

社区矛盾逐渐无法调和,同时硬分叉的声音也愈演愈烈,最终在矿工的主导下完成了硬分叉,比特币社区自此一分为二。

至于当前正在进行的BCH ABC与 BCH SV的算力竞争,我们先不管了。本文主要介绍BCH ABC的对接方式。

认识BCH新地址

1、新的地址到底是什么样子?

它将以下面这种形式展现出来,举个例子:

bitcoincash:qpm2qsznhks23z7629mms6s4cwef74vcwvy22gdx6a

2、旧的遗留地址还能用吗?

是可以用的。不过还是强烈的建议升级成为新的地址。如果您有一个当前正在使用的遗留地址,它将继续工作。但是对于大多数用户而言,应该升级成为新的地址,因为新的地址会更加安全。此外,当每个人都使用相同的格式的时候,用户体验将会得到增强。

3、我可以从旧的地址发送到新的地址吗?

可以。地址格式只是一个编码。打个比方,可以把编码看成一种包装或者是衣服。就像不管你穿什么衣服都可以随时和你的朋友聊天一样,不管是旧的地址还是新的地址,那层“衣服”下面都是原始公钥散列值(pubkeyHash)。

4、当我试着将我的比特币现金转移到新的地址中是,但是交易所或者钱包不让我这样做,这是为什么?

如果一个钱包还没有升级,那它就不支持新的地址格式。不过不用担心,这个问题是可以很容易解决的。您可以通过地址转换工具将旧的地址格式转换成新的地址格式。有好几种转换工具都可以用。推荐

https://cashaddr.bitcoincash.org/

5、从旧地址到新地址是否有一对一的“映射”?

是的,任何遗留的比特币地址格式都将转换为一个并且只有一个CashAddr格式,反之亦然。因此,任何给定地址都有两个版本(legacy和CashAddr),它们是可以互换的,因为它们对应于同一组私钥和公共密钥。

6、如果我将一个旧的地址转换成新的格式,并将这些比特币现金发送给我的朋友,但他的钱包不支持这种新格式,会发生什么情况呢?

没关系。钱仍然会出现在他的旧地址(因为地址其实是一样的,只不过编码方式不同)。

7、为什么比特币现金开发社区决定创建一个新的地址格式?

比特币现金作为一种独特的分类账本和加密货币,应该拥有独一无二的地址格式。而且使用独特的地址格式可以减少用户的错误和混淆。

8、这种特殊地址格式的好处是什么?

除了提供不同的地址格式之外,新格式不区分大小写,这使得地址更容易在人们之间编写和传达。而且它也是可扩展的,当比特币现金在未来添加更多新的功能时也不需要改变地址格式了。

如何生成BCH地址?

需要依赖的项目:https://github.com/bitcoincash-wallet/bitcoinj  分支选择 addsingedinputs

操作步骤:

一、建立Maven工程,在pom.xml中导入以下依赖:

<dependency>
      <groupId>cash.bitcoinj</groupId>
      <artifactId>bitcoinj-core</artifactId>
      <version>0.14.5.2</version>
</dependency>

二、任意新建一个类(包含static main函数),例如:

class Test{
  public static void main(String[] args){
     // 获取网络参数
     NetworkParameters params  = MainNetParams.get(); 
        // 新建bch.wallet钱包文件(该文件存储私钥)
        final File walletFile = new File("bch.wallet");
        // 该段代码每次都用新建钱包文件的方式创建钱包,首次运行可用这种方式生成bch.wallet文件
        Wallet wallet = new Wallet(walletFile);

     // 以下代码用于已经创建过bch.wallet,读取钱包文件使用
        //try {
        //    wallet = Wallet.loadFromFile(walletFile);
        //} catch (UnreadableWalletException e) {
        //    e.printStackTrace();
        //    return MessageResult.error(500,"error:" + e.getMessage());
        //}
        // 新建密钥对
        ECKey key = new ECKey();
        // 通过网络参数获取地址
        Address address = key.toAddress(params);

     // 打印钱包地址
     System.out.println("生成的钱包地址:" + address.toBase58());

        // 将密钥对导入钱包文件
        wallet.importKey(key);
        
        try {
       // 保存秘钥到钱包文件
            wallet.saveToFile(walletFile);
        } catch (IOException e) {
            e.printStackTrace();
        }
  }
}

上述代码以最简单的方式演示了如何生成地址,具体健壮性需要编码者自己认证完善。

如何扫块监听充值?

由于我们不打算自建节点,那么如果有很多地址,就需要去检测是否有充值,这里我们使用扫块的方式,一旦发现某个收账地址属于我们,我们就发起充值提醒,或写入数据库中的用户余额表。

扫块主要是通过区块链浏览器获取,市面上有很多区块链浏览器,我们可以选择适合自己的,这里演示的使用的区块链浏览器是:

https://bch.btc.com/

API文档是:

https://bch.btc.com/api-doc

比如我们可以通过API接口:https://bch-chain.api.btc.com/v3/block/latest/tx,来获取最新区块里包含的交易:

上图是用Chrome调试工具获取到的json格式数据,这个里面我们可以看到outputs -> addresses里面就是到账的地址。

具体编码细节这里就不做延伸了,无非就是通过HttpUtli发起请求,获取json数据,然后解析json数据即可。

BIZZAN(币严) 数字货币交易所官方网址:

www.bizzan.com

 

币严区块链技术交流QQ群:

811249099

 

猜你喜欢

转载自www.cnblogs.com/bizzan/p/11528649.html