文档章节

比特币Bitcoin应用HelloWorld开发及测试币申请

西农大叔
 西农大叔
发布于 01/31 14:28
字数 1914
阅读 3
收藏 0

比特币Bitcoin应用HelloWorld开发及测试币申请

阐明一个事:以太坊和比特币都不是区块链,它们是基于区块链的一种应用,区块链可以理解为各种技术的组合或者一直新型的“数据库”。想要了解更多,可以去度娘下载相关的白皮书蓝皮书看看,这里有些pdf的白皮书可以下载观摩。

 

说明:以下样例和代码操作都是基于Java版的钱包应用来描述的。

标签:比特币钱包开发,区块链钱包开发,bitcoin钱包开发,bitcoinj接口使用,比特币测试网络,获取比特币测试币

 

一 测试网络

比特币提供的测试网络:

a)TestNet2、TestNet3 测试网络

b)UnitTest 测试网络,针对单元测试的特殊网络

c)RegTest 私有网络,主要是个人或企业自己搭建的网络

d)MainNet、ProdNet,正式网络,生产网络,生产环境使用

 

二 涉及框架或模块(Java)

bitcoinj, gtihub:  https://github.com/bitcoinj/bitcoinj

bitcoinj是一个使用比特币协议的库。它可以维护钱包,发送/接收交易而无需比特币核心的本地副本,并具有许多其他高级功能。它是用Java实现的,但可以从任何JVM兼容语言中使用:包括Python和JavaScript中的示例。

 

它附带完整的文档,并在其上构建了许多大型,众所周知的比特币应用程序和服务。

 

特征

高度优化的轻量级简化支付验证(SPV)模式。在这种模式下,只下载了一小部分区块链,使比特币适合在智能手机或廉价虚拟专用服务器等受限设备上使用。 实验性完整验证模式,与比特币核心执行相同的验证工作。在此模式下,计算未使用的事务输出集(UTXO集),并且由于PostgreSQL存储,可以将其索引到数据库中,以便按地址快速查找余额。 带有加密,费用计算,多重签名,确定性密钥派生,可插入硬币选择/硬币控制,扩展支持和事件监听器的钱包类,让您及时了解余额变化。 支持微支付渠道,允许您在客户端和服务器之间建立多签名合同,然后在渠道上进行协商,允许快速小额支付,以避免矿工费用。 为网络IO 提供异步和每线程连接,允许您在可伸缩性和仅阻塞功能(如SOCKS / Tor代理)之间进行选择。 轻松实现使用比特币合约功能的应用程序。 一个简单的GUI钱包应用程序,您可以将其用作自己的应用程序的基础。观看或阅读有关如何自定义它的教程,并构建不需要Java的本机安装程序。。

js的版本:https://github.com/bitcoinjs/bitcoinjs-lib,可自行参考。

 

三 使用样例(部分代码)

maven依赖

<dependency>
    <groupId>org.bitcoinj</groupId>
    <artifactId>bitcoinj-core</artifactId>
    <version>0.14.7</version>
</dependency>

 

//# 创建钱包

WalletAppKit walletAppKit = new WalletAppKit(networkParam(), new File("."), walletName);

walletAppKit.startAsync();
walletAppKit.awaitRunning();

Wallet wallet = walletAppKit.wallet();
DeterministicSeed keyChainSeed = wallet.getKeyChainSeed();

DeterministicKeyChain deterministicKeyChain = DeterministicKeyChain.builder().seed(keyChainSeed).build();
BigInteger privateKey = deterministicKeyChain.getKeyByPath(parsePath("M"), true).getPrivKey();
ECKey ecKey = ECKey.fromPrivate(privateKey);
wallet.importKey(ecKey);
Address watchedAddresses = LegacyAddress.fromKey(networkParam(), ecKey);
wallet.addWatchedAddress(watchedAddresses);

Address address = wallet.getWatchedAddresses().get(0);
List<String> mnemonicCode = wallet.getKeyChainSeed().getMnemonicCode();
String seedCode = String.join(" ", mnemonicCode);

