用有趣的方式
链接未来新趋势

比特币区块链开发由浅入深指南(四)– 实战多重签名交易

区块链趣事阅读(208)

原文链接:http://www.8btc.com/ppkpub_blockchain_develope_lesson_4

本文以比特币测试网络(bitcoin-testnet)作为开发试验环境,以结合Node.js实现PPkPub开源项目ODIN的标识注册功能作为具体应用案例,来说明如何利用多重签名交易形式来嵌入自定义数据并签名后广播,再被矿工节点确认存入区块链后,最终能被读取解析得到注册结果,这样就实现了一个从写入区块链到从区块链读取的完整过程。

比特币区块链开发由浅入深指南(四)– 实战多重签名交易
一、了解ODIN开放标识的定义

ODIN 作为PPkPub 开放小组发布的第一个开源项目,是Open Data Index Name 即“开放数据索引命名标识”的缩写。广义上,ODIN 是指在网络环境下标识和交换数据内容索引的一种开放性系统,它遵从URI(统一资源标识符) 规范,并为基于数字加密货币区块链(BlockChain)的自主开放、 安全可信的数据内容管理和知识产权管理提供了一个可扩展的框架。它包括4 个组成要素:标识符、 解析系统、 元数据和规则(Policies) 。 狭义上,ODIN 是指标识任何数据内容对象的一种永久性开放标识符。

比特币区块链开发由浅入深指南(四)– 实战多重签名交易

ODIN 可以被形象地理解为“数据时代的自主域名”,是基于比特币区块链定义并可扩展兼容更多区块链的完全开放、 去中心化的命名标识体系,相比传统的 DNS 域名拥有更多创新特性,可以很好地被应用到大数据、智能设备和物联网等新兴领域。

参考了XCP(合约币)和Mastercoin(万事达币)等数字加密货币的技术原理,ODIN的实现是通过将特定消息数据按比特币协议规范进行特定编码后,作为比特币交易广播到比特币网络上存入区块链。

每个ODIN信息包括以下特性:
(a) 一个比特币源地址(对应ODIN消息生成者)

(b) 一个比特币目的地址(对应受ODIN消息指向的目标个体,当消息生成者与受消息指向的目标个体相同时,该地址为空)

(c) 若干个1-of-N多重签名输出比特币地址公钥(经由ODIN数据包编码生成,实际生成交易时从ODIN设置数据中按顺序每提取32个字节,并在该32个字节的前部加上1个字节对应该字符串的长度值,总共33个字节对应一个比特币公钥,最后不足33个字节的自动在尾部追加二进制0填满直到正好达到33字节对应一个压缩公钥)

(d) 比特币源地址中有一定数量的比特币余额(建议有0.001BTC以上,用于生成从源地址发送到目的地址的若干有效交易条目以嵌入ODIN数据包。注: 因为比特币1-of-N多重签名交易的特点,这些比特币金额不会发生实际支出,将在下一个ODIN消息中被回收循环利用)

(e) 以比特币计的消息成本固定费用(缺省是0.0001 BTC),将支付给收录这个交易数据块的比特币网络矿工。

(f) 一个比特币找零地址(与上述第一项的比特币源地址相同,用于按照比特币交易协议将输入交易的比特币金额在生成若干条满足嵌入ODIN数据包的交易条目后多出的金额回收到消息发送者账户)

上述的特性(c)是技术实现的关键,ODIN数据块会嵌入到比特币交易的多重签名输出数据块中,是1-of-N输出,每个数据块的第一个公钥固定是发送者的,因而输出的币值可以赎回循环使用,存贮第二个到第N个公钥的地址空间用来存贮编码的ODIN消息数据。关于比特币多重签名交易的详细说明请参考比特币协议规范。
注:N建议取值不超过10。对于1条1-of-10多重签名输出仍无法容纳的ODIN数据块,可依样扩展存入第2条,第3条等更多条多重签名输出记录中即可。

每个ODIN信息数据块的格式按字节顺序定义如下:

第1-32字节 : 前缀特征标识,32个字节的ASCII字符串”P2P is future! ppkpub.org->ppk:0″(不含两侧的双引号)

第33字节 : 消息类型,1个字节。

第34字节到消息结束为按消息类型区分的不同消息数据,详见具体的ODIN 消息类型中的定义。

注:为了便于识别,每个ODIN消息都以32字节的ASCII字符串”P2P is future! ppkpub.org->ppk:0″(不含两侧的引号)作为前缀特征标识,这个字符串非常长,因而不可能把ODIN的特定交易和其它的比特币交易搞混。
二、将ODIN标识注册到区块链上的实例解析

下文是ODIN协议里对于“新注册ODIN标识”的具体消息定义:
————————————————————————————————————
新注册ODIN标识

比特币源地址:对应ODIN标识注册者
比特币目的地址:对应ODIN标识拥有者

消息数据块的格式按字节顺序定义如下:
第1-32字节 : 前缀特征标识,32个字节的ASCII字符串”P2P is future! ppkpub.org->ppk:0″(不含两侧的双引号)
第33字节 : 消息类型,1个字节,取值为ASCII字符R
第34字节 : 消息正文数据格式,1个字节。
    取值定义:ASCII字符,
       T 表示“UTF-8编码文本字符串”,
       G 表示“经gzip算法压缩得到的二进制数据,需解压后可得到UTF-8编码的原始文本字符串”
第35-36字节: 消息正文数据字节长度,2个字节的无符号短整型二进制数据,取值范围为0-65535。
第37字节到消息正文指定长度结束是按字节存放的消息正文数据,需根据第34字节的数据格式取值来获得原始消息文本,为UTF-8编码的JSON格式字符串,对应一个JSON对象数据,说明如下:
  {
   ”title”:”说明:个体名称字符串”,
   ”email”:”说明:个体的公开EMAIL,可选”,
   ”auth”:”说明:配置权限,取值定义见下方注释”,
   ”ap_list”:[“说明:若干个数据访问点AP的URL数组,最少需填写一个”,…,”xxxx”],
   ”catalog”:”说明:数据源类型,可选保留字段,待补充”
  }

注:配置权限的取值说明:ASCII字符0,1或2
0表示“注册者或拥有者任一方都可以修改拥有者相关信息”,
1表示“只有注册者能修改拥有者相关信息”,
2表示“注册者和拥有者必须共同确认才能修改拥有者相关信息”,

————————————————————————————————————

