1、什么是区块链

a.定义:

从本质上来说区块链就是一种通过将用户的某种特定信息(比如交易信息),通过很多台计算机记录保存并同步的过程,每个区块都记录了对应的交易信息,将这些交易信息串联起来就形成了所谓的区块链,区块链也就是存储在很多计算机节点中的数据库一样的文件db。

从技术上来说,区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式,区块链技术设计了当今世界上基本所有的计算机相关问题。区块链技术推动着计算机计算速度的发展,不断更新迭代优化计算机的软硬件性能。

从用途上来说,区块链是一套以几乎无法伪造或篡改的方式构建而成的数据存储数学架构,可用于存储各类有价值数据。

b.特点:

  • 去中心化:由于使用分布式核算和存储,不存在中心化的硬件或管理机构,任意节点的权利和义务都是均等。
  • 去信任:系统中所有节点之间无需信任也可以进行交易,因为数据库和整个系统的运作是公开透明的,在系统的规则和时间范围内,节点之间无法欺骗彼此。
  • 开放性:系统是开放的,除了交易各方私有信息被加密外,区块链的数据对所有人公开,任何人都可以通过公开的接口查询区块链数据。
  • 自治性:区块链采用基于协商一致的规范和协议,使得整个系统中的所有节点能够在去信任的环境自由安全的交换数据。
  • 信息不可篡改:一旦信息经过验证并添加至区块链,就会永久存储,除非能够同时控制住系统中超过51%的节点,否则单个节点上对数据库的修改是无效。
  • 匿名性:由于节点之间的交换遵循固定的算法,其数据交互是无需信任的。

c.区块链图示:

2、区块链中BTC的基本组成部分

如下图所示,这是BTC的四大基本组成模块

a.BTC区块链Block Chain:

区块链用来将生成的所有的区块串联起来,区块链的高度表示了当前总共拥有的区块数量,区块链每间隔十分钟就会广播一次,将完成的区块交易信息内容添加到区块链当中,同时给完成区块ID寻找的矿机进行奖励,每格四年,产生区块的矿机奖励的BTC就会减半,因此比特币是收敛币种,不存在通货膨胀的情况(BTC产生情况看下图),比特币能够维持到2140年的原因是由于比特币系统会根据计算机的算力变化调整挖矿的难度,从而控制了BTC的发行速度!

代码如下:

 import matplotlib.pyplot as plt
from PIL import Image
import time
import sys
import os # 初始奖励50BTC
start_block_reward = 50
# 以10分钟为一个区块间隔,210000块=4Year*365Day*24Hour*6,需要4年
reward_interval = 210000 Year = []
Satoshis = [] def max_money():
# 50 BTC = 50 0000 0000 Satoshis
current_reward = 50 * 10**8
total = 0
year = 2008
while current_reward > 0:
total += reward_interval * current_reward
Satoshis.append(total)
current_reward /= 2
Year.append(year)
year += 4
return total
print("Total BTC to ever be created:", max_money(), "Satoshis")
print("1 BTC = 100000000 Satoshis!") plt.xlim((2008,2140))
plt.plot(Year,Satoshis)
plt.show()

代码运行结果:

总共2100万个BTC截至2140年

notice:区块链分叉是由于世界范围内的网络状况不同,可能同时有两个区块同时产生了,一个在欧洲A,一个在南美洲B,那么距离节点nodeA近的先收到了A的广播,同样的距离nodeB近的节点先收到了B的广播,因此在两部分结点确认数增多之后,就会发生区块链的分叉,分叉的情况会暂时保存下来,等到下一个区块的出来,甚至下下一个区块的出现,最终区块链长的那一边作为最终的区块链,这样区块链又会收敛到同一个区块链之上,保证了区块链的唯一性。

b.BTC区块Block:

区块Block中存储了当前大部分的交易的内容,那么区块由谁来产生呢,那就是矿工miners(矿机),矿机通过收集网络节点上的所有的交易信息,根据每一笔交易提供的交易费用来完成优先级排序,交易费越高越容易被快速处理,在确认这些高优先级的交易信息之后,miners将会将这些交易信息进行打包,将打包好的数据存放起来,开始生成区块对应的区块ID(一个很难计算的HASH值),如若某个miners优先找到了满足要求的HASH-Value,那么它将得到这次的比特币奖励,以及交易收取的手续费。下面简单的看一下如何计算满足要求的HASH值:

代码如下:

 import numpy as np
