关于区块链入门学习的一些思考

关于区块链入门的一些思考

这学期选修了区块链技术及其应用,了解了一些区块链的基础知识。现整理出一份技术总结。
关于区块链入门学习的一些思考_第1张图片

1、问题引入

在分布式系统通信安全性中有一个著名的“拜占庭将军问题”。该问题为:拜占庭的一些将军出发攻打敌军。他们每个人手握一支军队(方便起见设为数量相等),分布在不同的地方扎营,彼此地位平等(即不存在相互命令)。现在的战况为:只有进攻敌人的将军数达到一定数量,才能战胜敌军,不然会战败。但是,由于每个将军都分布在不同的地方,通信只能靠传令兵,极为不方便。于是,每一位将军很自然地都会想这样一个问题:我如何信任传令兵发来的消息?如果他所在将军是叛徒,告诉我明天上午九点会有五位将军发动进攻,加上我六位,打赢妥妥的。结果明天上午我发动进攻时,发现只有我一个,那不是凉凉了,军队打光了要变光杆司令了。如果无法达成共识,即让所有参与进攻的将军都相信明天上午九点会有足够战胜敌人的将军发起进攻,那进攻将难以组织。
此问题反应了分布式系统的核心问题在一个去中心化的分布式系统中,在没有大家都信任的一个中心的情况下,每个节点该如何信任其他节点发布的信息?信任(或者说共识)该如何达成?

2、加密算法

区块链依赖网络通信,网络通信需要考虑信息安全,即不能发送信息明文,不然被截获就暴露了,而应发送加密后的密文。
区块链中广泛使用的加密算法为非对称加密哈希加密
非对称加密的算法原理主要基于大质数分解极为困难,会生成一把可以发送出去的公钥(public key)和一把只能保存在自己手中的私钥(private key)。用公钥加密的消息只能用私钥解密,用私钥加密的消息只能用公钥解密,加密和解密不是一把密钥是此算法“非对称”的由来。
哈希加密的特点则在于无法倒推,用哈希加密的消息无法解密。当消息发生了一点点变化,哈希值就会发生巨大改变。常用的哈希加密算法为SHA-256

3、共识的达成

区块链的本质是一个去中心化,高安全性,有加密的去中心化分布式系统。
区块链的设计理念是任何国家的任何人都能参与到区块链之中。因此想让任何国家的任何人都达成共识,宗教信仰显然不行,道德约束更不可能。如果严格审查每个人的所谓诚信值,则该系统需要一个中心化的审查机构,该机构绝对可信,该机构审核通过的人也绝对可以相信。这就成了中心化系统,与传统方式(银行等)无疑。
因此,只有基于数学的共识才能跨国界地让所有人达成共识。
而共识,则包括非对称加密里涉及的数论和群论,哈希算法等。笔者数学知识有限,就不展开细说。

4、区块链的模式(以比特币为例)

每个区块由上一个区块的整体哈希值信息Nonce值组成。
信息:以比特币为例,信息可以为比特币交易、转账信息
Nonce值:一个整数,使得当前区块(上一个区块的哈希值+当前区块信息+该Nonce值)的哈希值满足Pow
Pow(Proof of Work):工作量证明,即哈希值满足某种达成很困难,验证很简单的特征。在比特币中,Pow为哈希值最前面为60个0。满足该条件的Nonce值想计算出一个需要海量的计算(下面会给出实例)。但是想验证是否满足Pow,写一个判断哈希值最前面是否有60个0的函数十分容易。

区块链为一个个区块组合成链。新区块包含上一个区块(链末端的区块)的哈希值和交易信息。接下来就是计算满足Pow的Nonce值。计算出来后,将上一个区块的哈希值,信息和该Nonce值作为新的区块发布,并链接到原有的区块末端。接下来,该新区块的哈希值会和接下来的交易信息一起构成下一个区块,然后计算新的Nonce值,再产生更新的区块。区块链就是像这样一个区块一个区块链接起来的。

大名鼎鼎的挖矿:在比特币中,计算出Nonce值是会有比特币奖励的。所谓的挖矿,就是不停地试一个整数,当加上上一个区块整体哈希值加上交易信息再加上该整数后的整体哈希值满足Pow(即哈希值最前面有60个0),就叫挖到矿了
所谓的矿就是合适的Nonce值
第一个计算出合适Nonce值会得到比特币奖励。然后生成新的区块,得重新计算新的Nonce

5、一个简单的用Java写的挖矿小程序

#随机梯度下降
#前面都与批处理一样
#y = o1x1+o2x2 定为y = 2*x1+3*x2
#input x1 : 1 2 3 4
#input x2 : 5 6 8 7
#output y : 17 22 30 29
import random
input_x = [[1,5],[2,6],[3,8],[4,7]]
output_y = [17,22,30,29]
theta = [0,0]#theta向量初值定为零向量
loss = 1#损失的初值
step_size = 0.01#步长
finish_loss = 0.01#算法收敛条件,损失小于这个值就结束
iter_count = 0#迭代次数
max_iters = 1000#最大迭代次数
#error_1 = [0,0,0,0]#求o1梯度的中间变量,四个输入损失函数求梯度后的第一维
#error_2 = [0,0,0,0]#求o2梯度的中间变量,四个输入损失函数求梯度后的第二维
while(iter_count finish_loss):
    loss = 0 
    error_axis0 = 0#第1维的损失之和
    error_axis1 = 0#第2维的损失之和
    i = random.randint(0,3)#在0,1,2,3间返回一个随机数
    print((iter_count+1),'current random i is:',i)
    pred_yi = theta[0]*input_x[i][0]+theta[1]*input_x[i][1]
    error_axis0 = (pred_yi-output_y[i])*input_x[i][0]
    error_axis1 = (pred_yi-output_y[i])*input_x[i][1]
    theta[0] -= step_size*error_axis0
    theta[1] -= step_size*error_axis1
    for j in range(0,4):
        pred_y = theta[0]*input_x[j][0]+theta[1]*input_x[j][1]
        error_i = (1/(2*4))*(pred_y-output_y[j])**2#第i个样本的损失
        loss += error_i#将各项样本的损失累加
    iter_count += 1
    print('current iter_count:',iter_count)
    print('current loss:',loss)