假设有下述示例的一段ODIN标识注册信息:
{“title”:”PPk-ODIN-sample”,”email”:”ppkpub@gmail.com”,”auth”:”2″,”ap_list”:[“http://ppkpub.org/AP/”]}

那么就可以按照上述的消息定义将其组装为一条比特币交易记录以广播到比特币网络上生效,对应交易的原始数据示例如下(将原始二进制数据按字节以16进制ASCII码形式输出,便于分析):
01000000032237b858f1a697cc2d26a451bd3fd3ef1944eb53f579b4fac38e5ecb5c0fc42c010000006b483045022100da55
a2d9f97695db12aecc0113662437957a6d4f17064ff49602ddc39904c31302201e81eae0c84f25019485ae4a2ce9b67c0e84
85599df87ab876b469e3cbbd24100121022e9f31292873eee495ca9744fc410343ff373622cca60d3a4c926e58716114b9ff
ffffff2ef89686bebf72bd31b8f27780223f7b5f448d0110b6fdda19595a073f42a301000000006b483045022100d49360fa
6bd45b92a068127db31c9cfd93af87543799968a5b076c2fea151f9b0220647900f5fc763f5a3eed13d382e13a3bddd15646
867b56f1be9d2629b2ccb4360121022e9f31292873eee495ca9744fc410343ff373622cca60d3a4c926e58716114b9ffffff
ffd704b1c1977cd50be182134b18fafaa16db1e917dfe4f93bcab1584aabf323d4010000006b483045022100fb88f75cae8a
ccfe969cd89afbca677ff78a4914f5f506d6e5d481baf484e9f2022039f560414ec5a778a19565f7fe9e51b6acf7b841b4ba
2188785a5bb6051d7d510121022e9f31292873eee495ca9744fc410343ff373622cca60d3a4c926e58716114b9ffffffff03
7d160000000000001976a91451a09d25106715f09a14cac6367c3f4f2408590d88ac7d16000000000000cf5121022e9f3129
2873eee495ca9744fc410343ff373622cca60d3a4c926e58716114b9212050325020697320667574757265212070706b7075
622e6f72672d3e70706b3a302120525400657b227469746c65223a2250506b2d4f44494e2d73616d706c65222c222120656d
61696c223a2270706b70756240676d61696c2e636f6d222c22617574682221203a2232222c2261705f6c697374223a5b2268
7474703a2f2f70706b7075622e6f210972672f41502f225d7d000000000000000000000000000000000000000000000056ae
e6cac223000000001976a914391ef5239da2a3904cda1fd995fb7c4377487ea988ac00000000
对上述报文按协议规则可按字段分解说明如下:

01000000     // 版本号,UINT32

03        // Tx输入数量,变长INT。0×03=3个输入。

/*** 接下来是第一组Input Tx ***/
2237b858f1a697cc2d26a451bd3fd3ef1944eb53f579b4fac38e5ecb5c0fc42c  // Tx交易的Hash值,固定32字节
01000000     // 消费的Tx位于前向交易输出的第0个,UINT32,固定4字节
6b        // 接下来对应签名数据的长度, 0x6b = 107字节 。
// 这107字节长度的签名,含有两个部分:私钥签名 + 公钥。
// 当这里的数值为00时,则表示为尚未经过签名的原始交易
48        // 对应私钥签名的数据长度,0×48 = 72字节
3045022100da55a2d9f97695db12aecc0113662437957a6d4f17064ff49602ddc39904c31302201e
81eae0c84f25019485ae4a2ce9b67c0e8485599df87ab876b469e3cbbd241001  //私钥签名内容
21        // 对应公钥的数据长度,0×21 = 33字节
022e9f31292873eee495ca9744fc410343ff373622cca60d3a4c926e58716114b9  //对应公钥数据
ffffffff     // 序列号,UINT32, 固定4字节。该字段是目前未被使用的交易替换功能,默认都设成0xFFFFFFFF

/*** 第二组Input Tx。与上同理,省略分解 ***/
2ef89686bebf72bd31b8f27780223f7b5f448d0110b6fdda19595a073f42a301000000006b483045
022100d49360fa6bd45b92a068127db31c9cfd93af87543799968a5b076c2fea151f9b0220647900
f5fc763f5a3eed13d382e13a3bddd15646867b56f1be9d2629b2ccb4360121022e9f31292873eee4
95ca9744fc410343ff373622cca60d3a4c926e58716114b9ffffffff

/*** 第三组Input Tx。与上同理,省略分解 ***/
d704b1c1977cd50be182134b18fafaa16db1e917dfe4f93bcab1584aabf323d4010000006b483045
022100fb88f75cae8accfe969cd89afbca677ff78a4914f5f506d6e5d481baf484e9f2022039f560
414ec5a778a19565f7fe9e51b6acf7b841b4ba2188785a5bb6051d7d510121022e9f31292873eee4
95ca9744fc410343ff373622cca60d3a4c926e58716114b9ffffffff
03        // Tx输出交易数量,变长INT类型。0×03=3个输出。

/*** 第一组输出 ***/
7d16000000000000 //输出的比特币数量,UINT64,8个字节。字节序需翻转得到0x000000000000167d = 5757 satoshi = 0.00005757 BTC
19        //输出描述脚本字节数, 0×19 = 25字节,由一些操作码与数值构成
76        //脚本起始操作 0×76 代表 OP_DUP(复制栈顶元素)
a9        //地址类型 0xa9 代表 OP_HASH160(栈顶项进行两次HASH,先用SHA-256,再用RIPEMD-160)
14        //地址长度 0×14 = 20字节
51a09d25106715f09a14cac6367c3f4f2408590d  //对应ODIN标识拥有者地址的HASH160值,20字节
88        //0×88 代表 OP_EQUALVERIFY (运行脚本的二进制算术和条件,如结果为0,之后运行OP_VERIFY)
ac        //Oxac 代表 OP_CHECKSIG (交易所用的签名必须是哈希值和公钥的有效签名,如果为真,则返回1)

/*** 第二组输出 ***/
7d16000000000000 //输出的比特币数量,UINT64,8个字节。字节序需翻转,
cf        //输出描述脚本字节数, 0xcf = 207字节,由一些操作码与数值构成
51        //Ox51代表OP_1(将脚本代码1压入堆栈)
21        //压入堆栈的第1个公钥的数据长度,0×21 = 33字节。对应ODIN标识注册者地址的公钥
022e9f31292873eee495ca9744fc410343ff373622cca60d3a4c926e58716114b9
21        //压入堆栈的第2个公钥的数据长度。从第2个公钥开始嵌入ODIN标识消息内容
2050325020697320667574757265212070706b7075622e6f72672d3e70706b3a30
21        //压入堆栈的第3个公钥的数据长度
20525400657b227469746c65223a2250506b2d4f44494e2d73616d706c65222c22
21        //压入堆栈的第4个公钥的数据长度
20656d61696c223a2270706b70756240676d61696c2e636f6d222c226175746822
21        //压入堆栈的第5个公钥的数据长度
203a2232222c2261705f6c697374223a5b22687474703a2f2f70706b7075622e6f
21        //压入堆栈的第6个公钥的数据长度
0972672f41502f225d7d0000000000000000000000000000000000000000000000
56        //Ox56 代表 OP_6 (将脚本代码6压入堆栈)。与前面的0×51合在一起表示1of6多重签名
ae        //Oxae 代表 OP_CHECKMULTISIG (执行多重签名验证)

/*** 第三组输出 ***/
e6cac22300000000 //输出的比特币数量,UINT64,8个字节。字节序需翻转,
19        //输出描述脚本字节数, 0×19 = 25字节,由一些操作码与数值构成
76        //脚本起始操作 0×76 代表 OP_DUP(复制栈顶元素)
a9        //地址类型 0xa9 代表 OP_HASH160(栈顶项进行两次HASH,先用SHA-256,再用RIPEMD-160)
14        //地址长度 0×14 = 20字节
391ef5239da2a3904cda1fd995fb7c4377487ea9  // 对应的HASH160值,20字节
88        //0×88 代表 OP_EQUALVERIFY (运行脚本的二进制算术和条件,如结果为0,之后运行OP_VERIFY)
ac        //Oxac 代表 OP_CHECKSIG (交易所用的签名必须是哈希值和公钥的有效签名,如果为真,则返回1)

00000000     // 锁定时间,UINT32,固定4字节

 

结合前文说说明的ODIN协议定义内容,通过上述交易数据中的蓝色区域部分就可以还原解析出对应ODIN标识注册消息。

 

三、运行示例程序

示例程序包括两部分:
1. OdinMonitorTestnet.js :
监测比特币测试网络Testnet相关区块链数据的变化,从中解析出新注册的ODIN标识。
源码可以从这里下载: http://ppkpub.org/sample/OdinMonitorTestnet.js

2. OdinRegisterTestnet.js :
在比特币测试网络Testnet注册一个新的ODIN标识。
源码可以从这里下载: http://ppkpub.org/sample/OdinRegisterTestnet.js

将上述示例代码下载保存到已安装Node.js的测试环境下(保存文件名为 OdinRegisterTestnet.js和OdinMonitorTestnet.js)。
关于如何安装Node.js测试环境, 如有需要可以参考《比特币区块链开发由浅入深指南1》里面的说明进行安装( http://www.8btc.com/blockchain_develope_lesson_1 )。

在运行上述示例程序前,请确认已安装比特币测试网络(bitcoin-testnet)的Docker运行环境。如尚未安装可以参考《比特币区块链开发由浅入深指南2》里面的说明进行安装(http://www.8btc.com/ppkpub_blockchain_develope_lesson_2 )。

在Node.js开发测试环境新开一个文本终端窗口,在命令行下输入以下命令启动监测示例程序:
node OdinMonitorTestnet.js

然后新开一个文本终端窗口,在命令行下输入以下命令运行注册示例程序:
node OdinRegisterTestnet.js

运行注册示例程序后,到比特币测试网络(bitcoin-testnet)的Docker运行环境的命令行下输入”make generate BLOCKS=6″, 模拟产生新的区块记录,刚产生的交易记录就会得到有效的确认并被存入区块链中。 这时在监测程序的运行界面上就会提示解析到新的ODIN标识注册记录(如下图所示)。

比特币区块链开发由浅入深指南(四)– 实战多重签名交易

比特币区块链开发由浅入深指南(二)

区块链趣事阅读(187)

原文链接:http://www.8btc.com/ppkpub_blockchain_develope_lesson_2

本文在常用的Ubuntu14.04操作系统上,采用Docker容器来快速安装和配置私有节点的比特币测试网络(bitcoin-testnet)作为开发试验环境,结合Node.js为例来说明如何调用比特币钱包节点提供的RPC接口服务来实现一些具体的比特币相关账户和交易操作。

比特币区块链开发由浅入深指南(二)

RPC(Remote Procedure Call)即远程过程调用协议,是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。
在Bitcoin的wiki网页上面( https://en.bitcoin.it/wiki/API_reference_(JSON-RPC) ),可以看到除了Node.js外还有很多种语言都可以调用Bitcoin的RPC,大家可以参考本文内容选择适合自己的语言具体试验。
在上面的网页里,还可以延伸阅读和了解Bitcoin RPC可以调用的命令列表(https://en.bitcoin.it/wiki/Original_Bitcoin_client/API_calls_list)。

关于如何安装Ubuntu14.04操作系统和Node.js, 如有需要可以参考上一篇《比特币区块链开发由浅入深指南1》里面的说明进行安装( http://www.8btc.com/blockchain_develope_lesson_1 )。

一、安装Docker运行环境

1.使用apt-get命令安装Docker容器支持软件:

$sudo apt-get install docker.io

2.创建软连接
$sudo ln -sf /usr/bin/docker.io /usr/local/bin/docker

3.查看Docker版本
$docker –version
如看到提示信息类似“Docker version 1.6.2, build 7c8fca2”则说明你已经在Ubuntu14.04上面快速安装Docker成功了。

如需了解更多关于Docker安装和运行的入门说明可以网络搜索更多资料,也可以看看这个网页: “Docker初试”( http://my.oschina.net/lamciuloeng/blog/226107 )

 

二、安装和运行比特币测试网络(bitcoin-testnet)

1.下载比特币测试网络(bitcoin-testnet)的Docker镜像
$sudo docker pull freewil/bitcoin-testnet-box

2.运行Docker镜像
$sudo docker run -t -i -p 19001:19001 -p 19011:19011 freewil/bitcoin-testnet-box

注:上述命令中的19001和19011是配置给两个节点提供RPC服务的端口。

3.进入Docker运行环境后,输入下面的命令来启动比特币测试网络:
$ make start
启动成功后,将在本机模拟运行两个比特币测试钱包节点,组成一个私有范围的比特币测试网络。

输入下面的命令可以查看测试网络节点状态信息:
$ make getinfo

显示的提示信息如下,中文为对其中若干关键信息的说明:
bitcoin-cli -datadir=1 getinfo //第一个钱包节点的信息
{
“version”: 120100,
“protocolversion”: 70012,
“walletversion”: 60000,
“balance”: 0.00000000, //第一个钱包节点的账户余额,初始为0
“blocks”: 0, //已经产生的区块数量,初始启动为0,可以通过进一步的命令来模拟生成区块数据
“timeoffset”: 0,
“connections”: 1,
“proxy”: “”,
“difficulty”: 4.656542373906925e-10,
“testnet”: false,
“keypoololdest”: 1467253951,
“keypoolsize”: 101,
“paytxfee”: 0.00000000,
“relayfee”: 0.00001000,
“errors”: “”
}
bitcoin-cli -datadir=2 getinfo //第二个钱包节点的信息
{
“version”: 120100,
“protocolversion”: 70012,
“walletversion”: 60000,
“balance”: 0.00000000,
“blocks”: 0,
“timeoffset”: 0,
“connections”: 1,
“proxy”: “”,
“difficulty”: 4.656542373906925e-10,
“testnet”: false,
“keypoololdest”: 1467253951,
“keypoolsize”: 101,
“paytxfee”: 0.00000000,
“relayfee”: 0.00001000,
“errors”: “”
}
4.初始化和测试区块链数据
在Docker运行窗口里依次输入下面的命令来初始化创建基本的区块链数据,供进一步的程序示例来使用。
注意:在正式的比特币网络环境下,平均是10分钟左右才能产生一个新的区块。但在这里的测试网络(testnet)特殊设定的环境下,区块是通过简单的命令控制就可以即时和批量产生的,方便程序开发测试。

make generate
//说明:模拟新产生1个区块记录

make generate BLOCKS=200
//说明:模拟新产生200个区块记录

make getinfo
//说明:查看最新的钱包状态包括余额信息,这时可以留意看到第一个钱包节点的账户余额变为了 5050.00000000 BTC,即通过模拟区块挖矿产生的测试比特币。

make sendfrom1 ADDRESS=mkiytxYA6kxUC8iTnzLPgMfCphnz91zRfZ AMOUNT=10
//说明:给指定测试钱包地址转账10个BTC。注意命令中的测试转账地址“mkiytxYA6kxUC8iTnzLPgMfCphnz91zRfZ”对应后续测试程序示例所需要使用的测试钱包地址。

make generate BLOCKS=10
//说明:模拟新产生10个区块记录,让上面的转账交易得到足够有效的确认

make getinfo
//说明:查看最新的钱包状态包括余额信息, 这时可以留意看到第一个钱包节点的账户余额变为了 5539.99996160 BTC ,即已经交易转账支出了10个BTC加上少许的矿工费用。

 

三、安装Node.js的RPC支持库\
常用的Node.js的RPC支持库有多个,我们这里选用开源项目kapitalize。

在Ubuntu桌面新起一个终端命令行界面,输入以下命令进行安装:
$npm install kapitalize

关于kapitalize开源项目的更多说明可以参考: https://github.com/shamoons/Kapitalize
四、运行示例程序

将下述示例代码复制保存到测试环境下(保存文件名为RpcTestnet.js),在命令行下输入以下命令即可运行并看到运行结果:
node RpcTestnet.js

注意:每运行一次测试代码后,都需要到Docker运行环境的命令行下输入”make generate BLOCKS=10″, 模拟产生新的区块记录,让测试代码产生的交易记录得到有效的确认。

示例程序RpcTestnet.js源码如下(源码文件可以点击这里下载):

/********************* 示例代码起始 **********************/
比特币区块链开发由浅入深指南(二)

/********************* 示例代码结束 **********************/
在此程序的基础上,经过对Bitcoin协议的进一步了解,我们可以调用RPC接口进一步开发出更复杂功能,如自行构建特定交易数据包(比如多重签名数据)来满足特定业务需求,后续我们PPkPub将深入介绍。

比特币区块链开发由浅入深指南(一)

区块链趣事阅读(180)

原文链接:http://www.8btc.com/blockchain_develope_lesson_1

本文以调用Blockchain.info所提供的API服务结合Node.js为例来说明如何搭建相关的开发环境和开发代码示例。

比特币区块链开发由浅入深指南(一)

一、确认基础环境

 

操作系统:

建议采用虚拟机形式安装Ubuntu 14.04 Desktop 64bit

其他操作系统可以参考本文自行试验。

Node.js:

Blockchain.info要求 node >= 0.12.0 npm >= 2.12.0, < 3.0.0

查看现有node.js版本的命令参考如下:
apt-cache policy nodejs
node -v
npm -v

如果尚未安装nodejs,可以参考下述命令进行安装:
sudo add-apt-repository ‘deb https://deb.nodesource.com/node trusty main’
sudo apt-get update
sudo apt-get install nodejs

如果已安装的nodejs版本不符合上面的要求,可从nodejs.org网站上手工下载较新版本(目前建议用0.12.10版本)的压缩包,解压后用命令行进入解压后的目录,输入以下命令覆盖旧版本
sudo cp bin/* /usr/bin/
sudo cp -r lib/include /usr/include/
sudo cp -r lib/node_modules /usr/lib/
node -v
npm -v

二、申请apicode:

访问Blockchain.info的下述网址申请接口授权码(apicode):
https://blockchain.info/api/api_create_code
提交申请后,等待两个工作日后可以收到内含接口授权码的邮件,将其中的Code对应的后面字符串复制保存好,后续的安装配置和开发都需要用到。

三、安装Blockchain Wallet API服务程序

在命令行下输入以下命令:
sudo npm install -g blockchain-wallet-service

检查所安装的Blockchain Wallet API版本:
blockchain-wallet-service -V

如果需要更新到最新版本,可以输入以下命令:
sudo npm update -g blockchain-wallet-service

 

四、配置Blockchain Wallet API服务程序

输入以下命令启动WalletApi服务:
blockchain-wallet-service start –port 3000

1.创建一个新钱包账户

需输入以下命令:

curl “http://localhost:3000/api/v2/create?password=YourWalletPassword&api_code=YourApiCode&label=YourWalletName”
其中: YourWalletPassword是给新钱包设置的密码,一般用英文数字组合,长度在8位字符以上就可以。
YourApiCode是前面申请的接口授权码,复制到这里填上就行。
YourWalletName是给新钱包起的名称,一般用英文数字组合

如果操作成功,会显示结果类似: {“guid”:”xxxxxxxx-xxxxxx-xxxxxxx-xxxxxxxx”,”address”:”xxxxxxxxxxxxxxxxxxxxx”,”label”:”xxxxx”}
将其中的钱包账户标识guid和钱包地址address都记下来,后续操作需要用到。
这里显示的address对应的就是新钱包的比特币地址,可以从别的比特币钱包向这个新地址发送少量比特币(比如0.01 BTC)用于后续测试。
注:获得少量比特币可以从国内的一些比特币交易所用人民币来购买然后转账到自己的比特币钱包地址即可。国内常用的交易所有:比特币中国,比特时代,okcoin等,从网上搜索下即可了解到具体操作方法。

2.测试获取钱包余额

需输入以下命令:
curl “http://localhost:3000/merchant/YourGuid/balance?password=YourWalletPassword&api_code=YourApiCode”
其中: YourGuid是前面创建钱包账户时获得的guid标识
YourWalletPassword是前面设置的钱包密码
YourApiCode是前面申请的接口授权码。

如果操作成功,会显示结果类似: {“balance”:xxxxxxx}
其中的balance是一个整数,单位为聪,1聪=0.00000001 BTC

 

五、安装API的客户端支持库

本文以Node.js为例,Blockchain.info也提供另外多种语言的API库如PHP,JAVA,.NET(C#),Ruby,Python等,读者可以自行参考选用。

在命令行下输入以下命令:
sudo npm install –save blockchain.info

关于API的node支持库的详细说明: https://github.com/blockchain/api-v1-client-node

 

六、编写第一个程序“Hello,Bitcoin”

 

第一个示例程序HelloBitcoin.js源码如下:
/****************** START *********************/
//Hello Bitcoin Demo of node.js
console.log(‘Hello, Bitcoin.’);

//init wallet object
var MyWallet = require(‘blockchain.info/MyWallet’);
var options = { apiCode: ‘你申请的ApiCode’, apiHost: ‘http://localhost:3000′ };
var wallet = new MyWallet(‘钱包Guid’, ‘钱包密码Password’, options);

//show balance
wallet.getBalance().then(function (balance) { console.log(‘Wallet balance is %d!’, balance); });

/********************* END ************************/

将你前面获得的相关配置参数包括apicode,guid和password填入以上代码中,保存后即可运行: node HelloBitcoin.js

在此程序的基础上,经过对相关API的了解,我们可以进一步开发出更多功能,如查询钱包地址列表,发送比特币,发送特定交易数据包(如多重签名数据)等等,后续我们PPkPub将深入介绍。

windows平台下编译比特币bitcoin客户端

区块链趣事阅读(170)

转载于CSDN,出处:
http://blog.sina.com.cn/s/blog_5922b3960101s5j9.html
很多朋友都知道如何在linux平台如何编译比特币程序,但是,到了windows平台,
就会感觉到无从下手. 其实, 比特币程序是跨平台的.
    你要编译windows版的比特币程序,基本上有两种方法,一种是在linux平台
(推荐ubuntu 13.10)通过交叉编译的方法来编译.另外一种,就是直接在windows平台编译.
我想,你既然要在windows平台使用,我就详细介绍一下如何在windwows平台编译比特币程序.
我的平台:windows7
第一步:安装变编译环境QT和MINGW,msys
  1、msys是一个在windows平台模拟shell的程序。
   
访问http://sourceforge.net/projects/mingw/files/Installer/mingw-get-setup.exe/download
下载安装程序之后,通过安装管理程序,按安装以下内容:
From MinGW installation manager -> All packages -> MSYS
选中以下安装包
msys-base-bin
msys-autoconf-bin
msys-automake-bin
msys-libtool-bin
点 apply changes开始安装。他会自动下载安装好。
需要注意的是,确保不要安装msys-gcc和msys-w32api ,因为这两个包和我们的编译系统发生冲突。
很多人出现一些莫名其妙的问题,就是因为这两个包。
2、安装 MinGW-builds
 访问
http://sourceforge.net/projects/mingw-w64/files/Toolchains targetting Win32/Personal Builds/mingw-builds/4.8.2/threads-posix/dwarf/i686-4.8.2-release-posix-dwarf-rt_v3-rev3.7z/download
下载并解压缩 i686-4.8.2-release-posix-dwarf-rt_v3-rev3.7z 到C盘根目录  C:\
注意我的目录结构。你尽量和我一样。
3、设置PATH环境变量,将C:\mingw32\bin;添加到第一个。
4、在命令行模式下输入 gc -v 会得到以下内容
c:\gcc -v
Using built-in specs.
COLLECT_GCC=c:\mingw32\bin\gcc.exe
COLLECT_LTO_WRAPPER=c:/mingw32/bin/../libexec/gcc/i686-w64-mingw32/4.8.2/lto-wrapper.exe
Target: i686-w64-mingw32
Configured with: ../../../src/gcc-4.8.2/configure –host=i686-w64-mingw32 –build=i686-w64-mingw32 –target=i686-w64-mingw32 –prefix=/mingw32 –with-sysroot=/c/mingw482/i686-482-posix-dwarf-rt_v3-rev3/mingw32 –with-gxx-include-dir=/mingw32/i686-w64-mingw32/include/c++ –enable-shared –enable-static –disable-multilib –enable-languages=ada,c,c++,fortran,objc,obj-c++,lto –enable-libstdcxx-time=yes –enable-threads=posix –enable-libgomp –enable-libatomic –enable-lto –enable-graphite –enable-checking=release –enable-fully-dynamic-string –enable-version-specific-runtime-libs –disable-sjlj-exceptions –with-dwarf2 –disable-isl-version-check –disable-cloog-version-check –disable-libstdcxx-pch –disable-libstdcxx-debug –enable-bootstrap –disable-rpath –disable-win32-registry –disable-nls –disable-werror –disable-symvers –with-gnu-as –with-gnu-ld –with-arch=i686 –with-tune=generic –with-libiconv –with-system-zlib –with-gmp=/c/mingw482/prerequisites/i686-w64-mingw32-static –with-mpfr=/c/mingw482/prerequisites/i686-w64-mingw32-static –with-mpc=/c/mingw482/prerequisites/i686-w64-mingw32-static –with-isl=/c/mingw482/prerequisites/i686-w64-mingw32-static –with-cloog=/c/mingw482/prerequisites/i686-w64-mingw32-static –enable-cloog-backend=isl –with-pkgversion=’i686-posix-dwarf-rev3, Built by MinGW-W64 project’ –with-bugurl=http://sourceforge.net/projects/mingw-w64 CFLAGS=’-O2 -pipe -I/c/mingw482/i686-482-posix-dwarf-rt_v3-rev3/mingw32/opt/include -I/c/mingw482/prerequisites/i686-zlib-static/include -I/c/mingw482/prerequisites/i686-w64-mingw32-static/include’ CXXFLAGS=’-O2 -pipe -I/c/mingw482/i686-482-posix-dwarf-rt_v3-rev3/mingw32/opt/include -I/c/mingw482/prerequisites/i686-zlib-static/include -I/c/mingw482/prerequisites/i686-w64-mingw32-static/include’ CPPFLAGS= LDFLAGS=’-pipe -L/c/mingw482/i686-482-posix-dwarf-rt_v3-rev3/mingw32/opt/lib -L/c/mingw482/prerequisites/i686-zlib-static/lib -L/c/mingw482/prerequisites/i686-w64-mingw32-static/lib -Wl,–large-address-aware’
Thread model: posix
gcc version 4.8.2 (i686-posix-dwarf-rev3, Built by MinGW-W64 project)
至此,你的开发环境已经搭建好了,很简单吧
第二部分:下载bitcoin引用的外部库
我们把它们全部放在 C:\deps目录下
2.1 安装OpenSSL下载:http://www.openssl.org/source/openssl-1.0.1g.tar.gz
 进入启动 MinGw shell 比如目录:(C:\MinGW\msys\1.0\msys.bat)运行这个msys.bat,就会启动一个shell环境,提示符是$
输入命令
cd /c/deps/
tar xvfz openssl-1.0.1g.tar.gz
cd openssl-1.0.1g
Configure no-shared no-dso mingw
make
等待几分钟后,就把openssl编译好了。
2.2 下载Berkeley DB 访问: http://download.oracle.com/berkeley-db/db-4.8.30.NC.tar.gz
我们推荐使用  4.8版本 
同样在msys shell环境下输入以下命令
cd /c/deps/
tar xvfz db-4.8.30.NC.tar.gz
cd db-4.8.30.NC/build_unix
../dist/configure –enable-mingw –enable-cxx –disable-shared –disable-replication
make
等待编译
2.3 安装Boost,下载地址: http://sourceforge.net/projects/boost/files/boost/1.55.0/
msys命令:
cd C:\deps\boost_1_55_0\
bootstrap.bat mingw
b2 –build-type=complete –with-chrono –with-filesystem –with-program_options –with-system –with-thread toolset=gcc variant=release link=static threading=multi runtime-link=static stage
2.4 安装Miniupnpc 下载地址: http://miniupnp.free.fr/files/download.php?file=miniupnpc-1.9.tar.gz
cd C:\deps\miniupnpc
mingw32-make -f Makefile.mingw init upnpc-static
2.5下载 protoc 和 libprotobuf:
Download and unpack http://protobuf.googlecode.com/files/protobuf-2.5.0.zip
 msys shell命令
cd /c/deps/protobuf-2.5.0
configure –disable-shared
make
2.6 qrencode:
下载地址: http://prdownloads.sourceforge.net/libpng/libpng-1.6.10.tar.gz?download 
命令
cd /c/deps/libpng-1.6.10
configure –disable-shared
make
下载 http://fukuchi.org/works/qrencode/qrencode-3.4.3.tar.gz ode:
cd /c/deps/qrencode-3.4.3
LIBS=”../libpng-1.6.10/.libs/libpng16.a ../../mingw32/i686-w64-mingw32/lib/libz.a” \
png_CFLAGS=”-I../libpng-1.6.10″ \
png_LIBS=”-L../libpng-1.6.10/.libs” \
configure –enable-static –disable-shared –without-tools
make
2.7 安装 Qt 5 库
下载和解压缩
http://download.qt-project.org/official_releases/qt/5.2/5.2.1/submodules/qtbase-opensource-src-5.2.1.7z
http://download.qt-project.org/official_releases/qt/5.2/5.2.1/submodules/qttools-opensource-src-5.2.1.7z
在 windows命令行输入:
set INCLUDE=C:\deps\libpng-1.6.10;C:\deps\openssl-1.0.1g\include
set LIB=C:\deps\libpng-1.6.10\.libs;C:\deps\openssl-1.0.1g
cd C:\Qt\5.2.1
configure.bat -release -opensource -confirm-license -static -make libs -no-sql-sqlite -no-opengl -system-zlib -qt-pcre -no-icu -no-gif -system-libpng -no-libjpeg -no-freetype -no-angle -no-vcproj -openssl-linked -no-dbus -no-audio-backend -no-wmf-backend -no-qml-debug
mingw32-make
set PATH=%PATH%;C:\Qt\5.2.1\bin
cd C:\Qt\qttools-opensource-src-5.2.1
qmake qttools.pro
mingw32-make
3. 下载Bitcoin 0.9.1 地址: https://github.com/bitcoin/bitcoin/archive/v0.9.1.zip
在msys shell下输入以下命令行:
cp /c/deps/libpng-1.6.10/.libs/libpng16.a /c/deps/libpng-1.6.10/.libs/libpng.a
cd /c/bitcoin-0.9.1
./autogen.sh
CPPFLAGS=”-I/c/deps/boost_1_55_0 \
-I/c/deps/db-4.8.30.NC/build_unix \
-I/c/deps/openssl-1.0.1g/include \
-I/c/deps \
-I/c/deps/protobuf-2.5.0/src \
-I/c/deps/libpng-1.6.10 \
-I/c/deps/qrencode-3.4.3″ \
LDFLAGS=”-L/c/deps/boost_1_55_0/stage/lib \
-L/c/deps/db-4.8.30.NC/build_unix \
-L/c/deps/openssl-1.0.1g \
-L/c/deps/miniupnpc \
-L/c/deps/protobuf-2.5.0/src/.libs \
-L/c/deps/libpng-1.6.10/.libs \
-L/c/deps/qrencode-3.4.3/.libs” \
./configure \
–disable-upnp-default

linux下比特币源码的编译及环境搭建

区块链趣事阅读(184)

转自CSDN,原文链接:http://blog.csdn.net/aaadssdffff/article/details/52992688

linux下比特币源码的编译及环境搭建

由于比特币的开发基本都是在linux下的,所以我也是在linux下搭建的环境。(ubuntu 16.04)

首先是比特币源码的编译

Preparation

sudo apt-get update
sudo apt-get upgrade

sudo apt-get install build-essential libtool autotools-dev autoconf pkg-config libssl-dev
sudo apt-get install libboost-all-dev
sudo apt-get install libqt5gui5 libqt5core5 libqt5dbus5 qttools5-dev qttools5-dev-tools libprotobuf-dev protobuf-compiler
sudo apt-get install libqrencode-dev
sudo apt-get install libminiupnpc-dev

Download bitcoin source code

cd ~
git clone https://github.com/bitcoin/bitcoin.git
###Download and compile Berkley DB 4.8
cd ~
mkdir bitcoin/db4/

wget 'http://download.oracle.com/berkeley-db/db-4.8.30.NC.tar.gz'
tar -xzvf db-4.8.30.NC.tar.gz
cd db-4.8.30.NC/build_unix/
../dist/configure --enable-cxx --disable-shared --with-pic --prefix=/home/theusername/bitcoin/db4/
make install

Compile Bitcoin with Berkley DB 4.8

cd ~/bitcoin/
./autogen.sh
./configure LDFLAGS="-L/home/theusername/bitcoin/db4/lib/" CPPFLAGS="-I/home/theusername/bitcoin/db4/include/"
make -s -j5

Run Bitcoin Daemon/QT/Client

./src/bitcoind
./src/qt/bitcoin-qt
./src/bitcoin-cli

参考链接:https://gist.github.com/kostaz/19729e6d53adc5d1606c


环境的搭建

用NetBeans IDE

首先按照之前的操作将比特币源码编译完之后,才可以进行以下的操作:

  • 下载NetBeans IDE
    Now you’re ready to install an IDE. You can download the C/C++ bundle of NetBeans from https://netbeans.org/downloads/
  • chmod 755 netbeans-8.2-cpp-linux.sh//截至到2016/10/20的最新版本
  • ./netbeans-8.2-cpp-linux.sh
  • 完成安装之后:
    Select File => New Project => C/C++ Project with Existing Sources => Next
    then select your Bitcoin Core checkout directory. NetBeans will build the project and then run a code analysis. Now you’re ready to start developing!

参考连接:https://medium.com/@lopp/how-to-set-up-an-ide-for-developing-bitcoin-core-on-linux-193bd313acb1#.3qjf3qi96

用vim查看:

首先配置自己的vim
(我用的这个https://github.com/tao12345666333/vim/blob/master/README-zh.md)

  • 然后添加tab:
  • (前提需要安装ctags)在bitcoin/src/目录下使用 ctags –R 命令,就会在bitcoin/src /目录下生成tags文件。
  • 然后在~/.vimrc文件中添加配置信息:set tags=/home/usrName/bitcoin/src/tags(这里其实就是生成的tags的位置)
  • 用配置好的vim就可以轻松的查看代码了。

比特币是什么?

区块链趣事阅读(164)

转载自巴比特  昌用

原文链接:http://www.8btc.com/what_is_bitcoin

理解比特币的第一道坎,是搞不清它到底是什么东西。作为“币”,比特币跟纸币、硬币的差别太大了。媒体为了迎合大众,纷纷给文章配上闪闪发光的“比特币”,其实没有一个是真的。比特币是没有实物的货币,理解它不能老想着那些实物币。

一、 比特币是一个公共账本

理解比特币,首先要理解账面上的货币。其实日常生活中,我们的钱只有很少一部分是能捏在手里的钞票,大部分都是银行账上的数字。你有10万元存款在银行,并不意味着银行要替你把10万元钞票放在金库里,只要记个数在账本上就行了。实际上,全国人民的钱只有极少量以钞票的形式存在银行里,绝大部分都是各银行账面上的。比特币干脆连极少量的钞票都不要了,全都记在账上。比特币本身就是一个大账本。银行帐本里的记账单位是“元”(¥),比特币账本里的记账单位就是“比特币”(฿)。

 

银行账本严格保密,有先进的安全措施防止人偷看和篡改。但比特币的账本是完全公开的,谁都可以拷贝一份来看看,甚至记上一笔。这岂不是太不靠谱了!别急,看并不意味着你知道谁有多少钱,记账也不意味着你能随心所欲。

二、 比特币系统中的账号和密码

比特币账本并不记录某人有多少币,只记录某些账号有多少币。至于这个账号是谁的,账本不记载。那么,我怎么能够自己拥有1个比特币呢?如果有一种办法保证只有我能支配某个账号中的比特币,那我就“拥有”了这些比特币。比特币系统通过一种加密技术实现了这一点,并且不需要透露我的任何个人信息。

 

在比特币系统中,每个比特币账号(称为公钥)都有一个对应的密码(称为私钥),只有知道密码的人才能支配相应账号的币。这样看来,拥有比特币跟拥有银行存款差不多,谁掌握了银行账号的密码,就能支配该账号的钱。但在银行,你取钱必须提交密码,银行这个密码跟他们保存的密码比对,一致了才会提款,这叫对称加密。这里,你支配银行账号存款的前提是:银行值得信赖,且技术高超,密码不会被泄露。在比特币系统中,采用的是一种“非对称加密”技术,让别人不必看到你的密码,就能确信你拥有这个密码,从而不需要信任任何第三方。

 

凭借“非对称加密”技术,在比特币系统中,作为密码的字符串A可以推算出作为账号的字符串B,但反之不能。我知道密码A,别人不知道,我就可以支配账号B的比特币。支配的方法是:我用密码A同一个支付命令(如“支付给账号H一个比特币”)混合运算得到加密信息X,这个过程称为签名。然后把字符串X告诉大家。任何人并不需要知道密码A,只需要公开的账号B就可以将X还原成转账指令,即解密。因此,每个人都能通过解密,验证我同意了“从账号B支付给H一个比特币”。这样,不需要银行,我就在不泄露密码A的情况下,行使了对账号B中比特币的支配权。换句话说,你知道某个账号的密码,你就有权支配该账号的所有币,而比特币界的第一原则就是:私钥就是一切,永远不要泄露私钥!

 

有了非对称加密技术,比特币账本就可以随便拷贝了,上面没有保存密码和个人信息,只有账号、余额和转账指令,我和我的比特币都是安全的。接下来的问题是谁来记账,怎么记账,记账时能不能给自己账号的余额后面加个0?

 

三、 比特币系统怎么记账

比特币记账就是把人们用密码签名后的转账指令记到账本上。按上例,就是在地址B上减少1个币,在地址H上增加1个。跟现实中会计记账差不多,比特币系统每隔一段时间,现在大概是8分钟,会把期间发生的所有转账指令记在一个新帐页上。记新帐页的时候,会把旧帐页的所有信息压缩计算成一串字符,写入帐页开头,这就像会计帐页编号一样确定了所有帐页的顺序,也使得篡改前面帐页中的任何一点信息,都会导致后一帐页的字符串对不上,产生连锁反应,使篡改很容易暴露。这样的账页称为区块(Block),由编号穿起来的所有帐页形成一个大账本,叫区块链(Blockchain),比特币系统的核心就是这个大账本。

 

比特币账本可以人人保有,任何人也都可以记账。但是,不同的人在不同的时间记账,要保证所有账本记得一样几乎是不可能的。但不一样的话就乱了,B到H的转账,有的人记了,有的人没记,账号B和H到底有多少币说不清了。解决的办法是,一个帐页只能有一个人来记。所有想记账的人在记账前必须做一道数学题,这道题根据前一帐页的编号和待记账的新转账指令来出,最先做出这道题的那个人才有权记录这个新帐页。再过8分钟,系统再根据新发生的转账指令出一道新题接着做……。

 

记账时,如果两人收集到同样的交易指令,做出了同样的题,那么第一个做出的记账,后面的人白做了。如果两人收集到的交易指令不一样,就做不一样的题,做出之后各记一个帐页,再出新题,分别接着记账,这就出现了分叉。不要紧,两边记账的速度总是不一样的,规则规定记得慢的这一支会被丢弃。这样,所有人都会保留账页最多的账本,即最长的区块链,因为不这样的话,自己保留的账本就不会被多数人认可,就毫无用处。这样,所有人就能够保持唯一的公共账本了。

 

记账是件麻烦事,谁愿意去记账呢?不用担心,记账是有好处的。规则规定,成功记账者可以在新帐页给自己账号添25个币,而且所记录的各项转账指令中往往也包含少量交易费,这也归记账者,这些就是对记账的奖励。这个记账过程被称作挖矿,记账者称为矿工,第一个矿工是中本聪。每帐页25个币的记账奖励是唯一的新发行比特币的办法。这种发行奖励约每四年减半,2140年前会减为0,那时矿工收入就只能靠交易费了。

 

四、 比特币账本安全吗

在银行系统中,抢钱的最佳途径是侵入银行电脑,将其他储户的钱划转到自己账号上,或直接在自己账号余额后加几个零。这在比特币系统这几乎是不可能的。比特币账号的余额由转入该账号的转账指令确定。这些转账指令都被转出账号的密码进行了签名加密,要想篡改转账数额就必须破解转出账号的密码。以比特币现在所采取的非对称加密技术,用当今最快计算机破解一个账号密码的难度超过在全球沙滩上寻找某一粒沙子。那么,作弊者能否篡改帐页,给某个地址凭空增加余额呢?不能,因为:1)这需要同时修改全球总保有量的51%账本,否则篡改得不到确认,得到的币花不出去;2)后续帐页记账时都会检查前面帐页,凭空产生非法余额的帐页会被丢弃。

 

更可行的作弊发生在登记新帐页的时候。作弊者先把自己账号B中的币转到账号H,交换H账号所有者的东西,比如美元。但收到美元后,作弊者立即再广播一个将B账号的币转到自己的I账号的指令,并且利用自己掌控的计算能力夺得记账权,使B到I的交易率先记入大账本。这样,由于B账号余额不足,B到H的转账指令将会被拒绝,这样就骗得了美元,而没有支付比特币。

 

由于记账是全部矿工共同的竞赛,其他矿工先看B到H的转账指令,因此会先确认该转账,而放弃B到I的转账。这样,作弊成功的前提是作弊者掌控的计算能力超过其他所有矿工之和,即掌握全球51%以上的挖矿算力,这样才能保证抢在所有其他人之前把B到I的转账计入账本。因此,这种作弊被称为51%攻击。

 

掌握总挖矿算力的51%很不容易,但更重要的是,发动一次51%攻击,还要找到适当的欺骗对象,只能一次性欺骗一个人,对账本并无损害,而且实施攻击容易暴露,难以继续。实际上,有了这么大的算力,诚实挖矿可以持续获得51%的新增比特币(目前大概每天新增4500个),收入可观,且可持续。

 

五、 比特币的记账规则可靠吗?

按上述规则,比特币账本和记账方法好像很安全。但是,人们为什么共同遵守这些规则,有人能够改变这些规则吗?尤其是,作为比特币系统最初设计者,中本聪会不会突然改变规则,给自己增发100万个币?或者,算力很大的矿工能不能把记账奖励从每个帐页25个改成2500个?这些是新手很担心的事情,也是“大众专家”常用来警醒世人的质疑。

 

比特币的记账规则称为“协议”,最早是由化名“中本聪”的人提出的,到现在都没有人知道他是谁。不过这丝毫不影响比特币规则的可靠性。因为,比特币的规则跟比特币账本一样,也是分散保存的,遵循多数战胜少数的原则。因为:1)比特币相关的矿工、交易者、公司等,都使用依据记账规则设计的软件进行挖矿和交易。要想使自己的挖矿奖励或交易成功记入总账本,就要遵循多数人所遵守的记账规则。如果少数人改变了记账规则,挖矿和交易信息就会与多数人的不同,就不能记入总账本;2)比特币规则以及基础性的软件都是开源的,即程序的代码都是在网络上完全公开,谁都可以看,可以测试。人外有人,破坏规则的作弊软件难以蒙蔽所有人。

 

那么,是否比特币记账规则就不能更改呢?不是的。按照多数人决定的机制,如果一项修改能够使多数人获益,比如使交易确认效率更高,或使系统更安全,那么修改后的记账规则和软件一旦发布,很快会被多数人采用,新的规则就会取代旧规则,而不管修改者是谁。也就是说,谁都可以修改规则,但只有对多数人更有利的规则才会保留下来。所以,即使中本聪也不能肆意改变规则,即使你我,如果真有能力,也可以改变规则。比特币协议这种与多数人利益相容的改进机制,使比特币系统具有了更强的生命力和可靠性,能够应对更大的挑战。

 

目前,对比特币系统的两个更加靠谱的担心是:1)其他虚拟货币能否取代比特币?2)超级计算机或新的计算方法被发明,破解了比特币的非对称加密算法怎么办?

 

由于比特币协议和相关软件都是公开的,谁都可以复制和改进,如果有一种币在技术上有所改进,会不会取代比特币呢?这是一个现实问题。已经出现了许多种币,号称超越比特币(多数被称为“山寨币”)。但是,作为货币,持有和使用的人越多,愿意持有和使用的人就会更多。相似的货币,使用者少的货币自然会被淘汰。对于其他虚拟货币的优势,当被实践检验确实重要时,可以通过比特币协议的改进纳入进来。因此,在比特币已经远远领先于其他虚拟货币的情况下,被取代的可能性不大。

 

如果超强的计算机被发明,比如传说中的量子计算机,或者破解加密技术的算法发生重大突破,比特币所依赖的非对称加密技术的确有可能被破解。但是,由于比特币协议可以改进,当这种发明或技术突破出现,分布在世界各个角落的比特币参与者会很快发现并传播。为了共同的财富安全,比特币世界很容易达成共识,暂停所有转账,修改规则和相关软件,采用新的算法提高破解难度。这是对多数人有利的,因此很容易获得多数人的同意。随着新的规则被多数人接受,比特币系统得以继续安全运行。所以,尽管比特币的记账规则是可变的,但这使它变得更可靠。

六、 比特币是互联网时代的自由货币

比特币是一种货币,但不是实物货币,而是记账货币。区块链是比特币系统的总账本,人人可以查看、记录和保存,多数人认同的版本将被更多人接受,这种简单多数原则保障了总账本的一致性,也为每个人的所有权提供了最可靠的证明。简单多数原则也保证了比特币账本的记账规则的可靠性,代表了多数人利益的规则就是正确的规则,这保证了比特币系统的生命力。

 

比特币的账本和规则不包含任何主权、种族、宗教、性别的隔阂,任何人都可以了解它,并参与其中。因此,比特币是全世界、各民族、各种宗教通用的货币。由于摆脱了主权的控制,各国政府不能够控制比特币的发行,比特币将按照多数人同意的规则增长,货币滥发造成的通货膨胀不会出现在比特币经济中。因此,比特币是一种无国界、不可滥发的记账货币。

 

迈过了理解的门槛之后,享用比特币的方法很简单:拥有比特币只需要记住一个密码,交易比特币只需要有电脑网络。除了私钥,比特币没有秘密,任何人都可以深入到比特币系统最深的核心,可以成为账本的记录者和规则的制定者。在这里,个人的自由和才能得到充分体现,比特币就是互联网时代的自由货币。

区块链开发平台

区块链趣事阅读(192)

区块链底层平台

1.比特币

共识机制:POW  关键词:数字货币

比特币(BitCoin)是最早也是全球最广泛使用和真正意义的去中心化区块链技术,因此他的开源技术体系非常值得参考。

比特币区块链的核心技术框架采用C++语言开发,共识算法采用POW算法,工作量(挖矿)证明获得记账权,容错50%,实现全网记账,公网性能TPS<7。

开源地址为:https://github.com/bitcoin/bitcoin

2.以太坊

共识机制:POS   关键词:智能合约,图灵完备

以太坊是一个图灵完备的区块链一站式开发平台,采用多种编程语言实现协议,采用Go语言写的客户端作为默认客户端(即与以太坊网络交互的方法, 支持其他多种语言的客户端)。基于以太坊平台之上的应用是智能合约,这是以太坊的核心。智能合约配合友好的界面和外加一些额外的小支持,可以让用户基于合约搭建各种千变万化的DApp应用,这样使得开发人员开发区块链应用的门槛大大降低。

 

以太坊ETH的开源地址:https://github.com/ethereum

3.Hyperledge fabric

共识机制:PBFT  关键词:联盟链,IBM

一个带有可插入各种功能模块架构的区块链实施方案,他的目标是打造成一个由全社会来共同维护的一个超级账本。

fabric架构核心逻辑有三条:Membership、Blockchain和Chaincode。MembershipServices这项服务用来管理节点身份、隐私、保密性、可审计性。Blockchain services使用建立在HTTP/2上的P2P协议来管理分布式账本,提供最有效的哈希算法来维护区块链世界状态的副本。采取可插拔的方式来根据具体需求来设置共识协议,比如PBFT,Raft,PoW和PoS等等,IBM首选PBFT算法。Chaincode services 会提供一种安全且轻量级的沙盒运行模式,来在VP节点上执行chaincode逻辑,类似以太坊的EVM虚拟机及其他上面运行的智能合约。

 

开源地址:https://github.com/hyperledger/fabric。Fabric的主要框架核心开发语言是GO语言,系统目标是15个验证节点下最理想情况下可以有100K TPS的性能,更适合于联盟链。

4.小蚁区块链

共识机制:dBFT   关键词:数字资产,智能合约,国内

国内的第一款开源区块链产品,技术方面在国内属于前列。小蚁区块链采用改进的拜占庭容错算法dBFT共识算法,支持智能合约,目前重点领域在数字资产应用,框架核心开发语言C#,支持导入CA证书,在国内应用性较强。目前在跨链技术有不错的发展,记账节点为动态节点,投票产生。

开源地址为https://github.com/antshares/antshares

5.比特股

共识机制:DPOS  关键词:全面

比特股(BitShares)是区块链历史上里程碑式的产品之一,截至目前仍然是完整度最高、功能最丰富、性能最强大的区块链产品之一。比特股是可以看作是一个公司、货币甚至是一个社区。它提供的BitUSD等锚定资产是虚拟币历史上的一个最重要变革之一,能够极大消除虚拟货币被人诟病的波动性大的问题。

比特股的1.0开源地址是:https://github.com/bytemaster/bitshares,2.0开源库在:http://github.com/bitshares。他的核心技术框架采用C++语言开发,既适用于公有链,也适合于联盟链,只需要少量节点进行记账,TPS>500,容错50%,在比特股2.0中如果在最优的网络和硬件情况下可以达到最高100K的TPS。

6.LISK

共识机制:DPOS   关键词:纯js开发,应用程序构建

Lisk是一种加密货币,能够使全球开发者社区更容易地构建去中心化应用程序(DApps)。Lisk使用JavaScript开发语言来构建DApps的这一特点大大吸引了投资者,因为JavaScript是Github上最流行的开发语言,被广泛用于web开发。

 

开源地址https://github.com/LiskHQ

区块链的几大共识机制及优缺点

区块链趣事阅读(163)

首先,没有一种共识机制是完美无缺的,各共识机制都有其优缺点,有些共识机制是为解决一些特定的问题而生。

1.pow( Proof of Work)工作量证明

一句话介绍:干的越多,收的越多。

依赖机器进行数学运算来获取记账权,资源消耗相比其他共识机制高、可监管性弱,同时每次达成共识需要全网共同参与运算,性能效率比较低,容错性方面允许全网50%节点出错。

优点:

1)算法简单,容易实现;

2)节点间无需交换额外的信息即可达成共识;

3)破坏系统需要投入极大的成本;

缺点:

1)浪费能源;

