本文的方案无需自建节点,因为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.bitcoinjgroupId> <artifactId>bitcoinj-coreartifactId> <version>0.14.5.2version> 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