比特币技术笔记(5)运行模式总览

1.   网络运行模式

综合前文的讨论,整个比特币网络的总体运行模式如下:

  • 新的交易向全网进行广播(使用类似BT下载的P2P通讯协议);
  • 每一个节点都将收到的交易信息纳入一个新区块中;
  • 每个节点都尝试在自己的新区块中找到一个满足规则的工作量证明;
  • 当任何一个节点找到了一个工作量证明,它就向全网进行广播新发现的区块;
  • 当且仅当包含在该区块中的所有交易都是有效的且之前未存在过的,其他节点才认同该区块的有效性;
  • 其他节点表示他们接受该区块,而表示接受的方法,则是在跟随该区块的末尾,制造新的区块以延长该链条,而将被接受区块的随机散列值视为先于新区快的随机散列值。

网络中的节点大致分为两类:存储节点和计算节点。存储节点主要功能是存储区块链网络中的数据;而计算节点主要功能是开展『工作量证明』计算,获取区块奖励,因此也称为矿工。

2.   矿池

事实上对于任一单独的『矿工』,成功找到一个『工作量证明』的概率是微乎其微的。因此以赚取比特币为目的运行计算节点往往得不偿失。

但是一旦成功找到一个『工作量证明』,带来的回报(区块激励)也是巨大的。为了平摊风险、共享收益,部分『矿工』会形成联盟,即『矿池』。『矿池』中的所有矿工共同寻找有效的『工作量证明』,同时也共同分摊区块激励。这样就有效的分摊了『挖矿』的风险。

比特币技术笔记(3)比特币

1.   比特币的定义

了解了数字签名后,我们终于可以开始介绍比特币的技术定义。

由于任何货币的价值都体现在连接付款方与收款方,即交易/转账(Transaction)。因此比特币被定义为包含了付款信息和收款信息的一条记录,即:

一枚电子货币(an electronic coin)是一串付款人的数字签名。

中本聪的比特币白皮书仅用这一句话就定义了比特币,可见这个的抽象定义非常简洁。接下来将具体解释其含义。举例来说,我们假设由B向A转账了0.5BTC,那么A所收到的比特币的定义为:

A的BitCoin = ( B的比特币,A的身份,金额)

为了避免第三方伪造交易,冒用B的身份转账,则需要使用上文提到的『数字签名』技术来 证明货币的确由付款者B发出。同时收款人A的身份则通过A的公钥来指定,则有:

A的BitCoin = B的私钥加密(B的BitCoin,A的公钥,金额0.5)

因此货币转移即为公开发布一个字符串,这个字符串按照以下规则生成:

收款人的BitCoin = 付款人的私钥加密(付款人的BitCoin,收款人的公钥,金额)

可以发现,比特币的定义是递归的。即一个有效的比特币,来自其付款人拥有的有效比特币。这就产生一个问题:那么第一个比特币如何定义?该问题会在后文的区块链中解释。

2.   交易验证:

收款人收到比特币之后,为验证其有效性,需要证明以下3个问题:

  • 该比特币的付款人真实
  • 该比特币的收款人是自己,且金额正确
  • 付款人的比特币是有效的

具体操作上,收款人使用付款人的公钥解密比特币,获取以下信息:

  • 付款人的比特币
  • 收款人的公钥
  • 金额

首先,成功通过付款人公钥解密该货币,即证明了付款人的真实性。其次核对收款人的公钥、金额,确认收款信息正确。最后,需要验证付款人的比特币是真是有效的。

而付款人的比特币的有效性,则通过前一付款人的公钥解密,递归验证。直到验证到有效的创始比特币。

3.   找零

实际的比特币支付中,可能出现这两种情况:

  1. A向B支付了10比特币,而B需要将收到的10比特币拆出5比特币支付给C。此即比特币的拆分问题,也称为『找零』。
  2. A和B均向C支付了5比特币,现在C需要向D支付10比特币。此即比特币的合并问题。

针对这些需求,比特币做出该规定:任何比特币交易可以包含无数个付款比特币,和最多两个收款地址

那么针对上文中的情况1,可以使用这样的支付方式:

