`

用java简单分析下比特币区块链

阅读更多
我假设你已经对比特币的含义有一个模糊的概念,并且你对交易背后的机制有一个简单的理解:对地址进行支付(这是匿名的,因为它们不能直接链接到特定的个人),所有交易都是公开的。交易以块的形式收集,块在区块链中链接在一起。

你可以将区块链视为一个不断更新且可供所有人访问的大型数据库。你可以使用Bitcoin Core等软件下载完整的区块链。安装软件后,你的安装需要几周时间才能同步完成。请注意,在撰写本文时,区块链的大小超过130Gb,请考虑到这一点......

如果你有可用的区块链数据(不一定是整个区块链,你也可以使用它的子集),可以使用Java进行分析。你可以从头开始完成所有工作并从文件中读取原始数据等。让我们跳过此步骤并改为使用库。大多数编程语言都有几种选择。我将使用Java和bitcoinj库。这是一个大型库,可用于构建钱包,在线支付等应用程序。我将使用它的解析功能。

首先在https://bitcoinj.github.io/下载该库的jar文件(我正在使用https://search.maven.org/remotecontent?filepath=org/bitcoinj/bitcoinj-core/0.14.4/bitcoinj-core-0.14.4-bundled.jar)。然后,下载SLF4J,解压缩,然后获取名为slf4j-simple-x.y.z.jar的文件(在我的例子中:slf4j-simple-1.7.25.jar)。将这两个jar文件添加到类路径中,你就可以开始了。

让我们从一个简单的例子开始:计算(然后绘制)每天的交易数量。这是代码,注释很多。

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.LinkedList;
import java.util.List;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
 
import org.bitcoinj.core.Block;
import org.bitcoinj.core.Context;
import org.bitcoinj.core.NetworkParameters;
import org.bitcoinj.core.Transaction;
import org.bitcoinj.params.MainNetParams;
import org.bitcoinj.utils.BlockFileLoader;
 
 
public class SimpleDailyTxCount {
 
    // Location of block files. This is where your blocks are located.
    // Check the documentation of Bitcoin Core if you are using
        // it, or use any other directory with blk*dat files. 
    static String PREFIX = "/path/to/your/bitcoin/blocks/";
 
        // A simple method with everything in it
    public void doSomething() {
 
        // Just some initial setup
        NetworkParameters np = new MainNetParams();
        Context.getOrCreate(MainNetParams.get());
 
        // We create a BlockFileLoader object by passing a list of files.
        // The list of files is built with the method buildList(), see
        // below for its definition.
        BlockFileLoader loader = new BlockFileLoader(np,buildList());
 
        // We are going to store the results in a map of the form 
                // day -> n. of transactions
        Map<String, Integer> dailyTotTxs = new HashMap<>();
 
        // A simple counter to have an idea of the progress
        int blockCounter = 0;
 
        // bitcoinj does all the magic: from the list of files in the loader
        // it builds a list of blocks. We iterate over it using the following
        // for loop
        for (Block block : loader) {
 
            blockCounter++;
            // This gives you an idea of the progress
            System.out.println("Analysing block "+blockCounter);
 
            // Extract the day from the block: we are only interested 
                        // in the day, not in the time. Block.getTime() returns 
                        // a Date, which is here converted to a string.
            String day = new SimpleDateFormat("yyyy-MM-dd").format(block.getTime());
 
            // Now we start populating the map day -> number of transactions.
            // Is this the first time we see the date? If yes, create an entry
            if (!dailyTotTxs.containsKey(day)) {
                dailyTotTxs.put(day, 0);
            }
 
            // The following is highly inefficient: we could simply do
            // block.getTransactions().size(), but is shows you
            // how to iterate over transactions in a block
            // So, we simply iterate over all transactions in the
            // block and for each of them we add 1 to the corresponding
            // entry in the map
            for ( Transaction tx: block.getTransactions() ) {               
                dailyTotTxs.put(day,dailyTotTxs.get(day)+1);
            }
        } // End of iteration over blocks
 
        // Finally, let's print the results
        for ( String d: dailyTotTxs.keySet()) {
            System.out.println(d+","+dailyTotTxs.get(d));
        }
    }  // end of doSomething() method.
 
 
    // The method returns a list of files in a directory according to a certain
    // pattern (block files have name blkNNNNN.dat)
    private List<File> buildList() {
            List<File> list = new LinkedList<File>();
            for (int i = 0; true; i++) {
                File file = new File(PREFIX + String.format(Locale.US, "blk%05d.dat", i));
                if (!file.exists())
                    break;
                list.add(file);
            }
        return list;
    }
 
 
    // Main method: simply invoke everything
    public static void main(String[] args) {
        SimpleDailyTxCount tb = new SimpleDailyTxCount();
        tb.doSomething();
    }
 
}

此代码将在屏幕上打印“日期,交易次数”形式的值列表。只需将输出重定向到文件并绘制它。你应该得到这样的东西(注意每日交易数量几乎呈指数增长):

我对这个库的性能印象非常深刻:使用上面的代码扫描整个区块链在我的笔记本电脑(2014 MacBook Pro)上花了大约35分钟,区块链存储在使用USB2端口连接的外部HD上。它最多占用了一个处理器和1 Gb RAM的大约100%。

一个稍微复杂的例子花了55分钟:计算交易规模的每日分布。这需要在上面的代码中添加另一个循环来检索所有交易输出(以及沿途的一些计数器)。区间是0-10美元,10-50美元,50-200美元,200-500美元,500-2000美元,2000+USD。

======================================================================

分享一些以太坊、EOS、比特币等区块链相关的交互式在线编程实战教程:

  • java以太坊开发教程,主要是针对java和android程序员进行区块链以太坊开发的web3j详解。
  • python以太坊,主要是针对python工程师使用web3.py进行区块链以太坊开发的详解。
  • php以太坊,主要是介绍使用php进行智能合约开发交互,进行账号创建、交易、转账、代币开发以及过滤器和交易等内容。
  • 以太坊入门教程,主要介绍智能合约与dapp应用开发,适合入门。
  • 以太坊开发进阶教程,主要是介绍使用node.js、mongodb、区块链、ipfs实现去中心化电商DApp实战,适合进阶。
  • C#以太坊,主要讲解如何使用C#开发基于.Net的以太坊应用,包括账户管理、状态与交易、智能合约开发与交互、过滤器和交易等。
  • EOS教程,本课程帮助你快速入门EOS区块链去中心化应用的开发,内容涵盖EOS工具链、账户与钱包、发行代币、智能合约开发与部署、使用代码与智能合约交互等核心知识点,最后综合运用各知识点完成一个便签DApp的开发。
  • java比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在Java代码中集成比特币支持功能,例如创建地址、管理钱包、构造裸交易等,是Java工程师不可多得的比特币开发学习课程。
  • php比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在Php代码中集成比特币支持功能,例如创建地址、管理钱包、构造裸交易等,是Php工程师不可多得的比特币开发学习课程。
  • tendermint区块链开发详解,本课程适合希望使用tendermint进行区块链开发的工程师,课程内容即包括tendermint应用开发模型中的核心概念,例如ABCI接口、默克尔树、多版本状态库等,也包括代币发行等丰富的实操代码,是go语言工程师快速入门区块链开发的最佳选择。

这里是原文用java简单分析下比特币区块链

分享到:
评论

相关推荐

    区块链java简单的demo

    原来看到一个python版本的dome下载下来边理解边转换成了java代码 有助于java理解区块链

    区块链技术学习-go语言开发

    因为比特币系统是区块链技术中的一个应用,很多技术人员学习区块链都是先从比特币系统学习进行入门的。为了便于理解,不同的程序语言方向的技术人员使用不同的语言根据中本聪比特币系统的源码机制从原理上实现了不同...

    区块链相关编程语言

    例如,比特币就是使用C++编写的。C++允许开发者深入底层进行优化,这对于确保区块链的性能至关重要。 #### JAVA开发语言 Java是一种广泛使用的面向对象的编程语言,其设计理念旨在简化编程过程并提高代码的可重用...

    区块链java代码实现

    在比特币中,每个块中都包含了所有交易的集合签名,这个签名就是用 Merkle Tree 实现的,Merkle 树用于比特币以汇总块中的所有事务,产生整个事务集合的整体数字指纹,提供非常有效的过程来验证事务是否包括在块中。...

    基于区块链的茶叶可信溯源系统的设计与实现.pdf

    自从2008年神秘人物“中本聪”发表了关于比特币的奠基性论文后,区块链技术开始逐渐进入公众视野,并在随后的几年里不断发展变化,形成了多种不同的应用模式。如今,区块链已经与物品追溯、医疗信息管理等众多领域...

    bitcoin-rpc.jar.zip

    "bitcoin-rpc.jar"是一个Java库,专门为开发者提供了一种简单的方式来与比特币节点进行RPC通信。这个库使得开发者能够利用Java语言的便利性,实现对比特币网络的各种操作,如创建交易、查询余额、发送交易等,无需...

    精品--个人简历模板vue版本,本人为区块链开发工程师、Java后端开发工程师、全栈工程师,欢迎HR来撩,也欢迎小伙.zip

    作为“区块链开发工程师”,这个个人简历的创建者可能拥有在分布式账本技术方面的专业知识,包括理解比特币、以太坊等主流区块链平台,熟悉智能合约开发(如Solidity),以及掌握区块链的安全性和隐私保护机制。...

    从甲骨文到区块链.pdf资源

    - **发展历程**:区块链最初是作为比特币的基础技术出现的,随着时间的推移,其应用范围不断扩展,包括供应链管理、数字身份验证等多个领域。 - **技术特点**:区块链的核心特点是去中心化、透明性和安全性。它通过...

    区块链

    这个概念最初是为比特币设计的,但现在已经被广泛应用于金融、物联网、供应链管理、智能合约等多个领域。 区块链的核心特性包括去中心化、共识机制、安全性以及可扩展性。去中心化意味着没有中央权威机构控制整个...

    java 加解密算法 BouncyCastle加解密包15on-1.60

    RipeMD160是一种广泛用于创建数字指纹的哈希函数,尤其在比特币等区块链系统中有着重要应用。Java标准库并不直接支持RipeMD160,而BouncyCastle则填补了这个空白,使得开发者可以在Java项目中轻松使用这种哈希算法。...

    EC.zip_ecc_ecc java_java ecc_zip

    总的来说,这个压缩包提供了一个用Java编写的ECC库,包含椭圆曲线域、点、加密/解密操作以及参数的实现。这个库可能被用于开发需要高效安全加密功能的项目,例如移动通信、物联网设备、区块链应用等。开发者可以通过...

    openassetsj:Java开放资产协议的实现

    其中,开放资产协议(Open Assets Protocol)是基于比特币区块链的一种标记化协议,允许用户在比特币网络上创建和管理数字资产。本文将深入探讨`openassetsj`,这是一个用Java语言实现的开放资产协议的库,旨在为...

    java web3j 直连以太坊节点 区块数据解析

    该工程通过java web3j 直连以太坊节点(可自建或使用免费节点) 进行区块数据解析 支持数据进行mysql存储

    技术学习全网最全资料合集(3).docx

    4. **区块链技术**:区块链是分布式账本技术,学习内容包括比特币、以太坊的基础原理、智能合约的编写、共识机制的理解以及区块链的安全性、隐私保护等。 5. **前端技术**:前端开发主要围绕HTML、CSS、JavaScript...

    20+张高清技能图谱_IT开发.zip

    从比特币的基础到以太坊智能合约,再到分布式账本和共识算法,图谱将帮助你理解和掌握区块链的运作机制,为进入区块链行业奠定坚实基础。 人工智能技术图谱涵盖机器学习、深度学习、自然语言处理等多个子领域。从...

    关键技术片段常见问题解答:此存储库将包含基于人工智能,机器学习,大数据,区块链,云计算,数据科学,Android等领域的所有与关键技术相关的摘要。

    - 加密货币,如比特币,是区块链技术的一个应用,它通过共识机制确保交易安全。 5. **云计算**: - 云计算提供了通过互联网访问的计算资源,包括IaaS(基础设施即服务)、PaaS(平台即服务)和SaaS(软件即服务)...

    新版人民币宣传总结.pdf

    随着科技的进步,数字货币如比特币等逐渐受到关注,而传统银行系统也在探索如何利用区块链等技术改进支付流程。虽然这次活动并未直接涉及这些技术,但它提醒我们金融领域与IT技术的紧密联系。 2. **增强现实(AR)...

Global site tag (gtag.js) - Google Analytics