print('iter_count:',iter_count)
print('theta vector:',theta)
print('loss',loss)
if iter_count == max_iters:
    print('Reason of convergence is iter_count meets prevalue')
else :
    print('Reason of convergence is loss meets prevalue')
print('end')

当Pow设为3和7(即哈希值前有3个0,7个0的运行结果如下)
关于区块链入门学习的一些思考_第2张图片
关于区块链入门学习的一些思考_第3张图片
用python画了下柱状图,可以清晰看到指数爆炸的力量。当Pow为3时只有0.1秒,为7时已经暴涨到快一分半了。因此,计算一个Nonce,即挖矿是极为消耗算力的。
关于区块链入门学习的一些思考_第4张图片

6、区块链安全性的一些问题

1)交易篡改风险

区块链的Pow十分有效。只有计算出满足Pow的Nonce值才能完成新区块的制作并链接上主链。而想算出一个Nonce值需要花费大量的算力资源。设计者的思想为:用高昂到超过篡改交易收益的算力消耗来尽可能避免恶意篡改交易。当篡改交易带来的收益低于计算Nonce值的成本,这方面的恶意攻击确实减少很多。但是,这并不能根本上规避交易篡改风险
区块链中真正用来规避交易篡改风险的方法是最长链原则,即认为当前网络上最长的链(也叫主链,事实上区块链上除了最长的主链还有一些支链)是正确的。它的原理是:一个人几乎不可能每次都计算出Nonce值,即这个区块的Nonce是他计算出的,大概率下一个区块就是别人计算出的。一个人修改了区块的交易信息产生一个新区块并链接到区块链上之后,别人计算出的区块可能也包含这一交易信息,也产生一个不同的新区块并链接上主链。由于实际的交易信息是公开的,当别的矿工计算新节点的Nonce值时,采用的是公开的正确的未经篡改的交易信息。于是,篡改后的区块哈希值与别的正确信息区块哈希值不一样,正确的信息区块会被继续链接并被相信为正确的(事实上这并不是绝对安全的,下面会讨论)。于是正确的链越来越长,短链就成了无人问津的支链。因此,最长链原则在一般情况下可以规避交易篡改攻击。

2)51%攻击

这应该是区块链最有名的攻击。即如果一个人掌握了全球51%的算力,则很有可能接下来的区块的Nonce值全部都是他计算出来的。因此,交易信息他想怎么写就怎么写。这就是1)中提到的不是绝对安全的情况。当区块链中大多数(即大于50%)的成员选择恶意欺骗攻击时,最长链原则也无法保证区块的安全。所幸目前几个较大型的矿池还没达到这样的算力,因此暂时较为安全。

3) 双花攻击

所谓的”双花“,就是同一笔钱花了两次。这在中心化系统中可以有效规避(如支付宝想双花很难),但在分布式系统中,由于网络延迟以及Pow的关系,双花攻击风险较大。比如攻击者钱包里有1个比特币,他在A地花了1个比特币,A地验证他钱包里确实有1个比特币,于是交易成功被记入区块等待矿工挖矿并链上主链。但紧接着,攻击者在B地又花了1个比特币,此时B地网络还未接收到攻击者在A地花1个比特币的区块,验证他钱包有1个比特币,然后交易通过。也就是说,1个比特币花了两次。
这是当前区块链最严重最难以规避的问题。区块链账户设计时是匿名的,账户地址仅仅是一把私钥,就算查到账户也难以追查。(支付宝绑定银行卡手机号就不会有这个问题)。具体解决方法笔者刚刚接触区块链也不是很清楚。

7、个人对区块链技术的看法

在我看来,区块链是一个高安全性,无中心的自由的技术。去中心化理论上连中心发动攻击都规避了,绝对安全。并且由于分布式难以被攻击(攻击者可以炸毁支付宝总部但面对区块链无从下手)。
但是,除了发币之外,我觉得区块链技术似乎看不出什么太大的用处(可能是我才大二上水平太低。。)
我难以想象银行会攻击自己自我毁灭。规避中心发动攻击的功能有些鸡肋。
至于难以被攻击的特性,炸毁支付宝总部这种事同样不可能被发生。
而区块链大量算力资源的白白浪费的问题是很明显的。大量算力被浪费在反复进行SHA256哈希运算上,如果不是第一个算出Nonce值的,则这些算力就真的白白浪费了。我不觉得目前的算力可以这么挥霍,科学计算,人工智能,大数据,以及大量其他领域迫切需要算力资源。哪怕是浪费算力,可能也比浪费在不停进行SHA256哈希运算上强。
并且,大量算力的浪费是区块链不可避免的。现代信息理论中有这样的理论,要想在去中心化分布式系统中达成共识,必须释放大量能源来降低信息熵(大概就是想要达成共识大量浪费资源来做工作量证明是不可避免的)。因此,算力的大量问题似乎根本上就无法避免。
总而言之,对区块链技术,我持观望态度。

电子科技大学 机械与电气工程学院 智能电网信息工程本科大二 施展飞 2018.11.13

你可能感兴趣的:(关于区块链入门学习的一些思考)