2)区块的确认时间难以缩短;

3)新的区块链必须找到一种不同的散列算法,否则就会面临比特币的算力攻击;

4)容易产生分叉,需要等待多个确认;

5)永远没有最终性,需要检查点机制来弥补最终性;

2.POS Proof of Stake,权益证明

一句话介绍:持有越多,获得越多。

主要思想是节点记账权的获得难度与节点持有的权益成反比,相对于PoW,一定程度减少了数学运算带来的资源消耗,性能也得到了相应的提升,但依然是基于哈希运算竞争获取记账权的方式,可监管性弱。该共识机制容错性和PoW相同。它是Pow的一种升级共识机制,根据每个节点所占代币的比例和时间,等比例的降低挖矿难度,从而加快找随机数的速度

优点:在一定程度上缩短了共识达成的时间;不再需要大量消耗能源挖矿。

缺点:还是需要挖矿,本质上没有解决商业应用的痛点;所有的确认都只是一个概率上的表达,而不是一个确定性的事情,理论上有可能存在其他攻击影响。例如,以太坊的DAO攻击事件造成以太坊硬分叉,而ETC由此事件出现,事实上证明了此次硬分叉的失败。

DPOS与POS原理相同,只是选了一些“人大代表”。

BitShares社区首先提出了DPoS机制。