# Hash哈希运算库-SHA128 SHA256 MD5
import hashlib
import time
import sys
import os
# 工作量证明算法
max_nonce = 2**32 # 4 billion def proof_of_work(header,difficulty_bits):
# calc the difficulty target
target = 2**(256-difficulty_bits)
for nonce in range(max_nonce):
temp = str(header)+str(nonce)
hash_result = hashlib.sha256(temp.encode('utf-8')).hexdigest()
# check if this is a valid result,below the target
if int(hash_result,16) < target:
print("Success with nonce %d" % nonce)
print("Hash is %s" % hash_result)
return hash_result,nonce
print("Failed after %d (max_nonce) tries" % max_nonce) Start_time = time.time()
proof_of_work('Hash_val',22)
End_time = time.time()
print('The time cost:', End_time-Start_time, 's')

代码运行结果:

我们可以看到,当难度为22时,计算出一个满足要求的Hash值需要的时间约为6.7s,随着难度的增加,这个时间将会呈指数级增长!

c.BTC交易exchange:

在BTC交易的过程中,我们可以用比特币兑换我们想要的物品,也可以将比特币转移给别人,无论哪一种方式,都需要将指定的BTC输送到对应的钱包的地址上。

在BTC未交易的时候,BTC处于UTXO的状态,这种状态一直被阻塞,直到BTC的所属者通过他的私钥和数字签名释放BTC,完成转账的功能,BTC在完成转账之后可能还会存在找零,找零的BTC又会处于UTXO状态,而接收者的比特币地址,也就是钱包的地址处于的状态时URTX状态,等待对应的转账功能!

相关知识点:数字签名加密算法

d.BTC钱包Wallet:

BTC钱包主要涉及一下的三个部分:

1、私钥Private-Key:

定义:一个随机生成数,比特币地址中资金控制权都对应于私钥的所有权和控制权,私钥用于支付比特币所必须的签名以证明资金的所属权,私钥必须保持机密。

私钥创建:生成密钥的第一步,就是要找到足够安全的熵源,即随机性来源,我们可以使用python中的random函数生成我们的密钥,或者我们也可以使用椭圆曲线密码学中的ECC函数来生成我们的密钥。函数如下:

 numpy:key = np.random.random()
Key = EEC_Encrypte()

2、公钥Public-Key:

定义:通过椭圆曲线乘法来得到我们需要的公钥,这ge过程是不可逆转的,将私钥作为ECC函数的输入,从而得到公钥输出结果 。

椭圆曲线方程:

BTC采用的EEC方程为secp256k1标准所定义 的一条特殊的曲线以及一系列的数学常数,该 标准由NIST设立:

Function:y^2 mod p = (x^3+7) mod p
素数p:2^256-2^32-2^9-2^8-2^7-2^6-2^4-1
G点:
称为生成点的常数点
加法运算:P1+P2=P3(P3为曲线上P1和P2两点 连线与椭圆曲线的交点)
乘法运算:k*P=P+P+...+P(k个P相加)

椭圆曲线的离散图像的绘制:

 import matplotlib.pyplot as plt
from PIL import Image
import numpy as np
# Hash哈希运算库-SHA128 SHA256 MD5
import hashlib
# OepnSSL加密库-EEC椭圆曲线加密函数计算公钥
import OpenSSL
import random
import time
import sys
import os # 学习如何使用EEC椭圆曲线加密问题,ECC函数的实现方式等等
# The ecc function is: (x^3+7) mod P = y^2 mod P
P = 17
x= np.linspace(0,P,P,dtype='int')
y = list()
for i in x:
temp = (i**3 + 7) % P
append_flag = 0
for j in range(0,P):
if j**2 % P == temp:
y.append(j)
append_flag = 1
break
if append_flag == 0:
y.append(-1)
Y = np.array(y)
X = x
plt.xlim( (0, P) )
plt.ylim( (0, P) )
plt.scatter(X, Y)
# Y^2 mod P==0 ==> (Y-P)^2 mod P==0 ==> (Y^2-2*Y*P+P^2) mod P = Y^2 mod P
plt.scatter(X, P-Y)
plt.show() I = Image.open(os.path.join('.vscode\Bitmain_Miner_Ref\EEC_Vector_Graph.png'))
I.show() # -8除以3的余数:商-3余数1(余数是不能为负数的!)
print(-8 % 3) x = np.linspace(-0.7,5,1000)
y = np.sqrt(x**3+x+1) plt.xlim(-5,5)
plt.ylim(-6,6)
plt.plot(x,y)
plt.plot(x,-y)
plt.show() x = np.linspace(-1,5,1000)
y1 = np.sqrt(x**3-x)
plt.xlim(-5,5)
plt.ylim(-6,6)
plt.plot(x,y1)
plt.plot(x,-y1)
plt.show()

