用Python从零开始创建区块链

  • 时间:
  • 浏览:37
  • 来源:uu直播快3平台_UU快3直播官方

衡量算法复杂性度的法律办法是修改零开头的个数。使用二个 来用于演示,让他发现多二个 零后该 大大增加计算出结果所需的时间。

@app.route('/chain', methods=['GET'])

def full_chain():

node_identifier = str(uuid4()).replace('-', '')

}

到这里,区块链的概念就清楚了,每个新的区块都所含上二个 区块的Hash,这是关键的这人,它保障了区块链不可变性。机会攻击者破坏了前面的某个区块,没办法 后边所有区块的Hash后该 变得不正确。不理解句子,慢慢消化,可参考区块链记账原理

作者认为最快的学习区块链的法律办法是这人人创建二个 ,本文就跟随作者用Python来创建二个 区块链。

新的区块依赖工作量证明算法(PoW)来构造。PoW的目标是找出二个 符合特定条件的数字,这人数字太难计算出来,但容易验证。这很久我我工作量证明的核心思想。

环境准备

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

1000

31

32

33

34

35

36

37

38

{

"chain": [

挖矿正是神奇所在,它很简单,做了一下三件事:

在实现一致性算法之前 ,你们歌词 歌词 时要找到这人法律办法让二个 节点知道它相邻的节点。每个节点都时要保存一份所含网络中其它节点的记录。这人你会们歌词 歌词 新增哪几只接口:

Blockchain作为API接口

app = Flask(__name__)

你会们歌词 歌词 添加二个 路由,二个 用来注册节点,二个 用来处理冲突。

class Blockchain(object):

from flask import Flask

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

import hashlib

import json

from textwrap import dedent

from time import time

from uuid import uuid4

启动server:

加入交易

@app.route('/transactions/new', methods=['POST'])

def new_transaction():

每个区块所含属性:索引(index),Unix时间戳(timestamp),交易列表(transactions),工作量证明(稍后解释)以及前二个 区块的Hash值。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

1000

31

32

33

34

@app.route('/nodes/register', methods=['POST'])

def register_nodes():

你们歌词 歌词 知道区块链是由区块的记录构成的不可变、有序的链社会形态,记录还时很久我交易、文件或任何你你会的数据,重要的是它们是通过哈希值(hashes)链接起来的。

用Python实现如下:

Blockchain类用来管理链条,它能存储交易,加入新块等,下面你们歌词 歌词 来进一步完善哪哪几只法律办法。

实现工作量证明

以下是二个 区块的社会形态:

Blockchain类

1

2

3

4

5

6

from hashlib import sha256

x = 5

y = 0 # y未知

while sha256(f'{x*y}'.encode()).hexdigest()[-1] != "0":

通过post请求,添加二个 新交易

这人完全搞掂区块链不必易事,我喜欢在实践中学习,通过写代码来学习技术会掌握得更牢固。通过构建二个 区块链还时要加深对区块链的理解。

第二个 法律办法 valid_chain() 用来检查是不是效链,遍历每个块验证hash和proof.

你会们歌词 歌词 来实现二个 相似PoW算法,规则是:寻找二个 数 p,使得它与前二个 区块的 proof 拼接成的字符串的 Hash 值以 4 个零开头。

注意交易的接收者是你们歌词 歌词 这人人的服务器节点,你们歌词 歌词 做的大部分工作都很久我我围绕Blockchain类法律办法进行交互。到此,你们歌词 歌词 的区块链就算完成了,你们歌词 歌词 来实际运行下

],

"length": 3

}

一致性(共识)

通之前 边的代码和注释还时要对区块链有直观的了解,接下来你们歌词 歌词 看看区块是为甚在么在挖出的。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

...

from urllib.parse import urlparse

...

之前 刚开始创建Blockchain

...

实现共识算法

1

2

pipenv run python blockchain.py

pipenv run python blockchain.py -p 100001

注册新节点

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

1000

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

1000

51

52

53

54

55

56

57

58

59

1000

61

62

63

64

65

66

import hashlib

import json

from time import time

你们歌词 歌词 的“Flask服务器”将扮演区块链网络中的二个 节点。你们歌词 歌词 先添加这人框架代码:

创建新块

让他在不同的机器运行节点,或在一台机机开启不同的网络端口来模拟多节点的网络,这里在同一台机器开启不同的端口演示,在不同的终端运行一下命令,就启动了二个 节点:http://localhost:100000 和 http://localhost:100001

这人在节点2上挖二个 块,确保是更长的链,这人在节点1上访问接口/nodes/resolve ,这时段点1的链会通过共识算法被节点2的链取代。

前面提到,冲突是指不同的节点拥有不同的链,为了处理这人现象报告 ,规定最长的、有效的链才是最终的链,换句话说,网络所含效最长链才是实际的链。

发送交易

注册节点

用Postman请求挖矿

接下来你们歌词 歌词 时要添加二个 交易,来完善下new_transaction法律办法

class Blockchain(object):

对数字货币的崛起感到新奇的你们歌词 歌词 ,这人想知道其肩头的技术——区块链是怎么实现的。

用Postman请求挖矿

from time import time

from uuid import uuid4

新建二个 文件 blockchain.py,本文所有的代码都写在这二个 文件中,还时要随时参考源代码

运行区块链

第二个 法律办法 resolve_conflicts() 用来处理冲突,遍历所有的邻居节点,并用上二个 法律办法检查链的有效性, 机会发现有效更长链,就替换掉这人人的链

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

class Blockchain(object):

@app.route('/mine', methods=['GET'])

def mine():

当Blockchain实例化后,你们歌词 歌词 时要构造二个 创世块(没办法 前区块的第二个 区块),这人给它添加二个 工作量证明。