与PoS的主要区别在于节点选举若干代理人,由代理人验证和记账。其合规监管、性能、资源消耗和容错性与PoS相似。类似于董事会投票,持币者投出一定数量的节点,代理他们进行验证和记账。

DPoS的工作原理为:

去中心化表示每个股东按其持股比例拥有影响力,51%股东投票的结果将是不可逆且有约束力的。其挑战是通过及时而高效的方法达到51%批准。为达到这个目标,每个股东可以将其投票权授予一名代表。获票数最多的前100位代表按既定时间表轮流产生区块。每名代表分配到一个时间段来生产区块。所有的代表将收到等同于一个平均水平的区块所含交易费的10%作为报酬。如果一个平均水平的区块含有100股作为交易费,一名代表将获得1股作为报酬。

网络延迟有可能使某些代表没能及时广播他们的区块,而这将导致区块链分叉。然而,这不太可能发生,因为制造区块的代表可以与制造前后区块的代表建立直接连接。建立这种与你之后的代表(也许也包括其后的那名代表)的直接连接是为了确保你能得到报酬。

该模式可以每30秒产生一个新区块,并且在正常的网络条件下区块链分叉的可能性极其小,即使发生也可以在几分钟内得到解决。

成为代表:

成为一名代表,你必须在网络上注册你的公钥,然后分配到一个32位的特有标识符。然后该标识符会被每笔交易数据的“头部”引用。