log.info("walletAddress={}", address.toString());
log.info("privateKey={}", ecKey.getPrivKey());
log.info("encode privateKey={}", ecKey.getPrivateKeyEncoded(networkParam()));
log.info("hex privateKey={}", ecKey.getPrivateKeyAsHex());
log.info("wif privateKey={}", ecKey.getPrivateKeyAsWiF(networkParam()));
log.info("seedCode={}", seedCode); //# 助记词

 

//# 查询账户余额,address是0x开头地址

WalletAppKit walletAppKit = new WalletAppKit(networkParam(), new File("."), walletName);
walletAppKit.startAsync();
walletAppKit.awaitRunning();
Wallet wallet = walletAppKit.wallet();
Coin balance = wallet.getBalance();

 

 

//# 转账,返回交易hash

WalletAppKit kit = new WalletAppKit(params, new File("."), walletName);
kit.startAsync();
kit.awaitRunning();
log.warn("==================================================================");
log.warn("========================= update completed =========================");
log.warn("==================================================================");

Coin value = Coin.parseCoin("0.02");
LegacyAddress to = LegacyAddress.fromBase58(params, "monEGqJ2uTNSAbHudVPCCszx7mWMH2oL3z");
log.info("send money[{}] to address[{}]", value.getValue(), to.toString());

System.out.println("balance= "+kit.wallet().getBalance().getValue());
System.out.println("balance= "+kit.wallet().getBalance().toFriendlyString());

try {
    SendRequest sendRequest = SendRequest.to(to, value);
    Wallet.SendResult result = kit.wallet().sendCoins(sendRequest);

//# 返回交易hash
    log.info("coins sent. transaction hash: {}", result.tx.getHashAsString());
} catch (InsufficientMoneyException e) {
    log.error("send money[{}] to address[{}] error", value.getValue(), to.toString());
    log.error("not enough coins in your wallet. Missing {} satoshis are missing (including fees)", e.missing.getValue());
}

ListenableFuture<Coin> balanceFuture = kit.wallet().getBalanceFuture(value, Wallet.BalanceType.AVAILABLE);
FutureCallback<Coin> callback = new FutureCallback<Coin>() {
    @Override
    public void onSuccess(Coin balance) {
        log.info("----------- **************************************************** ----------------------");
        log.info("----------- coins arrived and the wallet now has enough balance ----------------------");
        log.info("----------- **************************************************** ----------------------");
    }

    @Override
    public void onFailure(Throwable t) {
        log.error(".....................................");
        log.error("@   something went wrong #");
        log.error(".....................................");
    }
};
Futures.addCallback(balanceFuture, callback);

 

四 网站查看余额及交易记录

testnet环境:

https://live.blockcypher.com/btc-testnet/address/monEGqJ2uTNSAbHudVPCCszx7mWMH2oL3z

https://chain.so/address/BTCTEST/monEGqJ2uTNSAbHudVPCCszx7mWMH2oL3z

 

五 密钥普及

公钥和私钥成对出现 

公开的密钥叫公钥,只有自己知道的叫私钥 

用公钥加密的数据只有对应的私钥可以解密 

用私钥加密的数据只有对应的公钥可以解密 

如果可以用公钥解密,则必然是对应的私钥加的密 

如果可以用私钥解密,则必然是对应的公钥加的密 

 

Keystore+密码=银行卡号+银行卡密码

Keystore ≠ 私钥

Keystore+密码=私钥

Keystore不是私钥,常见于以太坊钱包,一般你创建以太坊钱包后,会让你备份Keystore,输入密码,会出现一串字符这就是 Keystore。Keystore的本质是加密后的私钥,Keystore必须配合你的钱包密码来使用。用途:在导入钱包的时候,选择官方钱包,输入 Keystore 和密码,就能进入钱包了。需要说明的是,这和用私钥或助记词导入钱包不一样,用私钥或助记词导入钱包,不需要知道密码。

 

私钥:私钥可以计算出公钥,公钥可以经过一系列数字签名生成钱包地址。所以, 私钥的持有者才是数字货币的持有者。你可以把它看成是你的银行卡密码。

公钥:它是密码学上的概念,由私钥推算出来。公开密钥的算法属于不对称加密算法,该算法拥有两个密钥:公钥和私钥。使用私钥加密的数据可以用公钥解密,反之亦可。通过公钥可以算出钱包地址。