C收到的比特币=(
付款人:B的10.0比特币,
收款人1:B,收款金额5.0,
收款人2:C,收款金额5.0

即在支付过程中,通过将自己设定为第二个收款人,即实现『找零』的功能。

对于上文中的情况1,可以使用这样的支付方式:

D收到的比特币=(
付款人1:C的5.0比特币(来自A),
付款人2:C的5.0比特币(来自B),
收款人1:D,收款金额10.0,

即在支付过程中,将零散的金额设为付款人,即可实现合并支付。不仅如此,合并支付与找零可以同时使用,实现比特币的灵活流通。

4.   手续费

理论上,一个比特币交易中的付款与收款总金额应当是相等的。但实际上,收款金额往往比总付款金额要少。其中的差额被称为比特币交易的『手续费』。

例如:A向B转账1.0比特币的交易信息可能为

B收到的比特币=(
付款人:A的1.0比特币,
收款人:B收款金额0.99,

那么这笔交易的手续费则为0.01。

所有交易的手续费都将被比特币网络的维护者(即计算节点)收取,具体将在接下来的文章中介绍。

比特币技术笔记(2)密码学基础:非对称加密与哈希函数

本篇将重点介绍比特币的密码学基础:非对称加密、数字签名与哈希函数。

1.   非对称加密

信息加密的过程相信大多数人都理解:即信息发送者使用某个密码或者秘密的规则,将信息转化为第三方难以解读的乱码,即『密文』。然后将『密文』发送给接收者;接收者再通过对应的规则进行解密,得到信息原文。

最初的加密方法都是对称的:加密与解密都是用相同的密码(也称为『密钥』)。这就意味着当需要进行加密通讯时,通讯双方需要使用一个更加安全的方式来传递这个共用的『密钥』,而且双方需要互相信任对方不会将『密钥』泄露给第三方。事实上这给加密通讯带来了很大的风险,因为『密钥』很可能被有意或无意地披露给第三方,或被第三方暴力破解。

为了解决这个问题,『非对称加密算法被提出。它使用两套密码来处理加密通讯,这两套密码分别称为『私钥』和『公钥』,可以分别用于加密和解密信息:如果一个信息用『私钥』加密,那么这个信息仅能被『公钥』解密;反之如果一条信息被『公钥』加密,那么该信息只能被『私钥』解密。

在实际应用中『私钥』和『公钥』通过程序配对生成。『私钥』掌握在个人手中,『公钥』则公开发布给所有人。当其他人需要给此人发送加密信息时,只需要获取其『公钥』并利用它加密该信息即可。除了信息接收者外任何人都无法解密『公钥』加密后的信息。这便安全地实现了加密通讯

具体的加密过程可以通过以下过程描述:

A端(发送端):加密信息 <- B公钥(信息) B端(接收端):信息原文 <- B私钥(加密信息)

任何人可以公开自己的公钥,并将私钥安全保管,即可实现更加安全的『非对称加密』。

2.   数字签名[1]

此外,非对称加密的公私钥也可反过来使用,即:信息发送者使用自己的『私钥』将信息加密,并发送给其他人。任何人都可以使用其『公钥』解密该信息并查看其内容。

需要注意的是,只有信息发送者持有其『私钥』。如果该信息能够被其『公钥』解密,则证明了该信息是由其对应的『私钥』所加密。换言之,证明了该信息来自于『公钥』对应的持有者本人。

这实现了一个新的功能:数字签名。即信息发送者通过『私钥』加密信息,来担保该信息的确来自于发送者自己。任何人收到有数字签名的信息,都可以通过信息发布者的『公钥』解密,来验证信息发送者的真实身份。

具体的签名过程可以通过以下过程描述:

A端(发送端):
数字签名 = A加密私钥(信息 )

B端(接收端):
信息,数字签名 = B解密私钥(加密信息)=B 解密私钥(B加密公钥(信息,数字签名))

『数字签名』是比特币的重要密码学基础之一。

3.   哈希函数

此外,比特币网络中面临着大量的信息验证的工作。最直观的信息验证方案就是:逐字对比。

但这存在一个问题,我们需要存储标准信息用于验证。而对于有数亿条交易记录的比特币网络,存储全部的交易信息会带来很大的存储负担。

比特币网络中使用哈希函数来简化验证信息的存储。

哈希(hash)函数也称为散列函数,它的功能是能够根据特殊的规则,将任意数据或信息转化为一个固定长度的字符串乱码。此外它能够保证,输入数据中任何微小的差异,都能导致输出字符串巨大的变化。以md5函数为例,计算‘hello world!’和‘hello world! ’两个字符串的哈希值:

可以发现,尽管多了一个空格字符,两个字符串的哈希值完全不一样。

因此,如果需要验证大量的数据(如交易记录),我们可以计算出这些数据的哈希值并存储下来(相比原始数据,哈希值的存储负担要小得多)。之后在需要验证这些数据时,只要比较这些数据计算出来的哈希值是否与已经存储下来的哈希值一致即可。由于任何微小的差异都会导致不同的哈希值,因此这是一个非常有效的验证方式。

[1] 《数字签名是什么?》 http://www.ruanyifeng.com/blog/2011/08/what_is_a_digital_signature.html

比特币技术笔记(1)简介

比特币及其所基于的区块链在诸多领域产生了较大的影响,其意义已经被很多文章所介绍。而比特币背后的技术原理则很少有中文文章提及。因此,本文将在技术细节方面介绍比特币 。

在开始前,需要见简单介绍一下比特币的基本信息。比特币被认为是由『中本聪』所发明,但其身份尚未可知。它是基于密码学原理,运行在P2P网络上的一种电子货币。其主要特点包括:匿名性、有限性、去中心化。

整个比特币网络共同约定了一套数学规则,以保证新产生的比特币将逐年递减,且比特币总量有限。而产生新比特币的过程则被称为『挖矿』。

比特币的去中心化保证了没有任何个人能够篡改比特币账簿中的信息。比特币网络中的交易记录储存于网络中的所有计算机上,只有被大多数节点所认可的交易,才被视作有效交易。这种模式比现有的银行更能够有效的杜绝欺诈行为。

此外,比特币的交易通过数字签名来进行,只需要使用交易双方的『公钥』、『私钥』即可完成交易,而将公私钥对应到具体的个人是极为困难的。这在一定程度上实现了交易的匿名性,使得比特币有如同现金一样的特性。

克里金(Kriging)插值的原理与公式推导

学过空间插值的人都知道克里金插值,但是它的变种繁多、公式复杂,还有个半方差函数让人不知所云

本文讲简单介绍基本克里金插值的原理,及其推理过程,全文分为九个部分:

0.引言-从反距离插值说起
1.克里金插值的定义
2.假设条件
3.无偏约束条件
4.优化目标/代价函数
5.代价函数的最优解
6.半方差函数
7.普通克里金与简单克里金
8.小结

继续阅读克里金(Kriging)插值的原理与公式推导

用WRF模型进行气象模拟入门(2)——WPS的配置与使用

安装好WRF之后,还不能直接使用。需要先使用WPS进行数据预处理,准备好必须的输入数据与模拟参数,才能顺利运行模拟程序。

WRF提供了多种气象模拟模式,本文只介绍进行真实模拟(real)所必须的相关操作。

继续阅读用WRF模型进行气象模拟入门(2)——WPS的配置与使用

用WRF模型进行气象模拟入门(1)——简介以及代码编译

WRF全称Weather Research and Forecasting Model, 是一个天气研究与预报模型.可以用来进行精细尺度的天气模拟与预报。本文将从一个初学者的角度从零开始介绍WRF的使用方法。打算写一个系列,这篇先写WRF程序的编译安装。

注意:不同版本的WRF之间会有细微差异,本文使用的 WRF 版本是 3.6.1

继续阅读用WRF模型进行气象模拟入门(1)——简介以及代码编译

加权线性回归(Weighted Linear Regression)的公式及其推理

1.加权线性回归与普通线性回归

对于一组有N个观测的数据

$$(x_i,y_i), i = 1,2,3,4,…, N$$

可以使用一元线性回归模型

$$y = a x + b + \epsilon$$

来拟合 \(x\) 与 \(y\) 之间的关系。其中的参数 \(a,b\) 通常使用最小二乘拟合,即寻找使代价函数

$$J(a,b) = \frac{1}{N}\sum^{N}_{i=1}{(y_i-ax_i-b)^2}$$

最小的\(a,b\),使得拟合曲线尽可能地接近所有的观测点。

但在实际应用中,观测点之间可能是有差异的。比如,有的观测点误差大,有的观测点误差小,这就需要让我们的拟合直线\(y=ax+b\),不必考虑误差大的观测点,而要尽可能逼近误差小的观测点。这时就可以使用一个权重系数\(w_i\)来表示第\(i\)个观测点的权重(例如,对于误差小的观测点,\(w_i\)的值更大) 而考虑了这个权重系数\(w_i\)的线性回归,就是加权线性回归。

继续阅读加权线性回归(Weighted Linear Regression)的公式及其推理

解决WIN7下Sublime运行python代码出现的UnicodeEncodeError错误

在win7下安装sublime后,编写python脚本并执行,没有任何反应,ctrl+`打开控制台之后才发现执行程序时出现了错误:

继续阅读解决WIN7下Sublime运行python代码出现的UnicodeEncodeError错误

解决OpenWRT下python出现的‘md_rand.c: 322: ssleay_rand_add: Assertion `md_c[1] == md_count[1]’ failed’ 错误

在路由器刷了 OpenWRT系统后,可以运行某python应用,但经常会出现错误提示

继续阅读解决OpenWRT下python出现的‘md_rand.c: 322: ssleay_rand_add: Assertion `md_c[1] == md_count[1]’ failed’ 错误