主页 > imtoken钱包下载注册教程 > 如何使用bitcoinj开发java比特币应用

如何使用bitcoinj开发java比特币应用

imtoken钱包下载注册教程 2023-05-02 05:23:09

当你想使用java开发比特币应用程序,或者希望将应用程序与比特币进行连接时,Bitcoinj是最好的选择。 它是最早和最成熟的比特币java开发包。 bitcoinj包含了比特币规范的大部分实现,如密钥、地址、脚本、SPV协议等。使用bitcoinj可以快速开发支持比特币的Java应用,如交易所、比特币钱包、安卓手游等。

bitcoinj的功能还是挺丰富的,就是文档不太好懂。 学习bitcoinj最好的方法是汇智网的在线互动教程《Java比特币开发详解》。 本文内容节选自本课程。

什么是比特币?

当我们谈论比特币时,实际上在不同的场景中有不同的参考。

比特币首先是一种数字加密货币。 用户可以像传统货币一样,通过比特币网络进行比特币转账或商品结算:

然而,比特币是一种基于密码学的虚拟货币。 它没有实体,仅隐含在从发送方到接收方的交易中。 接收方必须使用它持有的密钥来消费接收到的比特币。

对于技术从业者来说,比特币还有更多的意义:比特币对应一个划时代的数字加密货币体系比特币密钥没有了还有用吗,包括通信协议、激励机制、实现代码和承载网络等:

事实上,比特币是密码学技术、分布式计算等领域数十年的集大成者。 它不是第一个出现的数字货币,但无疑是最成功的,一种洞察人性的虚拟产品。

区块链结构

比特币是一个专用的数据库,它只保存一种数据记录——交易,比如张三给李四转了几个币,或者李四给王五转了几个币:

谈到钱,每个人都会变得谨慎。 所以,最好从技术上保证交易记录不可篡改,万一出了问题,可以查到旧账,这就要求账本必须是可信的。

比特币使用特殊的数据结构blockchain/Blockchain来保证交易不可篡改。 每个包含一批交易数据的区块也包含前一个区块的指纹:

在比特币中,块的指纹是使用密码学中常见的哈希函数获得的。 哈希函数可以将一大块数据压缩成紧凑的表示形式,并且可以保证如果紧凑表示形式不同,对应的原始数据也不同。

比如上图中的12#区块被攻击者篡改,那么它的哈希结果就会和13#区块中保存的原始指纹不同,这使得识别被篡改区块的任务变得容易,换句话说,篡改非常困难——攻击者必须同时修改12#之后的所有块,才能保证指纹验证成功。

另一方面,如果攻击者直接篡改区块 14#(我们假设这是最后一个区块),那么显然是可行的,因为它缺少之后更多区块的保护。 这就引入了比特币中常用的一个概念:交易确认数/Confirms。

一笔交易一旦被确认打包成一个区块,它的确认数就是1,每增加一个区块,确认数就增加1。 例如上图中标记的交易,当链增长到14#区块时,这笔交易的确认数为3。

显然,交易获得的确认越多,攻击者篡改交易的可能性就越小。 在比特币的应用中,交易的接收方通常需要六次确认才能认为交易成功。

分权机制

与目前流通的任何法币不同,比特币是去中心化的,没有中央机构来管理比特币的发行和流通。 因此,比特币网络是一个典型的 P2P 网络,其中每个(全)节点都有完整的区块链数据:

在这样的分布式计算环境中比特币密钥没有了还有用吗,如何保证新交易在每个节点的区块链中一致更新,是一个经典的分布式一致性问题——每个节点都可能提交新交易,但不同节点提交的交易也可能不同,哪个节点为准?

解决这个问题的经典方法是(动态地)选举一个决策者,其他节点可以复制决策者的行为,以避免节点之间的不一致。 比特币的解决方案是一样的,但它采用了一种类似于rush answer的机制来动态选择获胜节点,获胜节点负责生成区块和打包交易——所有节点同时解决同一个问题,并且最先得到结果的节点获胜,获得出块权,其他节点轮流解决下一个出块问题:

比特币给出的问题无法用解析的方法来解决。 节点必须在所有可能的结果中尝试暴力解决。 由于获胜的节点可以获得比特币奖励,因此该节点的动机和行为与淘金的西方牛仔颇为相似。 因此,这个求解过程称为挖矿/Mining。

理论上每个节点都有一定的获胜概率,但显然,在同一时间段内,算力强大的节点会比其他节点有更多的尝试机会,因此获胜的概率也更大——在这种抢答下机制,算力代替了智能,这种靠暴力解决问题来达成节点共识的共识算法被称为Proof of Work。

课程内容

本课程适合想要开发比特币应用程序的Java工程师。 涵盖了比特币的基本概念、工作原理、应用开发接口、离线密钥管理、分层确定性钱包、裸交易等内容。

第一章比特币概述

主要介绍比特币的基本概念和核心工作原理。

第 2 章 你好,比特币

本章主要介绍如何使用现有软件操作比特币,如创建地址、转账、查询余额、浏览区块等,并介绍比特币应用中的核心概念,如钱包、交易、UTXO等。

第 3 章 使用 RPC 访问比特币网络

本章主要介绍如何在程序代码中使用节点软件的RPC API接口访问比特币网络,进行转账、创建地址、余额查询等操作。 同时给出了网站支持比特币支付的简单解决方案。

第 4 章 自己管理密钥和地址

本章主要介绍如何离线管理密钥和地址,并详细解释了比特币中的脚本及其与地址和认证的关系。 如果您想为您的应用程序添加类似钱包的功能,本节将使您受益匪浅。

第 5 章 使用分层确定性钱包

本章主要介绍应用广泛的分层确定性钱包,并详细说明如何在程序代码中应用。 如果您需要管理大量密钥和地址,分层确定性钱包应该会有所帮助。

第六章 离线构建裸交易

本章主要介绍裸交易的功能以及如何在程序代码中创建裸交易。 如果您需要使用第三方节点广播您的比特币交易,那么裸交易是您唯一的选择。

第 7 章 使用 SPV 节点

本章讲解bitcoinj的SPV节点实现机制和核心组件。 SPV节点是轻量级的比特币节点实现,不需要下载完整的区块,因此非常适合在手机上实现比特币钱包,或者其他不想使用全节点的场景。

课程代码示例:使用 bitcoinj 生成比特币地址

在比特币网络中,地址的作用是接收以太币,并以 UTXO 的形式留在交易中等待被消费。 所以地址最初与密钥相关联:因为密钥对应于某些用户/身份。 在比特币的演进过程中,先后出现了几种形式的地址,但核心始终如一:识别目标用户/身份。

Bitcoinj 可用于非常简单地离线生成比特币地址。 例如,以下代码生成 P2PKH 地址:

NetworkParameters params = RegTestParams.get();
ECKey key = new ECKey();
Address addr = new Addr(params,key.getPubKeyHash());
System.out.format("p2pkh address => %sn",addr.toString());

由于密钥和P2PKH是一一对应的,ECKey也提供了直接返回P2PKH地址的方法,例如:

Address addr = key.toAddress(params);

从上面的示例代码我们可以看出bitcoinj开发API的设计非常清晰易懂。 它只需要一点指导。 相信你能很快掌握用bitcoinj开发java比特币应用的方法!