• bitcoinj学习记录


    一、密码学相关资料

    使用Bouncy Castle生成数字签名、数字信封

    ECDH and ECDSA(ECC椭圆曲线算法3)

    数字签名算法RSA与 ECDSA的比较与分析

    Java密码学 非对称加密以及使用secp256k1进行数字签名(ECDSA),也适合Android(上) 

    外国程序员大佬教你做一个——“Bitcoin(比特币)”的工作库

    ASN.1概述及数据类型详解

    ASN.1笔记——标准编码规则BER

    二、第三方类库

    <dependency>
                <groupId>com.madgag.spongycastle</groupId>
                <artifactId>core</artifactId>
                <version>1.52.0.0</version>
    </dependency>
    <dependency>
                <groupId>com.google.guava</groupId>
                <artifactId>guava</artifactId>
                <version>25.0-jre</version>
    </dependency>

    三、源码摘要说明

    PeerGroup--->Peer--->Wallet(CoinSelector ,KeyChainGroup,KeyChain ,ECKey , KeyCrypter)

    --->Transaction--->Block--->BlockChain

    org.bitcoinj.core.NetworkParameters:

    public static final int TARGET_TIMESPAN = 14 * 24 * 60 * 60;  // 2 weeks per difficulty cycle, on average.
    public static final int TARGET_SPACING = 10 * 60;  // 10 minutes per block.
    public static final int INTERVAL = TARGET_TIMESPAN / TARGET_SPACING;   
    
        
    /**
    * The maximum number of coins to be generated
    */
    public static final long MAX_COINS = 21000000;

     createGenesis - 创世区块

    org.bitcoinj.core.AbstractBitcoinNetParams

    public static final int REWARD_HALVING_INTERVAL = 210000;//奖励减半周期

    isRewardHalvingPoint

    isDifficultyTransitionPoint

    checkDifficultyTransitions

    org.bitcoinj.core.Block:

    solve - 挖矿算法

    checkProofOfWork - 工作量证明算法

    getDifficultyTargetAsInteger - 获取区块难度目标

        /** Height of the first block */
        public static final int BLOCK_HEIGHT_GENESIS = 0;//The genesis block has a height of zero.
    /**
         * <p>A utility method that calculates how much new Bitcoin would be created by the block at the given height.
         * The inflation of Bitcoin is predictable and drops roughly every 4 years (210,000 blocks). At the dawn of
         * the system it was 50 coins per block, in late 2012 it went to 25 coins per block, and so on. The size of
         * a coinbase transaction is inflation plus fees.</p>
         *
         * <p>The half-life is controlled by {@link org.bitcoinj.core.NetworkParameters#getSubsidyDecreaseBlockCount()}.
         * </p>
         */
        public Coin getBlockInflation(int height) {
            return FIFTY_COINS.shiftRight(height / params.getSubsidyDecreaseBlockCount());
        }
        /**
         * Returns the work represented by this block.<p>
         *
         * Work is defined as the number of tries needed to solve a block in the
         * average case. Consider a difficulty target that covers 5% of all possible
         * hash values. Then the work of the block will be 20. As the target gets
         * lower, the amount of work goes up.
         */
        public BigInteger getWork() throws VerificationException {
            BigInteger target = getDifficultyTargetAsInteger();
            return LARGEST_HASH.divide(target.add(BigInteger.ONE));
        }

    org.bitcoinj.core.AbstractBlockChain:

    OrphanBlock:孤块

    // 将区块加入到区块链中

    private boolean add(Block block, boolean tryConnecting,
                            @Nullable List<Sha256Hash> filteredTxHashList, @Nullable Map<Sha256Hash, Transaction> filteredTxn)
                throws BlockStoreException, VerificationException, PrunedException {
    //......
    // Try linking it to a place in the currently known blocks.
    
                if (storedPrev == null) {
                    // We can't find the previous block. Probably we are still in the process of downloading the chain and a
                    // block was solved whilst we were doing it. We put it to one side and try to connect it later when we
                    // have more blocks.
                    checkState(tryConnecting, "bug in tryConnectingOrphans");
                    log.warn("Block does not connect: {} prev {}", block.getHashAsString(), block.getPrevBlockHash());
                    orphanBlocks.put(block.getHash(), new OrphanBlock(block, filteredTxHashList, filteredTxn));
                    return false;
                } else {
                    checkState(lock.isHeldByCurrentThread());
                    // It connects to somewhere on the chain. Not necessarily the top of the best known chain.
                    params.checkDifficultyTransitions(storedPrev, block, blockStore);
                    connectBlock(block, storedPrev, shouldVerifyTransactions(), filteredTxHashList, filteredTxn);
                }
    //......
    
    
    }

    tryConnectingOrphans - 孤块处理

    org.bitcoinj.core.Peer:

    processMessage - 消息处理

    org.bitcoinj.wallet.Wallet:

    1、变量定义

    2、构造函数

    3、私钥管理 - Key Management

    4、序列化支持 - Serialization support

    5、Inbound transaction reception and processing

    6、Event listeners

    7、Vending transactions and other internal state

    8、Balance and balance futures

    9、Creating and sending transactions

    10、Reorganisations

    11、Bloom filtering

    12、Extensions to the wallet format

    13、Fee calculation code

    14、Wallet maintenance transactions

  • 相关阅读:
    Algorithms
    STL学习笔记 set
    HttpContext.Current
    Luence初始与简单应用Document的增删改查.
    [深入浅出Cocoa]iOS程序性能优化
    spring.net结合普通三层(实现IOC 及AOP中的异常记录功能)
    VS版权信息插件——初试VS插件开发小记
    快速开发平台 Putdb WebBuilder 6.9
    ObjectiveC学习及iOS开发的准备
    Visual Studio 2012 Update 2 自制iso下载
  • 原文地址:https://www.cnblogs.com/wangwangfei/p/8942013.html
Copyright © 2020-2023  润新知