您的位置:网站首页 > DAO/DAPP钱包软件 > 正 文 比特币

一个唯一实现Bitcoin客户端节点的Java程序

【作者:网文】 来源:转载 日期:2012-3-12 22:25:39 人气: 标签:Bitcoin 【打印】

 
/ *
 * 2011年谷歌公司
 *
 *许可下在Apache许可证2.0版(以下简称“许可证”);
 *您不得使用除符合许可文件。
 *您可能获得执照副本
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 *除非适用法律要求或书面同意,软件
 *根据许可证分发,分发“AS IS”基础上,
 *没有任何形式的担保或条件,明示或暗示。
 *请参阅许可和管辖权限的具体语言
 *根据许可证的限制。
 * /

封装COM 谷歌bitcoin 例子toywallet ;

进口COM 谷歌bitcoin 核心;
进口COM bitcoin 发现DnsDiscovery ;
进口COM 谷歌 bitcoin 商店BoundedOverheadBlockStore ;
进口COM 谷歌bitcoin utils的BriefLogFormatter ;
进口BouncyCastle的UTIL 编码器六角;

进口javax 摆动*。;
进口的Java AWT *。
导入的Java io的文件;
进口的Java IO IOException异常;
进口的Java 数学
进口的Java 的InetAddress ;
进口的Java util的ArrayList的;
导入的Java util的日期;
导入的Java util的名单;
进口的Java util的设置;

/ **
 * GUI演示,让你看收到的交易,因为他们积累信心。
 * /
