区块链入门漫谈

阅读量    40227 | 评论 3   稿费 300

分享到: QQ空间 新浪微博 微信 QQ facebook twitter

摘要

随着人民生活水平的提高,越来越多的人开始关注并涉足虚拟货币,区块链概念就是在这样的环境下走进了无数人的视野,带动了区块链技术的发展,成了当下最火最前沿的技术之一。本文简单述说区块链相关概念和区块链安全,希望能够让还不是很明白区块链的人更容易地去了解这个神秘的领域。笔者水平有限,文章如有错误之处,还请指正。

 

一、区块链简介

1·1 区块链起源

谈到区块链,我们不得不提到一个超级人物,中本聪(Satoshi Nakamoto)。2008年,他发了一篇题为《Bitcoin: A Peer-to-Peer Electronic Cash System》的论文,在论文中提出了他对电子货币的新设想。2009年,运行在区块链系统上的比特币正式面世,从此区块链进入了公众的视野。

1·2 什么是比特币?

比特币(Bitcoin,缩写BTC),是一种P2P形式的数字加密货币,不依靠特定货币机构发行。

最小单位是聪(satoshis),1BTC=10^8 satoshis。比特币总量约为2100万,按照理论,大约在2140年,将不会再产生新的比特币。

这里的约2100万是这么来的,请先看一张图:

从图可以很清晰的知道,每产生210000个区块,则每一个区块产生的比特币将会减半,这个过程大概是四年时间。

简单代码实现比特币总数计算:

#!usr/bin/python
# -*- coding:utf-8 -*-

startbtc=50        #初始一个区块产生的比特币
block=210000    #每210000个区块产生后,比特币减半

btc=startbtc* 10**8    #最初一个区块产生的50个比特币,单位satoshis
total=0            #最终总的btc
while btc>0:
    total=total+block*btc
    btc=btc/2
total=total/(10**8)
print u"Total BTC: %d 个"%total

运行结果
Total BTC: 20999999 个

1·3 区块链概念

我们先看个通俗易懂的例子:

一个小区的居民每年会交各种各样的费用到物业,由物业统一管理记账,记录收支情况,如下:

可是某一天,大家发现,钱对不上,怀疑物业私吞了钱,于是商量,组建一个小团体,大家轮流来记账,如下:

原本大家以为建个小团体轮流记账这样就天下太平了
可是总有人受不住金钱的诱惑,被金钱蒙蔽了双眼,他偷偷的改掉了账本。
一段时间过后,大家还是发现了端倪,揪出了偷偷改账本的人。


可是还得有人来记账啊,于是大家讨论出了如下的方案:

通过摇骰子,谁摇出的点数最大,就由谁来记账,然后大家核对无误后会同步到自己的账本,保证每个人的账本都是一样的。由于记账要付出时间和精力,因此会给记账的人一些奖励。

区块链在本质上其实就是一种记账,不过不是通过人来记,而是通过区块链客户端来进行记账。


以上的记账模式

  • 每一个居民,就好像是一个区块链客户端,我们可以称为节点。
  • 居民之间的信息互通,账本同步,我们称为 网络互通。
  • 而摇骰子就是一种规则,我们可以称为共识机制。
  • 一旦谁获得记账权,他就能获得奖励,这个过程我们可以形象的称为“挖矿”。
  • 如果两个节点间传递某些数据,需要对数据利用公私钥算法进行加密,这个过程可以称为加密系统。

简单来说,区块链就是一个去中心化的分布式存储账本。2016年工信部区块链产业白皮书提到,区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。

1·4 区块链的特点

  • 去中心化: 无需第三方机构介入,所有交易在节点间完成
  • 公开透明性:任何节点均可查看核实所有的交易数据
  • 不可篡改性:数据一旦写入区块被确认,则无法篡改
  • 匿名性:以共识机制来完成所有的交易

1·5 区块链的分类

按照网络分类,一般分为

  • 公有链:任何人均可使用,没有任何的限制,比如比特币就是一个公有链系统。
  • 私有链:不对外,仅在内部使用,一般情况下节点数量可控。
  • 联盟链:介于以上两者之间,部分信息可对外,节点数量也可控。

二、区块链原理

首先,看一张图

区块由区块头和区块体组成,前一个区块的hash是下一个区块的previous hash。
最终形成了一条链。


前面说到,区块链本质是记账,但是由谁来记账呢?

记账权,由工作量证明(Proof Of Work,简称POW)来决定
简单理解,它是一份证明,来证明你确实做过一定量的工作,这样是不是不太好理解?

我们可以做一道计算题来模拟,给定一个n(n为计算难度),然后去计算一个随机数nonce,对我们的区块中的数据进行sha256计算hash,这个hash值需要满足的条件是hash值的前n位为0,算出满足条件的hash所需要的时间。

简单代码实现

#!usr/bin/python
# -*- coding:utf-8 -*-

import hashlib
import time
import sys 

'''
#BTC包含的数据
index
previous_hash 
timestamp
hash
transaction 
nonce

data=index+previous_hash+timestamp+transaction+nonce  #对该数据进行sha256加密

'''

def get_hash(data):        #对data加密
    result=hashlib.sha256()
    result.update(data)
    return result.hexdigest()    #返回加密串

def get_nonce(hash,n):        #n表示计算难度,这里判断hash前n位是否为0
    for i in range(0,n):
        if hash[i]!='0':    #hash值从0到n,如果有不为0的则返回False
            return False
    return True