3、BTC-Address:

定义:比特币地址由数字和字母组成的字符串,由公钥生成的比特币地址以数字1开头 eg:1J7mdg5rbQyUHENYdx39WVWK7fsLpEoXZy

比特币地址可以由公钥通过单向哈希加密算法得到:

  1. SHA256()
  2. RIPEMD160()
  3. SHA160()  1和2合并在一起:SHA160(data) = RIPEDMD(SHA256(data))

BTC-Address生成流程图:

3、深入分析BTC中区块链技术 & 区块特性

我们主要分析区块链以及区块的相关内容:

4、使用python来实现上述相关API和数据结构:

 import numpy as np
# Hash哈希运算库-SHA128 SHA256 MD5
import hashlib
# OepnSSL加密库-EEC椭圆曲线加密函数计算公钥
import OpenSSL
import random
import json
import time
import sys
import os max_nonce = 2**32 # 4 billion
difficulty_bits = 12
target = 2**(256-difficulty_bits) class block:
def __init__(self):
self.data = {'Magicno':0xD9B4BEF9, 'Blocksize':0, \
'Blockheader':[0,0,0,0,0,0], 'Transition_counter':0, \
'transitions':[]}
self.edition = 1.0
self.time = 0.0
self.Hash = 0
self.PreHash = 0
self.Nonce = 0 def proof_of_work(header):
# calc the difficulty target
for nonce in range(max_nonce):
temp = header+str(nonce)
hash_result = hashlib.sha256(temp.encode('utf-8')).hexdigest()
print(str(hash_result), end='\r')
# check if this is a valid result,below the target
if int(hash_result,16) < target:
# print("Success with nonce %d" % nonce)
# print("Hash is %s" % hash_result)
return hash_result,nonce
print("Failed after %d (max_nonce) tries" % max_nonce) def Self_Hash_Get(PreHash, time, data):
header = str(PreHash) + str(time) + str(data)
hash_result,nonce = proof_of_work(header)
return hash_result,nonce def New_block(transitions, PreBlockHash, block):
block.data['Transition_counter'] = len(transitions)
block.data['transitions'] = transitions
block.data['Blocksize'] = sys.getsizeof(block.data)
block.time = time.time()
block.PreHash = PreBlockHash
hash_result, hash_nonce = Self_Hash_Get(block.PreHash, block.time, block.data)
block.Hash = hash_result
block.Nonce = hash_nonce def NewGenesisBlock(block):
New_block('NewGenesisBlock', b'', block) class block_chain:
def __init__(self):
self.block = [] chain = block_chain() def AddBlockChain(block,chain):
if int(block.Hash, 16) < target:
chain.block.append(block)
else:
print('Invalid block!') def CreateBlockChain(chain):
Block = block()
NewGenesisBlock(Block)
AddBlockChain(Block,chain) def GetLastBlockHash(chain):
return chain.block[len(chain.block)-1].Hash CreateBlockChain(chain)
for i in range(10):
transitions = ['Li Send 10BTC to You', 'Ni Get 2BTC from Dian']
PreBlockHash = GetLastBlockHash(chain)
Block = block()
print('Calculating Hash...')
New_block(transitions, PreBlockHash, Block)
AddBlockChain(Block,chain) for i in range(len(chain.block)):
print('Block%d\'HashVal=%s' %(i ,chain.block[i].Hash))

运行我们所得到的代码,结果如下:(取了5个Block)

Block的Hash值都满足要求,并成功加入了区块链中

5、参考文章

区块链通俗漫画介绍Reference001https://www.cnblogs.com/behindman/p/8873191.html

区块链Go语言实现Step-byStep-Reference002:https://liuchengxu.gitbook.io/blockchain/

加密算法Reference003:https://www.cnblogs.com/songwenlong/p/5944139.html#4160452

BTC Donation Thanks a lot!

3Jvg6ao53eCnj7EgapEa7arxsouLVxxQ4F 