授权选票:

每个钱包有一个参数设置窗口,在该窗口里用户可以选择一个或更多的代表,并将其分级。一经设定,用户所做的每笔交易将把选票从“输入代表”转移至“输出代表”。一般情况下,用户不会创建特别以投票为目的的交易,因为那将耗费他们一笔交易费。但在紧急情况下,某些用户可能觉得通过支付费用这一更积极的方式来改变他们的投票是值得的。

保持代表诚实:

每个钱包将显示一个状态指示器,让用户知道他们的代表表现如何。如果他们错过了太多的区块,那么系统将会推荐用户去换一个新的代表。如果任何代表被发现签发了一个无效的区块,那么所有标准钱包将在每个钱包进行更多交易前要求选出一个新代表。

抵抗攻击:

在抵抗攻击上,因为前100名代表所获得的权力权是相同的,每名代表都有一份相等的投票权。因此,无法通过获得超过1%的选票而将权力集中到一个单一代表上。因为只有100名代表,可以想象一个攻击者对每名轮到生产区块的代表依次进行拒绝服务攻击。幸运的是,由于事实上每名代表的标识是其公钥而非IP地址,这种特定攻击的威胁很容易被减轻。这将使确定DDOS攻击目标更为困难。而代表之间的潜在直接连接,将使妨碍他们生产区块变得更为困难。