def hash_calculate(index,previous_hash,timestamp,transaction,n):#n表示计算难度
    hash=""        #初始化
    nonce=0        #初始随机数
    while True:
        data=str(index)+previous_hash+timestamp+transaction+str(nonce)
        hash=get_hash(data)        #计算hash
        if get_nonce(hash,n):    #获取hash值前n位为0
            return hash,nonce    #计算成功返回hash值和随机数nonce 
        nonce=nonce+1        

def blockchain(index,previous_hash,timestamp,transaction,hash,nonce):
    print "-----------------------------------------------------"
    print u"第%s个区块信息:" % str(index)
    print u"区块index: %s" % str(index)
    print u"区块previous_hash: %s" % previous_hash
    print u"区块timestamp: %s" % timestamp
    print u"区块transaction: %s " % transaction
    print u"区块hash: %s" % hash
    print u"区块nonce: %d" % nonce

if __name__=="__main__":
    n=int(sys.argv[1])        #传入计算难度
    #print n
    #data="admin"
    #print get_hash(data)
    #print get_nonce(get_hash(data),n)
    block_transaction=["test1","test2","test3","test4"]        #区块交易数据(transaction)
    #index=0
    previous_hash=""    #创世块,previous_hash为空
    nowtime=time.time()    #获取当前时间戳
    for i in range(0,len(block_transaction)):
        #获取指定格式的时间
        timenow=time.localtime(nowtime)    #获取当前时间,年月日时分秒格式
        thetime=time.strftime("%Y-%m-%d %H:%M:%S",timenow) #指定时间格式
        #print thetime
        hash,nonce=hash_calculate(i,previous_hash,thetime,block_transaction[i],n+i)#后面每个区块难度加1
        #print hash
        #print nonce
        blockchain(i,previous_hash,thetime,block_transaction[i],hash,nonce)
        print u"计算nonce耗时:%d 毫秒"% ((time.time()-nowtime)*1000)    #获取计算时间
        print "-----------------------------------------------------"
        previous_hash=hash
        nonce=0

以下是运行结果

从结果我们可以看到,随着计算难度的增加,计算满足条件的hash所耗的时间会越来越长。

当计算难度n很大的时候,计算hash所需的时间不可想象。这个过程其实就是一个很形象的“挖矿”。

在千千万万个节点中,谁先计算出这个满足条件的hash值,谁就获得了记账权,通过把数据打包到区块获得一定的奖励。

在实际的区块链系统中,也是通过去计算某个满足条件的数据来争夺记账权。

 

三、区块链应用

区块链目前被应用在公证类、证券市场、游戏、支付系统、数字加密货币等各大领域。

区块链最典型的应用就是比特币!

 

四、区块链生态安全

不管任何东西,没有绝对的安全,区块链也不例外。

用户的每一笔交易、用户的资产、交易平台的资金,矿池的安全等等,近些年来受到了黑客的无数次攻击,每一次损失的金额都不小。黑客可以攻破整个网络、篡改用户数据、盗取用户身份信息…..

区块链由于本身的特性,它能保证数据的完整性,能够保证数据不被篡改,但并不能完全挡住黑客的攻击。

谈及区块链安全,不应该仅局限于关注区块链本身,它的使用者及它衍生出的东西,我们都需要重点去关注。


以数字加密货币为例,我们比较关心和重视的问题:

  • 个人安全:用户冷热钱包的保存,私钥的保存,用户自身的安全意识,用户的习惯
  • 交易平台安全:平台系统存在的安全风险,系统稳定性,系统可用性等
  • 矿池安全:云矿池系统存在的安全威胁,外界的安全防护
  • 矿机安全:矿机本身硬件及软件的安全性
  • 区块链底层代码安全:代码可能存在的漏洞风险,以及用户的危险输入等
  • 智能合约安全:智能合约逻辑的正确性,可用性
  • 物理安全:硬件钱包本身的安全
  • 社会工程学:用户、交易平台管理人员、矿池管理人员存在被钓鱼,被社会工程学攻击的风险
  • 权限安全:权限校验,身份验证可能存在的绕过风险
  • ……

关于智能合约安全,分布式应用安全项目(DASP)公布了一份安全社区内智能合约 Top10漏洞。

1.重入漏洞
2.访问控制
3.算术问题
4.未检查返回值的低级别调用
5.拒绝服务
6.错误随机性
7.前台运行
8.时间篡改
9.短地址攻击
10.未知的未知物

了解详细漏洞信息请访问官网。

 

五、区块链安全解决方案

以数字加密货币为例,针对可能存在的安全风险,我们可以采用以下的方案:

  • 基础安全建设,提升整体架构的安全性
  • 对交易平台,矿池系统等进行安全评估测试
  • 对数字货币系统进行代码审计
  • 对智能合约实现代码进行安全审计,及时发现存在的风险点
  • 建立安全应急响应中心,及时响应并修复漏洞
    – 建立完善的安全标准和规范
  • 提高用户、从业人员、管理员等的安全意识
  • 定期针对开发人员做安全培训
  • 建立安全监测中心,及时发现问题所在
  • ……

参考资料

https://www.ccn.com/indian-startup-develops-next-gen-cybersecurity-solution-blockchain/
https://venturebeat.com/2017/01/22/blockchains-brilliant-approach-to-cybersecurity/
https://www.ibm.com/blogs/blockchain/2018/01/blockchain-as-a-cross-domain-security-solution/
http://www.8btc.com/wiki/bitcoin-a-peer-to-peer-electronic-cash-system
https://nakamotoinstitute.org/bitcoin/
https://www.dasp.co/

分享到: QQ空间 新浪微博 微信 QQ facebook twitter
|推荐阅读
|发表评论
|评论列表
加载更多