钱包地址:地址由公钥转换而来,地址被用于接收数字货币,一个地址上收到数字货币后,只有使用该地址所对应的私钥才能花费这个地址上的钱。可以把钱包地址想象成一个银行卡号,别人可以给你的钱包地址打钱。一般地址和私钥是成对出现的,他们的关系就像银行卡号和密码。地址就像银行卡号一样用来记录你在该钱包地址上存有多少币。我们可以简单的把钱包地址理解成为银行卡号,该钱包地址的私钥理解成为所对应银行卡号的密码。只有你在知道银行密码的情况下才能使用银行卡号上的钱。所以,在使用钱包时请保存好你的地址和私钥。

 

六 获取测试币

除了开发过程使用,其他时候没有任何实际价值,表当真^_^, 谁认真谁输.....

https://testnet.manu.backend.hamburg/faucet 这个水龙头好像呜呼哀哉了~

http://bitcoinfaucet.uo1.net/send.php   这个偶尔可以用,现在也不稳定了~

 

 

 

 

写的不好,不喜勿喷!  谢谢~~

 

如果觉得申请比特币测试币麻烦,可以加我获取,有偿提供测试币~~~

企鹅号: 631722350

邮箱: vip_warne@163.com 

 

 

© 著作权归作者所有

西农大叔
粉丝 0
博文 2
码字总数 3568
作品 0
广州
私信 提问
BTC上涨是因它而起吗? | 比特币ETF

昨天路可对这次BTC上涨背后的诸多原因做了解释。但是,后台有币友提出少了一个原因:比特币ETF。 对于比特币ETF,我想许多币友应该还是很模糊的。所以,这篇文章主要向币友讲解一下有关比特币...

路可比特
2018/08/06
0
0
什么是比特币ETF,小白必须知道

前不久,“SEC专员认为未来比特币ETF绝对会推出”的消息一经发布,BTC的价格就在下探3650美元后开始了反弹。 然而反弹并不实在,空头支票的利好消息结束之后反而下跌更多,比特币ETF也进入越...

小维see
2018/11/29
0
0
科普文——关于比特币ETF你想了解的都在这了

马克思说过:“当利润达10%时,蠢蠢欲动;当利润达50%时,铤而走险;当利润达到100%时,敢于践踏人间一切法律;当利润达到300%时,甚至连上绞刑架都豪不畏惧。” 这句话用在币圈真是再合适不...

BitEye去中心化交易所
2018/07/30
0
0
目前传销和诈骗的虚拟货币有哪些?

什么叫虚拟货币,就是非真实的货币。熟知的,比如腾讯公司的Q币,新浪推出的微币,这些可以用来在网络上玩游戏看书。还有就是从2013年流行起来的以比特币为代表的数字货币,比如莱特币,无限...

酒逢知己千杯少
2018/12/18
17
0
2018年“币圈”瘫了 “链圈”可安好?

简介:自2017年12月17日创下历史峰值以来,比特币市场价格在一年多时间里已累计下挫逾80%。 近一周, 比特币价格连续震荡,似有反弹迹象,曾一度冲回4000美元关口。12月25日截至发稿,交易平...

第一财经日报
2018/12/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

SSH安全加强两步走

从 OpenSSH 6.2 开始已经支持 SSH 多因素认证,本文就来讲讲如何在 OpenSSH 下启用该特性。 OpenSSH 6.2 以后的版本多了一个配置项 AuthenticationMethods。该配置项可以让 OpenSSH 同时指定...

xiangyunyan
28分钟前
4
0
C或C++不是C/C++

http://www.voidcn.com/article/p-mucdruqa-ws.html

shzwork
今天
6
0
OSChina 周六乱弹 —— 如何将梳子卖给和尚

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @for_ :划水五分钟,专注两小时。分享Various Artists的单曲《贝多芬第8号钢琴奏鸣曲悲伤的第三乐章》: 《贝多芬第8号钢琴奏鸣曲悲伤的第三乐...

小小编辑
今天
179
8
ES5

什么是ES5:比普通js运行要求更加严格的模式 为什么:js语言本身有很多广受诟病的缺陷 如何:在当前作用域的顶部添加:"use strict" 要求: 1、禁止给未声明的变量赋值 2、静默失败升级为错误...

wytao1995
今天
7
0
c++ 内联函数调用快的原因

见图片分析

天王盖地虎626
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部