区块链基础认识-BTC的更多相关文章

  1. 用Hyperledger Fabric(超级账本)来构建Java语言开发区块链的环境

    面向 Java 开发人员的链代码简介 您或许听说过区块链,但可能不确定它对 Java™ 开发人员有何用.本教程将帮助大家解惑.我将分步展示如何使用 Hyperledger Fabric v0.6 来构 ...

  2. todo:区块链????????

    2018年这个春节,人人都在讲btc.ico.区块链. 恶补了几天区块链的知识和文章,一总结就是:一头雾水,没有哪个vc.创业者.技术人员 讲明白区块链到底是什么,技术上如何实现,就是哪些研读过中本聪 ...

  3. 区块链,Ethereum-Wallet

    https://blockchain.info/charts/transactions-per-second https://slock.it/     https://en.wikipedia.or ...

  4. 《区块链100问》第78集:EOS是什么?

    EOS是一个区块链开发平台,具有可扩展性强.支持大规模商业应用等特点. 首先,EOS采取DPoS共识算法及其他技术手段预期实现每秒百万级别交易请求,将能够支持数千个商业级的DAPPs. 以太坊是一条公 ...

  5. IBM区块链总经理谈区块链

    IBM区块链总经理谈区块链:3.4年前IBM的区块链人员就达到了1500人  Captain Hiro 2018-03-20 16:22 发布在 区块链 3 18349 CCN的记者Eric Eiss ...

  6. 微软Coco Blockchain Framework:一键解决企业级区块链三大难题

    近年来,异军突起的“区块链”受到全行业的广泛关注,众多企业级用户在积极拥抱新技术的过程中却面临三大难题:性能.隐私和组织管理.如果不能很好地解决这些“顽固分子”,区块链技术就相对局限,很难发挥出应有的 ...

  7. 人人都懂区块链--pdf电子版学习资料下载

    人人都懂区块链 21天从区块链“小白”到资深玩家电子版pdf下载 链接:https://pan.baidu.com/s/1TWxYv4TLa2UtTgU-HqLECQ 提取码:6gy0 好的学习资料需 ...

  8. 001/Go语言构建区块链(mooc)

    1.区块链发展与现状 视频地址:https://www.imooc.com/video/17452 注意: 比特币与以太坊最大的区别在于: 以太坊引入了对图灵完美智能合约的支持,人们可以将任何业务逻辑 ...

  9. [易学易懂系列|rustlang语言|零基础|快速入门|(27)|实战4:从零实现BTC区块链]

    [易学易懂系列|rustlang语言|零基础|快速入门|(27)|实战4:从零实现BTC区块链] 项目实战 实战4:从零实现BTC区块链 我们今天来开发我们的BTC区块链系统. 简单来说,从数据结构的 ...

随机推荐

  1. Windows 10 x64 下编译 Hadoop 源码

    Windows 10 x64 下编译 Hadoop 源码 环境准备 Hadoop并没有提供官方的 Windows 10 下的安装包,所以需要自己手动来编译,官方文档中 BUILDING.txt 文件中 ...

  2. LeetCode-11. 盛最多水的容器

    给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) .在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0).找出其中的两条线, ...

  3. python之路(4)高阶函数和python内置函数

    前言 函数式编程不用变量保存状态,不改变变量 内置函数 高阶函数 把函数当作参数传给另一个对象 返回值中包含函数 使用的场景演示: num_test = [1,2,10,5,8,7] 客户说 :对上述 ...

  4. JQuery基本知识、选择器、事件、DOM操作、动画

  5. luogu P5305 [GXOI/GZOI2019]旧词

    传送门 先考虑\(k=1\),一个点的深度就是到根节点的路径上的点的个数,所以\(lca(x,y)\)的深度就是\(x\)和\(y\)到根路径的交集路径上的点的个数,那么对于一个询问,我们可以对每个点 ...

  6. 【vagrant】硬盘扩容

    如题,笔者之前一直在使用vagrant作为虚拟机使用. vagrant的好处自然不必说,只是有一天遇到了一个麻烦事--虚拟硬盘空间不!够!了! 笔者使用了df -h命令一看,结果发现,主硬盘(/dev ...

  7. spring.http.multipart.maxFileSize提示无效报错问题处理

    在SpringBoot项目中,配置spring.http.multipart.maxFileSize用于限定最大文件上传大小. 但是,SpringBoot版本不同,关于这一块的配置也不相同. 1.Sp ...

  8. EOCS框架概述和剖析

    什么是EOCS? EOCS(Enterprise Operation Cross System),是一个基于eosio底层框架实现的企业级跨链操作系统,旨在实现和EOS主链通信的并行链,是真正意义的跨 ...

  9. Beans 自动装配

    http://wiki.jikexueyuan.com/project/spring/beans-auto-wiring/spring-autowiring-byname.html

  10. 使用scrapy爬虫,爬取17k小说网的案例-方法一

    无意间看到17小说网里面有一些小说小故事,于是决定用爬虫爬取下来自己看着玩,下图这个页面就是要爬取的来源. a 这个页面一共有125个标题,每个标题里面对应一个内容,如下图所示 下面直接看最核心spi ...