zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    cmd开启3389,无需重启!
    x86的控制寄存器CR0,CR1,CR2,CR3
    x64下fs的角色已经换成了gs
    在win64里,只有一种调用约定
    fs寄存器
    【转】C++ 编译器的函数名修饰规则
    windbg ida需要symbols
    WIN7-X64内核模式下编程实现导出表列表查看
    VS2010+WDK配置要点
    比特币 —— 学习笔记(一)
  • 原文地址:https://www.cnblogs.com/wangwangfei/p/8942013.html
Copyright © 2011-2022 走看看