每个区块都时要经过工作量证明,俗称挖矿,稍后该 继续讲解。

class Blockchain(object):

让他使用cURL 或Postman 去和API进行交互

1

2

$ python blockchain.py

准备工作

共识算法处理冲突

挖矿

法律办法向列表中添加二个 交易记录,并返回该记录将被添加到的区块(下二个 待挖掘的区块)的索引,等下在用户提交交易后该 有用。

@app.route('/mine', methods=['GET'])

def mine():

1

2

3

4

5

6

7

8

9

10

11

12

13

block = {

简单的说明一下以上代码:

第15行: 创建二个 节点.

第18行: 为节点创建二个 随机的名字.

第21行: 实例Blockchain类.

第24–26行: 创建/mine GET接口。

第28–1000行: 创建/transactions/new POST接口,还时要给接口发送交易数据.

第32–38行: 创建 /chain 接口, 返回整个区块链。

第40–41行: 服务运行在端口100000上.

1

pip install Flask==0.12.2 requests==2.18.4

共同还时要二个 HTTP客户端,比如Postman,cURL或其它客户端。

from flask import Flask, jsonify, request

为了构造创世块,你们歌词 歌词 还时要完善new_block(), new_transaction() 和hash() 法律办法:

你们歌词 歌词 用 set 来储存节点,这是这人处理重复添加节点的简单法律办法。

计算工作量证明PoW

通过新增二个 交易授予矿工(这人人)二个 币

构造新区块并将其添加到链中

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

1000

31

32

33

34

35

36

import hashlib

import json

blockchain = Blockchain()

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

1000

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

1000

51

52

53

54

55

56

57

58

59

1000

61

62

63

64

65

66

67

...

import requests

假设二个 整数 x 乘以很久我我整数 y 的积的 Hash 值时要以 0 结尾,即 hash(x * y) = ac23dc…0。设变量 x = 5,求 y 的值?

为了方便理解,举个例子:

以下是Blockchain类的框架:

机会你还不是很了解哈希,还时要查看这篇文章

你们歌词 歌词 机会有了二个 基本的区块链还时要接受交易和挖矿。这人区块链系统应该是分布式的。既然是分布式的,没办法 你们歌词 歌词 究竟拿哪哪几只保证所有节点有同样的链呢?这很久我我一致性现象报告 ,你们歌词 歌词 要想在网络上有多个节点,就时要实现二个 一致性的算法。

发送到节点的交易数据社会形态如下:

参考源代码(原代码在我翻译的之前 ,无法运行,我fork了一份,修复了其中的错误,并添加了翻译,感谢star)

@app.route('/transactions/new', methods=['POST'])

def new_transaction():

from flask import Flask, jsonify, request

...

本文主要内容翻译自Learn Blockchains by Building One

本文转载:https://learnblockchain.cn/2017/10/27/build_blockchain_by_python/

块社会形态

好啦,让他邀请你们歌词 歌词 们共同来测试你的区块链

你们歌词 歌词 使用一下的算法,来达到网络中的共识

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

class Blockchain(object):

class Blockchain(object)

本文要求读者对Python有基本的理解,能读写基本的Python,这人时要对HTTP请求有基本的了解。

if name == '__main__':

首先创建二个 Blockchain类,在构造函数中创建了二个 列表,二个 用于储存区块链,二个 用于储存交易。

class Blockchain(object):

现在Blockchain类基本机会完成了,接下来使用HTTP requests来进行交互。

1

hash(5 * 21) = 1253e9373e...5e310000155e81000

在比特币中,使用称为Hashcash的工作量证明算法,它和后边的现象报告 很相似。矿工们为了争夺创建区块的权利而争相计算结果。通常,计算难度与目标字符串时要满足的特定字符的数量成正比,矿工算出结果后,会获得比特币奖励。

当然,在网络上非常容易验证这人结果。

你们歌词 歌词 将使用Python Flask框架,这是二个 轻量Web应用框架,它方便将网络请求映射到 Python函数,现在你们歌词 歌词 来让Blockchain运行在基于Flask web上。

/transactions/new 创建二个 交易并添加到区块

/mine 告诉服务器去挖掘新的区块

/chain 返回整个区块链

创建节点

print(f'The solution is y = {y}')

结果是y=21. 机会:

机会不是使用Postman,则用一下的cURL句子也是一样的:

1

2

3

4

5

{

"sender": "my address",

"recipient": "someone else's address",

"amount": 5

}

之前 机会有添加交易的法律办法,基于接口来添加交易就很简单了

环境准备,确保机会安装Python3.6+, pip , Flask, requests

安装法律办法:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

1000

31

32

33

34

35

36

37

38

39

40

41

import hashlib

import json

from textwrap import dedent

from time import time

from uuid import uuid4

理解工作量证明

你们歌词 歌词 将创建二个 接口:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

1000

31

32

33

34

35

36

37

import hashlib

import json

/nodes/register 接收URL形式的新节点列表

/nodes/resolve 执行一致性算法,处理任何冲突,确保节点拥有正确的链

你们歌词 歌词 修改下Blockchain的init函数并提供二个 注册节点法律办法:

from time import time

from uuid import uuid4

@app.route('/nodes/resolve', methods=['GET'])

def consensus():

1

2

3

4

5

$ curl -X POST -H "Content-Type: application/json" -d '{

"sender": "d4ee26eee15148ee92c6cd394edd974e",

"recipient": "someone-other-address",

"amount": 5

}' "http://localhost:100000/transactions/new"

在挖了两次矿之前 ,不是一个块了,通过请求 http://localhost:100000/chain 还时要得到所有的块信息。