优点:大幅缩小参与验证和记账节点的数量,可以达到秒级的共识验证。

缺点:整个共识机制还是依赖于代币,很多商业应用是不需要代币存在的。

3.PBFT :Practical Byzantine Fault Tolerance,实用拜占庭容错

介绍:在保证活性和安全性(liveness & safety)的前提下提供了(n-1)/3的容错性。

在分布式计算上,不同的计算机透过讯息交换,尝试达成共识;但有时候,系统上协调计算机(Coordinator / Commander)或成员计算机 (Member /Lieutanent)可能因系统错误并交换错的讯息,导致影响最终的系统一致性。

拜占庭将军问题就根据错误计算机的数量,寻找可能的解决办法,这无法找到一个绝对的答案,但只可以用来验证一个机制的有效程度。

而拜占庭问题的可能解决方法为:

在 N ≥ 3F + 1 的情况下一致性是可能解决。其中,N为计算机总数,F为有问题计算机总数。信息在计算机间互相交换后,各计算机列出所有得到的信息,以大多数的结果作为解决办法。

优点:

1)系统运转可以脱离币的存在,pbft算法共识各节点由业务的参与方或者监管方组成,安全性与稳定性由业务相关方保证。

2)共识的时延大约在2~5秒钟,基本达到商用实时处理的要求。

3)共识效率高,可满足高频交易量的需求。

缺点:

1)当有1/3或以上记账人停止工作后,系统将无法提供服务;

2)当有1/3或以上记账人联合作恶,且其它所有的记账人被恰好分割为两个网络孤岛时,恶意记账人可以使系统出现分叉,但是会留下密码学证据;

区块链的几大共识机制及优缺点

本着支持国产的原则,下面说两个国内自创比较出色的

4.dBFT: delegated BFT 授权拜占庭容错算法

介绍:小蚁采用的dBFT机制,是由权益来选出记账人,然后记账人之间通过拜占庭容错算法来达成共识。

此算法在PBFT基础上进行了以下改进:

将C/S架构的请求响应模式,改进为适合P2P网络的对等节点模式;

将静态的共识参与节点改进为可动态进入、退出的动态共识参与节点;

为共识参与节点的产生设计了一套基于持有权益比例的投票机制,通过投票决定共识参与节点(记账节点);

区块链中引入数字证书,解决了投票中对记账节点真实身份的认证问题。

优点:

1)专业化的记账人;

2)可以容忍任何类型的错误;

3)记账由多人协同完成,每一个区块都有最终性,不会分叉;

4)算法的可靠性有严格的数学证明;

缺点:

1)当有1/3或以上记账人停止工作后,系统将无法提供服务;

2)当有1/3或以上记账人联合作恶,且其它所有的记账人被恰好分割为两个网络孤岛时,恶意记账人可以使系统出现分叉,但是会留下密码学证据;

以上总结来说,dBFT机制最核心的一点,就是最大限度地确保系统的最终性,使区块链能够适用于真正的金融应用场景

5.POOL验证池

基于传统的分布式一致性技术,加上数据验证机制。

优点:不需要代币也可以工作,在成熟的分布式一致性算法(Pasox、Raft)基础上,实现秒级共识验证。

缺点:去中心化程度不如bictoin;更适合多方参与的多中心商业模式

相关名词解释

区块链趣事阅读(188)

名词解释:

  • 区块链相关:

    区块链技术(Block Chain)是指通过去中心化的方式集体维护一个可靠数据库的技术方案。该技术方案主要让区块(Block)通过密码学方法相关联起来,每个数据块包含了一定时间内的系统全部数据信息,并且生成数字签名以验证信息的有效性并链接到下一个数据块形成一条主链(Chain)。

区块(Block)一个区块是一个数据包,其中包含零个或多个交易,前块(“父块”)的散列值,以及可选的其它数据。除了初始的“创世区块”以外每个区块都包含它父块的散列值,区块的全部集合被称为区块链,并且包含了一个网络里的全部交易历史。注意有些基于区块链的加密货币使用“总账”这个词语来代替区块链。这2者的意思是大致相同的,虽然在使用“总账”这个术语的系统里,每个区块都通常包括每个账户的目前状态(比如货币余额,部分履行的合约,注册)的全部拷贝,并允许用户抛弃过时的历史数据。

挖矿(Mining)指通过计算形成新的区块,是交易的支持者利用自身的计算机硬件为网络做数学计算进行交易确认和提高安全性的过程。以比特币为例:交易支持者(矿工)在电脑上运行比特币软件不断计算软件提供的复杂的密码学问题来保证交易的进行。作为对他们服务的奖励,矿工可以得到他们所确认的交易中包含的手续费,以及新创建的比特币。

对等式网络(Peer-to-Peer Network)是指通过允许单个节点与其他节点直接交互,从而实现整个系统像有组织的集体一样运作的系统。以比特币为例:网络以这样一种方式构建——每个用户都在传播其他用户的交易。而且重要的是,不需要银行或其他金融机构作为第三方。

哈希散列(Hash)是密码学里的经典技术,把任意长度的输入通过哈西算法,变换成固定长度的由字母和数字组成的输出。

数字签名(Digital Signature)是一个让人可以证明所有权的数学机制。

私钥(Private Key)是一个证明你有权从一个特定的钱包消费电子货币的保密数据块,是通过数字签名来实现的 。

双重消费 又称“双花”,指用户试图非法将电子货币同时支付给两个不同的收款人,是电子货币的最大风险之一。

分叉:指向同一个父块的2个区块被同时生成的情况,某些部分的矿工看到其中一个区块,其他的矿工则看到另外一个区块。这导致2种区块链同时增长。通常来说,随着在一个链上的矿工得到幸运并且那条链增长的话,所有的矿工都会转到那条链上,数学上分几乎会在4个区块内完结自己。

SPV客户端(或轻客户端):一个只下载一小部分区块链的客户端,使拥有像智能手机和笔记本电脑之类的低功率或低存储硬件的用户能够保持几乎相同的安全保证,这是通过有时选择性的下载的小部分的状态,而在区块链验证和维护时,不需要花费兆字节的带宽或者千兆字节的存储空间。

侧链:楔入式侧链技术( pegged sidechains),它将实现比特币和其他数字资产在多个区块链间的转移,这就意味着用户们在使用他们已有资产的情况下,就可以访问新的加密货币系统。目前,侧链技术主要是由Blockstream公司负责开发。
侧链白皮书(中文)http://8btc.com/doc-view-529.html
英文:http://8btc.com/doc-view-525.html