公共 ToyWallet {
    私人的 最后 TxListModel txListModel =的 TxListModel ();
    私人 txList ;
    私人 NetworkParameters 的params ;
    私人 钱包钱包;
    私营 等组等组;
    私人 BlockChain ;
    私人 的JLabel networkStats ;
    私人 文件walletFile ;
    私人 的JScrollPane txScrollPane ;

    公共 静态 无效的主要字符串[] ARGS 抛出 异常 {
        BriefLogFormatter 的init ();
        ToyWallet 参数);
    }
   
    :公共 ToyWallet 布尔testnet 的String [] ARGS 抛出 异常 {
        / /设置1 Bitcoin连接+空的钱包。TODO:在这个用例的简化的设置。
        如果 testnet {
            的params的= NetworkParameters testNet ();
        } 否则 {
            的params的= NetworkParameters prodNet ();
        }

        / /尝试读取存储钱包,创建一个新的,如果没有可能。
        布尔freshWallet = FALSE ;
        walletFile = 新的 文件“toy.wallet” );
        尝试 {
            钱包= 钱包loadFromFile walletFile );
        } 赶上 IOException异常e )条 {
            钱包 的params );

            / /允许用户在命令行上指定的第一个关键:
            / /十六进制编码的关键:创建时间秒
            ECKey 的关键;
            参数长度> 0 {
                尝试 {
                    的String [] 部分= ARGS [ 0 ]。分裂“:” );
                    字节] pubKey = 六角解码部分[ 0 ]);
                    关键= ECKey pubKey )的;
                    creationTimeSeconds = parseLong 部分[ 1 ]);
                    关键setCreationTimeSeconds creationTimeSeconds );
                    系统出来的println 字符串格式“使用命令行%s的地址,在%s上创建”
                        关键,toAddress 的params )。的toString (), 新的 日期creationTimeSeconds * 1000 )。的toString ()));
                } 渔获 例外E2 {
                    系统犯错 +
                        “在与冒号之间的附加 ​​秒的时间:” + E2 的toString ());
                    返回;
                }
            } 否则 {
                键= ECKey ();  / /生成一个新的关键。
            }
            钱包钥匙扣添加);
           
            钱包的SaveToFile walletFile );
            freshWallet = ;
        }
        系统出来的println “发送到:” + 钱包钥匙扣0 )。toAddress 的params ));
        系统出来的println 钱包);

        文件blockChainFile = 文件“toy.blockchain” );
        (!blockChainFile EXISTS () && freshWallet {
            / /块链,但我们有一个钱包。所以空了钱包的交易,所以,当我们重新扫描
            / /块有没有问题(钱包不支持没有被掏空的重播)。
            钱包clearTransactions 0 );
        }
        链=, BlockChain 的params 钱包,: BoundedOverheadBlockStore 的params blockChainFile ));

        等组 的params );
        等组setUserAgent “ToyWallet” “1.0” );
        如果 testnet {
            等组addAddress PeerAddress InetAddress的 );
            等组addAddress PeerAddress InetAddress的 );
        } 否则 {
            等组addPeerDiscovery DnsDiscovery 的params ));
        }
        等组addWallet 钱包);
        等组setFastCatchupTimeSecs 钱包getEarliestKeyCreationTime ());

        / /手表的同龄人来来去去,所以我们可以更新UI。
        等组的addEventListener AbstractPeerEventListener () {
            @覆盖
            公共 无效onPeerConnected 同行同行 peerCount {
                onPeerConnected的同侪peerCount );
                triggerNetworkStatsUpdate ();
            }

            @覆盖
            公共 无效onPeerDisconnected 同行同行 peerCount {
                onPeerDisconnected的同侪peerCount );
                triggerNetworkStatsUpdate ();
            }

            @覆盖
            公共 无效onBlocksDownloaded 同伴同行 blocksLeft {
                超级onBlocksDownloaded 同行blocksLeft );
                triggerNetworkStatsUpdate ();
                handleNewBlock ();
            }
        });

        钱包的addEventListener AbstractWalletEventListener () {
            @覆盖
            公共 无效onCoinsReceived 钱包钱包 BigInteger的prevBalance BigInteger的newBalance {
                超级onCoinsReceived newBalance );
                handleNewTransaction TX );
            }

            @覆盖
            公共 无效onCoinsSent 钱包钱包 交易TX 的BigInteger BigInteger的newBalance {
                超级onCoinsSent 钱包prevBalance newBalance );
                handleNewTransaction TX );
            }

            @覆盖
            公共 无效的onChange () {
                尝试 {
                    系统出来的println “钱包变” );
                    钱包的SaveToFile walletFile );
                } 赶上 IOException异常e )条 {
                    抛出 的RuntimeException ( e )条;
                }
            }
        });
       
        / /创建GUI。
        JFrame的窗口, 的JFrame “玩具钱包” );
        窗口setDefaultCloseOperation JFrame的EXIT_ON_CLOSE );
        setupWindow 窗口);
        窗口();
        窗口setSize 640 480 );

        / /把钱包中的交易,进入GUI。
        最终 < 交易> walletTransactions = 钱包getTransactions 真实的 真实的);
        SwingUtilities类invokeAndWait 的Runnable () {
            公共 无效的run () {
                最后 交易TX walletTransactions {
                    txListModel, monitorTx TX );
                }
            }
        });


        / /去!
        窗口setVisible );
        等组开始();
        等组downloadBlockChain ();
    }

    私人 无效handleNewBlock的() {
        SwingUtilities类的invokeLater 的Runnable () {
            公共 无效的run () {
                txListModel newBlock ();
            }
        });
    }

    “私人的 无效handleNewTransaction 最后 交易T {
        / /同行线程运行,切换到Swing前添加和更新UI线程。
        SwingUtilities类的invokeLater 的Runnable () {
            公共 无效的run () {
                txListModel, monitorTx ( T );
            }
        });
    }

    私人 无效triggerNetworkStatsUpdate的() {
        SwingUtilities类的invokeLater 的Runnable () {
            公共 无效的run () {
                INT numPeers 等组numConnectedPeers ();
                StoredBlock chainHead = getChainHead ();
                字符串日期= chainHead getHeader ()。getTime ()。的toString ();
                字符串复数=  numPeers > 1 “同行” “同行” ;
                字符串状态= 字符串格式
                        numPeers 复数chainHead getHeight (),日期等);
                networkStats 的setText 状态);
            }
        });
    }

    私人的 无效setupWindow JFrame的窗口 {
        JLabel的指示 JLabel的
                “<HTML>广播事务出现在下面。观看他们获得信心。参考” +
                “寄硬币:<B>” + 钱包钥匙扣0 )。toAddress 的params + “</ B>” );
        窗口的getContentPane 。() 指令 BorderLayout的华北);
       
        / /交易清单。
        txList = JList的txListModel );
        txList setCellRenderer TxListLabel ());
        txList, setSelectionMode ListSelectionModel SINGLE_INTERVAL_SELECTION );
        txList setLayoutOrientation JList的垂直);
        txScrollPane = 的JScrollPane txList );
        窗口的getContentPane 。() txScrollPane BorderLayout的中心);
       
        networkStats = 的JLabel “连接到Bitcoin网络...” );
        窗口的getContentPane 。() networkStats BorderLayout的华南);
    }

    / /对象管理列表视图中的内容。
    私有 TxListModel 延伸 AbstractListModel {
        私人 名单< 交易> 交易= 新的ArrayList < 交易>();

        公共的 无效monitorTx 交易TX {
            断言SwingUtilities类isEventDispatchThread ();
            交易TX );
            / /设置了TX信心,改变事件监听器,所以我们知道什么时候才能更新列表。
            TX getConfidence ()。的addEventListener TransactionConfidence 监听器() {
                公共 无效onConfidenceChanged 交易TX {
                    / /注意,这不收到的每块调用,只是当我们过渡
                    / /之间的信任状态。
                    txIndex = 交易的indexOf TX );
                    fireContentsChanged txIndex txIndex );
                }
            });
            fireIntervalAdded 事务的大小() - 1 交易的大小() - 1 );
        }

        公众 诠释的getSize () {
            回报的交易大小();
        }

        公共 对象getElementAt INT {
            交易TX = 交易(一 );
            返回TX 的toString () + “\ N” + TX的getConfidence ()。的toString ();
        }

        “公共的 无效newBlock () {
            fireContentsChanged 0 的getSize () - 1 );
        }
    }

    私家 TxListLabel 扩展 JLabel的 实现 ListCellRenderer中 {
        公共, 组件getListCellRendererComponent JList的列表 对象内容
                                                      INT 指数 布尔isSelected
                                                      布尔cellHasFocus {
            字符串= 字符串内容;
            最终 String = 钱包钥匙扣0 )。toAddress 的params )。的toString ();
            值= “<HTML>” + 价值的replaceAll “\ N” ,“参考” )。的replaceAll “参考” “参考”
              的replaceAll + + “</ I>” );
            的setText );
            setOpaque );
            setBackground 索引 2 == 1 新的Color 230 230 230 颜色);
            返回 ;
        }
    }
}
返回顶部】【关闭窗口 风险提示:本站分享转载的信息均来自互联网,且仅供阅读参考,不作为具体投资的依据,据此入市,风险自担。本站所有内容涉及到的“货币”字眼需谨慎研判,我们维护各国法币的合法地位,同时数字资产具有货币的某些属性,目前是不能替代任何国家的法定货币的,请谨慎理解投资并严格遵守各国法律法规!详见本站[免责声明]。】
【读完这篇文章后,可否发表您的感受?】
0
0
0
0
0
0
0
0
本文网址:
安全联盟站长平台 互联网举办平台 公共信息安全网监 中国网安 赛门铁克安全响应中心