bitcoinj 入门

bitcoinj的介绍:

  bitcoinj提供了一个与Bitcoin协议交互的类库。bitcoinj维护了一个钱包(wallet),以及发送/接收交易(transactions)的方法,此外还维护了许多其他的功能特点,将会在下面一一列举。

  Feature 1: 高度优化的简单支付验证(simplified payment verification,既SPV)。在这种模式下,只有一部分区块链会被下载到本地,这允许了bitcoinj运行在一些轻量级的设备上,例如智能手机或者是个人虚拟网络中。

  Feature 2:维护了一个加密的Wallet类,可以通过这个类进行费率计算,加签,生成秘钥(Key),插件化的比特币选择,持有比特币,这个类支持扩展,并且可以添加事件监听器。(后面会单独介绍这个类的)

  Feature 3:提供了一个简单的GUI Wallet 应用,可以通过这个自定义属于你自己的app

  Feature 4:提供一套实验性的完整验证模式,这个模式完成了和比特币核(Bitcoin core)一样的验证工作。在这个模式中,未被消费的交易(transaction)输出集合会被计算出来, 并且你可以通过PostgreSQL存储,用索引的方式通过地址(address)回溯整个账本的余额。

  Feature 5:支持小额交易渠道(micropayment channels),可以通过这个构建客户端和服务器端的多重签名的合约(multi-signature contract),然后就在这种渠道上进行更快速的小额交易,并且避免了费率问题。

  bitcoinj是由Java语言实现的,但是可以被运行再JVM上的其他语言所使用,例如Python或者 JavaScript。

 

bitcoinj 的组件

   bitcoinj 内置了日志(logging)和断言(assertions)。bitcoinj可以通过Maven或者Gradle的方式来进行构建。

   一个bitcoinj应用包含了一下一些模块:

   NetworkParameters 实例,提供了一个可选的生产或测试的网络环境

     Wallet实例,保存 ECKeys 和其他的数据

   PeerGroup实例,管理网络连接

   BlockChain实例,维护了让Bitcoin运行的一个全局的共享的数据结构

   BlockStore实例,存储了Block Chain的数据结构,例如存放在硬盘上

   WalletEventListener的实现,监听Wallet 事件

  一个基本的应用包括了以上几个模块,bitcoinj还提供了一个简化的 WalletAppKit 类,这个类创建了以上所有的对象,并且连接了各个模块的功能。

现在我们开始使用 WalletAppKit 构建一个程序

  首先,使用工具类的方法配置log4j

1 BriefLogFormatter.init();
2 if (args.length < 2) {
3     System.err.println("Usage: address-to-send-back-to [regtest|testnet]");
4     return;
5 }

 

  然后通过可选的命令行参数来选择需要的网络环境


 
bitcoinj项目富含完整demo 此项目使用maven构建,不会使用maven的同学,查看项目pom.xml文件,并在http://mvnrepository.com/下载相应的依赖jar包. demo:bitcoinj签名交易 /** * @param unSpentBTCList 未花费utxo集合 * @param from 发送者地址 * @param to 接收者地址 * @param privateKey 私钥 * @param value 发送金额.单位:聪 * @param fee 旷工费.单位:聪 * @return 签名之后未广播的原生交易字符串 * @throws Exception */ public static String signBTCTransactionData(List unSpentBTCList, String from, String to, String privateKey, long value, long fee) throws Exception { NetworkParameters networkParameters = null; // networkParameters = MainNetParams.get(); //测试网络 networkParameters = TestNet3Params.get(); Transaction transaction = new Transaction(networkParameters); DumpedPrivateKey dumpedPrivateKey = DumpedPrivateKey.fromBase58(networkParameters, privateKey); ECKey ecKey = dumpedPrivateKey.getKey(); long totalMoney = 0; List utxos = new ArrayList(); //遍历未花费列表,组装合适的item for (UnSpentBTC us : unSpentBTCList) { if (totalMoney >= (value + fee)) break; UTXO utxo = new UTXO(Sha256Hash.wrap(us.getTxid()), us.getVout(), Coin.valueOf(us.getSatoshis()), us.getHeight(), false, new Script(Hex.decode(us.getScriptPubKey()))); utxos.add(utxo); totalMoney += us.getSatoshis(); } transaction.addOutput(Coin.valueOf(value), Address.fromBase58(networkParameters, to)); // transaction. //消费列表总金额 - 已经转账的金额 - 手续费 就等于需要返回给自己的金额了 long balance = totalMoney - value - fee; //输出-转给自己 if (balance > 0) { transaction.addOutput(Coin.valueOf(balance), Address.fromBase58(networkParameters, from)); } //输入未消费列表项 for (UTXO utxo : utxos) { TransactionOutPoint outPoint = new TransactionOutPoint(networkParameters, utxo.getIndex(), utxo.getHash());
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值