跨链:跨链互操作协议,其中包含两个部分,跨链资产交换协议和跨链分布式事务协议。前者可以实现多个区块链之间的原子级资产交换;后者可以保证多个区块链共同执行智能合约,并保证事务一致性。小蚁较早地提出跨链技术,目前也走在了跨链技术的前列。

  • 比特币相关:

    (来自比特币官网,原文https://bitcoin.org/zh_CN/vocabulary)

比特币

首字母大写的Bitcoin用来表示比特币的概念或整个比特币网络本身。例如:“今天我学了些有关Bitcoin协议的内容。”
而没有大写的bitcoin则表示一个记账单位。例如:“我今天转出了10个bitcoin。”该单位通常也简写为BTC或XBT。

比特币地址

比特币地址就像一个物理地址或者电子邮件地址。这是别人付给你比特币时你唯一需要提供的信息。然而一个重要的区别是,每个地址应该只用于单笔交易。

对等式网络

对等式网络是指,通过允许单个节点与其他节点直接交互,从而实现整个系统像有组织的集体一样运作的系统 。对于比特币来说,比特币网络以这样一种方式构建——每个用户都在传播其他用户的交易。而且重要的是,不需要银行作为第三方。

哈希率

哈希率是衡量比特币网络处理能力的测量单位。为保证安全,比特币网络必须进行大量的数学运算。当网络达到10Th/秒的哈希率时,就意味着它能够进行每秒10万亿次的计算。

交易确认

交易确认意味着一笔交易已经 被网络处理且不太可能被撤销。当交易被包含进一个 时会收到一个确认,后续的每一个块都对应一个确认。对于小金额交易单个确认便可视为安全,然而对于比如1000美元的大金额交易,等待6个以上的确认比较合理。每一个确认都成 指数级地降低交易撤销的风险。

块链

块链是一个按时间顺序排列的比特币交易公共记录。块链由所有比特币用户共享。它被用来验证比特币交易的永久性并防止双重消费

密码学

密码学是数学的一个分支,它让我们创造出可以提供很高安全性的数学证明。电子商务和网上银行也用到了密码学。对于比特币来说,密码学用来保证任何人都不可能使用他人钱包里的资金,或者破坏块链。密码学也用来给钱包加密,这样没有密码就用不了钱包。

签名

密码学签名是一个让人可以证明所有权的数学机制。对于比特币来说,一个比特币钱包和它的私钥通过一些数学魔法关联到一起。当你的比特币软件用对应的私钥为一笔交易签名,整个网络都能知道这个签名和已花费的比特币相匹配。但是,世界上没有人可以猜到你的私钥来窃取你辛苦赚来的比特币。

钱包

比特币钱包大致实体钱包在比特币网络中的等同物。钱包中实际上包含了你的私钥,可以让你消费块链中分配给钱包的比特币。和真正的钱包一样,每个比特币钱包都可以显示它所控制的所有比特币的总余额,并允许你将一定金额的比特币付给某人。这与商家进行扣款的信用卡不同。

私钥

私钥是一个证明你有权从一个特定的钱包消费比特币的保密数据块,是通过一个密码学签名来实现的 。如果你使用的是钱包软件,你的私钥就存储在你的计算机内;如果使用的是在线钱包,你的私钥就存储在远程服务器上。千万不能泄露私钥,因为它们可以让你消费对应比特币钱包里的比特币。

挖矿

比特币挖矿是利用计算机硬件为比特币网络做数学计算进行交易确认和提高安全性的过程。作为对他们服务的奖励,矿工可以得到他们所确认的交易中包含的手续费,以及新创建的比特币。挖矿是一个专业的、竞争激烈的市场,奖金按照完成的计算量分割。并非所有的比特币用户都挖矿,挖矿赚钱也并不容易。

Bit

Bit 是标明一个比特币的次级单位的常用单位 -1,000,000 bit 等于1 比特币 (BTC 或 B⃦).,这个单位对于标示小费、商品和服务价格更方便。

BTC

BTC 是用于标示一个比特币 (B⃦). 的常用单位。

  • 以太坊相关

序列化:将一个数据结构转换成一个字节序列的过程。以太坊在内部使用的编码格式称为递归长度前缀编码(RLP),在这里有描述

帕特里夏树:一种数据结构,它会存储每个帐户的状态。这个树的建立是通过从每个节点开始,然后将节点分成多达16个组,然后散列每个组,然后对散列结果继续散列,直到整个树有一个最后的“根散列”。该树具有重要的特性:(1)只有正好一个可能的树,因此,每个数据集对应一个可能的根散列(2)很容易的更新,添加,或者删除树节点,以及生成新的根散列,(3)不改变根散列的话没有办法修改树的任何部分,所以如果根散列被包括在签名的文档或有效区块中话,签名或工作证明可以担保整个树( 4)任何人只可以提供一个下到特定节点的分支,可以加密得证明拥有确切内容的节点的确是在树里。帕特里夏树也被用来存储账户,交易已经叔块的内部存储。在这里能看到更详细的说明。

幽灵(Ghost):幽灵是一个协议,通过这个协议,区块可以包含不只是他们父块的散列值,也散列父块的父块的其他子块(被称为叔块)的陈腐区块。这确保了陈腐区块仍然有助于区块链的安全性,并减轻了大型矿工在快速区块链上的有优势的问题,因为他们能够立即得知自己的区块,因此不太可能产生陈腐区块。

叔块:是父区块的父区块的子区块,但不是自个的父区块,或更一般的说是祖先的子区块,但不是自己的祖先。如果A是B的一个叔区块,那B是A的侄区块。

帐户随机数:每个账号的交易计数。这样可以防止重放攻击,其中一个交易发送比如 20个币从A到B,并可以被B重放一遍又一遍,直到不断抽干A的账户余额。

EVM代码:以太坊虚拟机代码,以太坊的区块链可以包含的编程语言的代码。与帐户相关联的EVM代码在每次消息被发到这个账户的时候被执行,并且具有读/写存储和自身发送消息的能力。

消息:一种由EVM代码从一个账户发送到另一个账户的“虚拟交易”。需要注意的是“交易”和“消息”在以太坊种是不同的;在以太坊用语的“交易”具体指的是物理的数字签名的一串数据,并且每个交易触发相关联的消息,但消息也可以通过EVM代码发送,在这种情况下,它们从不表示成任何数据。

储存:包含在每个帐户里的键/值数据库,其中键和值都是32个字节的字符串,但可以以其他方式包含任何东西。

外部拥有账户:通过私钥控制的账户。外部拥有账户不能包含EVM代码。

合约:一个包含并且受EVM的代码控制的账户。合约不能通过私钥直接进行控制,除非被编译成EVM代码,一旦合约被发行就没有所有者。

以太(Ether):以太坊网络的内部基础的加密代币。以太是用来支付交易和以太坊交易的计算费用。

瓦斯:大致相当于计算步骤的计量。每一笔交易需要包括瓦斯的限制,还有愿意为每瓦斯支付的费用;矿工可以选择是否收录交易和收集费用。由包括原始消息以及任何可能被触发的子消息的交易产生的计算所使用的瓦斯总量,如果大于或者等于瓦斯的限制,则交易被处理。除非交易仍然有效并且费用仍然被矿工收集,否则瓦斯的总量小于限制则所有变更被还原。每一个操作都有瓦斯支出;对于大多数操作,花费是1瓦斯,尽管一些昂贵的操作会支出高达100瓦斯,交易本身会有500瓦斯的支出。

  • 非区块链

以太浏览器(Mist):即将到来的以太坊基础客户端,会以Web浏览器的形式存在,可被用来访问正常的网站以及建立在以太坊平台上的应用程序。

耳语(Whisper):即将到来的点到点信息协议,将会被整合到以太浏览器。

蜂群(Swarm):即将到来的,为静态web托管而优化的点到点数据存储协议,将被整合到以太浏览器。

LLL,Serpent和Mutan:为编写合约代码的编程语言,可被编译成EVM代码。serpent可以被编译为LLL。

PoC:概念证明(proof-of-concept)的英文缩写,预发布版的另一个称呼。

周边概念:应用程序和治理

分散化应用程序:为了某些特定目的(如:在某些市场上连接买家和卖家,共享文件,网络文件存储,维持货币),无论是使用还是创建一个分散的网络,由许多人来运行的程序。基于以太坊的分散式的应用程序(也称为Đapps,其中Đ为北欧字母“eth”)通常包括一个HTML/ JavaScript的网页,并且如果在以太浏览器内部查看的话,可识别特殊的Javascript的API,用于发送交易数据到区块链,从区块链读取数据,和耳语,蜂群交互数据。一个Đapp通常在区块链上有特定的相关合约,但有利于创造许多合约的Đapps是完全可能的。

分散化组织(GDO):一个没有中央领导,而是使用正式民主投票进程和共识主动性自我组织的结合来作为其基本操作原则。一个不太令人印象深刻,但有时混淆的概念是“地理上的分散化组织”(GDO),组织里人在相距甚远的地方工作,甚至可能都没有办公室; GDOs可能会有正式的中央领导。

忒修斯标准:用于查明一个组织的分散化程度的测试。测试如下:假设组织有N个人,然后外星人一次从组织中(比如每周一次)挑选K个人出来,摧毁他们存在,在每个群里以K个对组织不了解的新人来代替。现在为了让组织起作用,K可以高达多少人呢?在独裁政权里,当K=1即独裁者被摧毁后就会失败。美国政府稍微好一点,但如果参议院和国会的所有638成员突然消失了的话,仍然会有很大的问题。但像比特币或BitTorrent即便对极高的K值也具有复原性,因为新的代理人可以简单地根据自己的经济动机来填补缺失的角色。还有一个更严格的测试,拜占庭忒修斯标准,它包含同一时间内随机的用恶意行为者取代K个用户一段时间,之后再替换成新用户。

委任式民主(或流动式民主):一个对于DOs(分散式组织)和DAO(分散式自治组织)的治理机制,在默认情况下每个人对每件事情都投票,但在某些特定的问题上个人可以选择特定的他人为他们投票。这个想法概括了以下2种民主的权衡,完全直接民主(每个人都有相同的权力)和专家意见/有某些特定人提供的快速决策能力(允许人们自己顺从朋友,政治家,领域专家或者自己选择的任何人)。

部分被投机市场控制的理论上的政府:最初是由Robin Hanson提出的,为了管理政治组织治理机制。但它实际上是非常适用DOs和DAO的:通过预测市场来管理。从根本上,一些易于衡量成功的标准被选择,还有发行由成功标准的值来决定的代币,这些代币将在未来的某个时间(例如,1年后)被支付,对于每个可能要采取的行动都用一个这样的代币。这些代币都被兑换为相应的美元代币,如果相应的措施被执行,正好1美元会被支付 (如果相应的措施没有被执行,这两种类型的代币支付0美元,所以正在被执行的行动的概率不会影响价格)。市场预计的行动将有最好的结果,当其代币在市场上有高价格时会被执行。这提供了另一种自治的,选择机制,同时奖励专家的意见。

  • 经济学

代币制度:本质上是可以交易的虚拟代替物。更正式地说,代币制度是一个数据库,它映射地址到数字,并具有以下属性,基本允许的操作是把N个代币从A转给B,条件是N是非负,且N不小于A的当前余额,授权该转账的证件由A进行数字签名。二次“发行”和“消费”的操作也可以存在,交易费用也可以被收集,许多当事人同时进行转账也是可能的。典型应用案例,包括货币,网络加密代币,公司的股份和数字礼品卡。

命名空间:一个映射名字到值的数据库。举个最简单的例子,如果名称尚未被占有的话(也许可以在支付一些费用之后)任何人可以注册一个条目。如果名称已经被占有了,那么就只能被改变(如果有的话),由作出原始注册的账户(在许多系统中,所有权也转移)。命名空间可以用来存储用户名,公钥,互联网域名,代币制度或其他命名空间,和许多其他应用。

相关名词解释

身份:一组可以加密验证的互动,具有同一个人创建的的属性。

唯一的身份:一组可以加密验证的互动,具有以下属性:同一个人创建的。再加上一个人不能有多个唯一身份的约束。

激励相容:如果每个人都更好的“遵守规则”而不是试图欺骗,除非至少要大量的人都同意同时一起欺骗,那么协议是激励相容的。

基本收入:每隔一段时间(比如几个月)就给每一个唯一的身份发送一定量的代币的想法。其最终目的是为了让不愿意工作或者不能工作的人能够依靠这份津贴活下来。这些代币可以简单的凭空制作出来,或者来自收益流(比如来自创收实体或政府)。为了单靠基本收入使人能够生活,可能会用到多个收益流的组合。

公益:一个为非常多的人提供了一个非常小的好处的服务。这样就没有任何个体对是否进行生产有影响力,因此也没有人有动力来支付。

声誉:身份的一个属性,其他实体认为这个身份可以(1)胜任一些特定的任务,或(2)在一些情况下是值得信赖。比如说不太可能因为短期的获利而出卖别人。

信任网络:如下的想法,如果A高度信任B,B高度信任C,则A可能是信任C的。为决定特定个体在特定概念下的可靠性的复杂而有力的机制,理论上可以由这个原则推断出来。

第三方托管:如果两个低信誉的实体所从事的贸易时,付款人可能希望把钱留在具有高信誉的第三方,并指示只有在产品交付后,才让第三方把钱发给收款人。这减少了付款人或收款人欺诈的风险。

保证金:放入合约里的涉及另外一方的数字资产,如果某些条件不满足时,该资产会自动被对方没收。

抵押:放入合约里的涉及另外一方的数字资产,如果某些条件不满足时,该资产会自动被销毁或据献给慈善或者基本收入基金。也许可以让利益广泛分配,但必须让特定的个人不能显著的受益。

关于加密货币以及任何新的技术的令人不爽的一件事,就是其用于描述所有新概念的词汇的绝对数量。只要不是临时的,最基本的处理的情况,任何与在点对点互联网软件打交道的人都需要与加密的概念打交道,包括散列,签名,公钥,私钥,对称和不对称加密,服务保护拒绝,还有例如分布式哈希表,信任网络之类的神秘的构造。新的比特币用户被迫与学习加密的基本常识而奋斗,还有额外的内部术语,如“区块”,“确认”,“挖矿”,“SPV客户”和“51%的攻击”,以及经济概念,如激励相容和集权与分权的微妙差别。以太坊,作为一个基于加密货币的泛化的分散的应用开发平台,必然既包含这些概念的集合,也增加了许多自身的概念。为了帮助新来以太坊的人,无论他们是加密货币爱好者,企业家,社会或政治愿景家,Web开发人员或只是看看这项技术能如何改善生活的普通人,下面的列表的目的是为了提供一个以太坊用户常常使用的词汇的基本总结:

  • 密码学

计算上不可行:一个处理被称为是计算上不可行,如果有人想有兴趣完成一个处理但是需要采取一种不切实际的长的时间来做到这一点的(如几十亿年)。通常,2的80次方的计算步骤被认为是计算上不可行的下限。

散列:一个散列函数(或散列算法)是一个处理,依靠这个处理,一个文档(比如一个数据块或文件)被加工成看起来完全是随机的小片数据(通常为32个字节),从中没有意义的数据可以被复原为文档,并且最重要的性能是散列一个特定的文档的结果总是一样的。

此外,极为重要的是,找到具有相同散列的两个文件在计算上是不可能的。一般情况下,即使改变文件的一个字母也将完全打乱散列;例如,“ Saturday”的SHA3散列为c38bbc8e93c09f6ed3fe39b5135da91ad1a99d397ef16948606cdcbd14929f9d,而Caturday的SHA3散列是b4013c0eed56d5a0b448b02ec1d10dd18c1b3832068fbbdc65b98fa9b14b6dbf。散列值经常被用作以下用途:为无法伪造的特定文档而创建的全局商定标识符。

加密:与被称为钥匙(例如c85ef7d79691fe79573b1a7064c19c1a9819ebdbd1faaab1a8ec92344438aaf4)的短字符串的数据相结合,对文档(明文)所进行的处理。加密会产生一个输出(密文),这个密文可以被其他掌握这个钥匙的人“解密”回原来的明文,但是对于没有掌握钥匙的人来说是解密是费解的且计算上不可行。

公钥加密:一种特殊的加密,具有在同一时间生成两个密钥的处理(通常称为私钥和公钥),使得利用一个钥匙对文档进行加密后,可以用另外一个钥匙进行解密。一般地,正如其名字所建议的,个人发布他们的公钥,并给自己保留私钥。

数字签名:数字签名算法是一种用户可以用私钥为文档产生一段叫做签名的短字符串数据的处理,以至于任何拥有相应公钥,签名和文档的人可以验证(1)该文件是由特定的私钥的拥有者“签名”的,(2)该文档在签名后没有被改变过。请注意,这不同于传统的签名,在传统签名上你可以在签名后涂抹多余的文字,而且这样做无法被分辨;在数字签名后任何对文档的改变会使签名无效。

比特币协议是怎样工作的(下)

区块链趣事阅读(178)

此文转自巴比特

作者:Michael Nielsen

译者:杨硕

此文为《比特币协议是怎样工作的(下)》,(上)半部分请看这里

比特币

现在,让我们离开Infocoin,转向的真正的比特币协议。比特币和我们刚才一步步建立起来的Infocoin没有多大的差别,除了一个明显的改变。

要使用比特币,首先你得在电脑里安装一个钱包。为了让你更好的理解,下图是一个叫做Multibit的钱包的截图。你可以在左上角看到比特币的余额——0.06555555 个比特币,按截图的当时的交易价格来算将近70美元。截图右边显示了两个最近的交易,他们是存入这0.06555555个比特币。

比特币协议是怎样工作的(下)

假设你是一个商家,你已经准备好了一个在线商店,你决定允许客户用比特币支付。你需要做的是,用你的钱包程序新生成一个比特币地址。它会自动生成一对公钥和私钥,然后hash你的公钥来形成你的比特币地址。

比特币协议是怎样工作的(下)

然后你将你的比特币地址发给要付给你钱的人。你可以用邮箱,或者直接放到你的网页上。这是安全的,因为你的地址只不过是hash了的公钥,你可以放心的公布给任何人(没人能通过它来得到你的私钥)。 我会在后面解释为什么比特币地址用的是公钥的hash值而不是公钥本身。

现在那个准备付钱的人需要创建一个新的交易。让我们看一个真实的转入0.319个比特币的交易数据。下面这个就将近是原始数据了,这里有三个地方的改变:1)数据没有连续化;2)加了行编号,为了更好理解;3)省略了hash数据的一长串数字,只保留了前6位。

1.  {"hash":"7c4025...",
2.  "ver":1,
3.  "vin_sz":1,
4.  "vout_sz":1,
5.  "lock_time":0,
6.  "size":224,
7.  "in":[
8.    {"prev_out":
9.      {"hash":"2007ae...",
10.      "n":0},
11.    "scriptSig":"304502... 042b2d..."}],
12. "out":[
13.   {"value":"0.31900000",
14.    "scriptPubKey":"OP_DUP OP_HASH160 a7db6f OP_EQUALVERIFY OP_CHECKSIG"}]}

让我们一行一行解释。

第1行,交易hash值(16进制),他是用来代表这个交易的唯一标记。

第2行,告诉我们这个交易用的是第一版本的比特币协议。

第3、4行,告诉我们这个交易有一个输入和一个输出。(一个交易可以有多个输入和多个输出)

第5行,是一个锁定时间(lock_time),可以用它来控制这个交易什么时候完成。现在大多数的比特币交易锁定时间都是0,也就是马上完成交易。

第6行,告诉我们这个交易的大小有多少个字节(bytes),注意,这个不是交易的钱。

第7到11行,这一段定义了这个交易的输入部分,确切的说,8到10行告诉我们要转走钱的这个输入值的钱是从上一个交易输出值里得来的。那个2007ae…就是上一个交易的16进制的hash值,用来指向上一个交易。n=0说的是它是上一个交易里面的第一个输出,我们过一会儿会看到多个输入和输出是什么样子,所以现在先不用担心。11行是那个发送钱的人的数字签名:304502… 空格之后是他的公钥:04b2d… 同样这两个都是16进制

这里输入部分值得注意的是,它并没有说前一个交易中的比特币,有多少会转给后一个。实际上,在前一个交易里面n=0的输出内所有的比特币都被转移了。比如说,如果前一个交易里的第一个输出(n=0)里面有2个比特币,那么这两个比特币在新的这个交易中都会被花掉。这看起来很不方便,就好像用20美元的现金去买一个面包一样。解决办法是提供一个找零钱的机制,这一点可以通过多个输入和输出的方式解决,下一部分就会讲到。

第12到14行,这段定义了交易的输出。具体说,13行告诉我们输出的钱的数量,这里是0.319个比特币。14行比较复杂,值得注意的是字符串a7db6f…是收取比特币的地址。这一行其实是一段比特币的脚本语言,在这里不细讲脚本语言的细节。你只需要知道a7db6f…是收取的地址就行了。

现在,你可以看到比特币是如何解决我们之前提到的“序列号从哪里来”的问题了。第一,比特币并不是分开的一个个单独的“币”,而是一长串存在于blockchain里的交易。通过保存一个交易账本来实现比特币是一个很聪明的想法。第二,通过这种方式,我们不需要一个中央机构来发布序列号。序列号可以通过hash交易本身来得到。

我们可以一直顺着交易链一直往回看。最终到头的时候,有两种可能,第一,你可能会走到第一个比特币交易,这个交易存在一个block里,我们把这个block叫做“Genesis block (初始区块)”。这是一个特殊的交易,它没有输入,只有50个比特币的输出。换句话说,它是最最早的比特币供应。Genesis block被比特币客户端区别对待,这里不去细讲。

第二个顺着交易链一直往回看得到的结果可能是你到达了一个被称作“coinbase”的交易。除了Genesis block之外,每个block里都开始于一个特殊的coinbase交易。这个交易是用来奖赏验证这个block里交易的挖矿者的。它用了和上述类似的数据形式,具体也不细讲了,对coinbase交易感兴趣的话可以看这里

上面的描述不是很清楚的是,在11行里面被数字签名的东西到底是什么。最显然的是办法是让支付者把整个交易进行数字签名。现在来说它不是这样做的,一些交易被忽略了。这使得交易的一部有了可塑性,也就是说,它们可以在以后进行修改。然而,这个可塑的内容里并不包括交易的数量,付款人和收款人。可塑性的问题在比特币社区内有很多讨论,有人希望去取消它,这里不细谈。

有多个输入和输出的交易

上一段里面我们讲了一个只有单个输入和单个输出的交易数据。实际上,大多比特币交易都是有多个输入或者多个输出的。我们先看看这个交易的原始数据

1. {"hash":"993830...",
2. "ver":1,
3. "vin_sz":3,
4.  "vout_sz":2,
5.  "lock_time":0,
6.  "size":552,
7.  "in":[
8.    {"prev_out":{
9.      "hash":"3beabc...",
10.        "n":0},
11.     "scriptSig":"304402... 04c7d2..."},
12.    {"prev_out":{
13.        "hash":"fdae9b...",
14.        "n":0},
15.      "scriptSig":"304502... 026e15..."},
16.    {"prev_out":{
17.        "hash":"20c86b...",
18.        "n":1},
19.      "scriptSig":"304402... 038a52..."}],
20.  "out":[
21.    {"value":"0.01068000",
22.      "scriptPubKey":"OP_DUP OP_HASH160 e8c306... OP_EQUALVERIFY OP_CHECKSIG"},
23.    {"value":"4.00000000",
24.      "scriptPubKey":"OP_DUP OP_HASH160 d644e3... OP_EQUALVERIFY OP_CHECKSIG"}]}

像之前一样,我们一行行解释,大部分和刚才的是一样的。

第1行,交易的hash值,用来作为这个交易的唯一标记。

第2行,比特币协议的版本,第一版。

第3、4行,是说这个交易里有3个输入,2个输出。

第5行,锁定时间(和之前的一样)。

第6行,交易的字节大小。

第7到19行,定义了所有的输入,每一个都对应这前一个交易的输出。第一个输入是8到11行。其内容形式和之前的一样。 第二个输入是12到15行,第三个是16到19行。

第20到24行,定义了所有的输出,第一个输出是21和22行,和之前一样,21行说的是里面有0.01068个比特币。22行是一段比特币的脚本语言。字符串e8c30622…是收款人的地址。 第二个输出是23和24行,格式同上。

看起来有些奇怪的是,虽然每个输出都有记录着比特币的数量,但是输入却没有。当然每个输入有多少比特币可以从它的上一个交易中得到。在一个普通的比特币交易中,所有的输入价值之和要大于多有的输出(除了刚才说的Genesis block和coinbase交易之外),如果输入之和大于输出,那么多余的比特币就会作为交易费提供给这个交易所在的block的挖矿者。

多个输入和输出的作用是找零。假设我想要给你0.15个比特币。我可以花掉我之前收到的0.2个比特币。当然,我不想给你全部0.2个,所以解决办法就是,我给你发0.15个比特币,然后再给我自己的另外一个比特币地址发0.05个比特币。这样,那0.05就是给我的找零。这个概念和你在现实商店里的找零不太一样,这个更像是你给你自己付钱。但是大致意思是一样的。

结语

比特币背后的基本概念就算是描述完了。当然,我也忽略了许多细节——这毕竟不是一个正式的说明书。但是我想描述的是通常使用的比特币背后的概念。

虽然比特币后面的规则是简单和容易理解的,这并不意味着这些规则将产生的所有可能结果也容易理解。对于比特币可以说的还有很多,我会在以后的文章中阐述一些。但是现在,我姑且做一些零碎的总结。

比特币有多么匿名?许多人说比特币可以匿名使用。这个说法形成于类似Silk Road之类的黑市。然而这个说法是虚构的。Blockchain是公开的,也就意味着任何人都可以看所有的比特币交易。虽然比特币地址并没有直接和真实世界里人物的身份相对应,但计算机科学家们已经做了很多工作去解密“匿名”的社交网络。Blockchain是他们一个极好的目标。在不远的将来,如果大多数比特币用户身份还都不能相对有信心的识别出来,那我感到会非常惊奇。这个识别不一定会完全确认,但是足够提供有着很大可能性的目标。此外,身份将会是可追溯的,这意味着那些2011年在Silk Road上卖毒品的人,仍然可以在2020年在blockchain上找到。这些反匿名技术对计算机科学家来说是众所周知的,甚至可以说包括NSA(美国国家安全局)也知道。如果说NSA或者其他机构已经反匿名了很多用户的话,我并不会觉得奇怪。比特币被吹捧成匿名的这个说法是有点滑稽的。它不是匿名的,相反,比特币可能是迄今为止世界上最为公开和透明的金融工具。

你能通过比特币发财吗?也许吧,Tim O’Reilly 曾经说过 “钱就像是汽车里面的油——你需要注意,否则就会困在路边上——但是生活不是围绕着加油站转圈!” 大多数对比特币的兴趣似乎来自于那些人生目标仅仅是找到一个大的加油站的人。我必须承认,这个让人困惑。我相信更有趣的、更享受的是把比特币或者其他数码货币看做一个塑造新的人类合作行为的工具。那是理性上的迷人,提供了巨大的创新的可能,它是有社会价值的,同样也可能会赚到一些钱。但是如果赚钱是你的主要目的,那我相信有其他更容易成功的办法。

我所忽略的细节:虽然这篇文章描述了比特币背后的主要概念,但有很多细节我并没有提到。其中之一是协议里面的很棒的节省空间的技巧,基于一个叫做Merkle tree的数据结构。这是细节,但它是一个极其精彩的细节,如果你喜欢数据结构的话,很值得去看看。你可以通过比特币白皮书了解大概情况。第二,我几乎没有提到比特币网络——其中一些问题比如,这个网络如何处理拒绝了的服务器攻击,节点是如何加入和离开网络的,等等。这是个很有意思的话题,但同时也是包含很多细节的话题,所以我在这里忽略了。你可以通过上面的一些链接来阅读更多与之相关的东西。

比特币脚本:在这篇文章里,我解释了比特币作为一个在线的电子货币。但是这只是更大更有趣的故事之中的一小部分。正如我们所见,每个比特币交易里都有一段比特币脚本语言。这个脚本在这篇文章里被简化成了类似于这样的话 “我Alice要给Bob 10个比特币”。 但是这个脚本语言可以同时被用来表述更复杂的交易。换句话说,比特币是一个可编程的货币。在以后的文章里,我会解释这个脚本系统和如何将比特币脚本作为一个平台来支持各种各样的令人惊叹的金融产品。

如果觉得有帮助,建议你Tip给这篇文章的原作者Michael Nielsen, 他的地址是17ukkKt1bNLAqdJ1QQv8v9Askr6vy3MzTZ , 你也可以follow他的Twitter 。 或者关注他的将要出版的关于neural networks and deep learning新书的第一章