用几个简单的Python代码解释区块链的原理。
编者按:比特币相信是未知的。区块链可能很多人都听说过,但是区块链这是怎么回事?它的工作机制是什么?为什么采矿比一些国家耗电多?Asthasr试图用一个简单的程序解释清楚。原文发表在他的个人博客上,标题是:区块链如何工作。
你可能已经知道区块链是什么了。毕竟,一枚比特币的价格曾一度超过4.7万美元。然而,这篇文章不是关于商业的,也不是关于比特币是否是投机泡沫的。我只想解释一下它的机理。基础:散列和分类帐
首先,哈希算法是一种将给定字符串转换为不可预测的固定长度字符串(抽象)的方法。
哈希算法将文本生成长度固定的摘要哈希算法从文本生成固定长度的摘要。
以下是演示哈希算法的简短Python程序:
#!/usr/bin/env python3
从argparse导入ArgumentParser
从hashlib导入md5
#为输入的字符串参数生成十六进制摘要。
def hash_string(字符串):
哈希= md5()
hash . update(string . encode(" utf-8 "))
返回hash.hexdigest()
if __name__ == "__main__ ":
parser = ArgumentParser()
parser.add_argument("STRING ",help= "要散列的字符串")
args = parser.parse_args()
print(hash_string(args。字符串))
用不同的字符串参数运行这个程序,得到参数的汇总(以下是“忍者”和“武士”的汇总):
$ ./哈希忍者
3899 dcbab 79 f 92 af 727 c 2190 bbd 8 ABC 5
$ ./哈希武士
99b 1983 cf 3 ee 09 BBA F6 f 43 AC 7 B4 c 8748
这种类型的哈希可以用来验证密码-您可以检查密码是否匹配,而无需保存密码本身。(注)
区块链是一个账簿:这个账簿会逐渐增加分录。hash的作用是保护添加到账簿中的消息的顺序和内容。
区块链捕捉之前的摘要以及当前的消息从而生成一个摘要的图解。区块链捕获以前的摘要和当前消息,以生成摘要的图表。
下面是一个简单的实现:
def hash_ledger_entry(字符串,previous _ digest =无):
" ""在分类帐(如果有)之前散列字符串和条目摘要" " "
hash = md5(string.encode("utf-8 "))
如果上一个_摘要:
hash . update(previous _ digest . encode(" utf-8 ")
return hash . hex digest()
def generate _ ledger(* string):
" ""生成包含一系列字符串的账簿记录" " "
摘要=无
对于字符串中的字符串:
digest = hash_ledger_entry(字符串,摘要)
产量摘要,字符串
if __name__ == "__main__ ":
parser = ArgumentParser()
parser.add_argument("STRINGS ",help = " ledger entries ",nargs="+")
args = parser.parse_args()
对于摘要,generate_ledger(*args。字符串):
print(f"{digest}\t{string} ")
为该脚本提供一组字符串将会生成一个唯一且有序的账簿:
$ ./哈希忍者武士
3899 dcbab 79 f 92 af 727 c 2190 bbd 8 ABC 5忍者
6 BF 8 D2 cadde 40 af 53d 7 f 0 fef 95d 4 EC 2c武士
这些散列书是防篡改的,因为后面条目的摘要依赖于前面的条目。修改或添加条目将改变后续条目的摘要。
$ ./哈希忍者海盗武士
3899 dcbab 79 f 92 af 727 c 2190 bbd 8 ABC 5忍者
7ec 21 DCF 528 e 12036 b 04774754 ECC 4 E0 pirate假设这里被黑了一条记录。636730d 86709d 03 fed 9 b 64 f 84 c 9 be 6 samurai可以注意到这篇文章的总结和上一篇不一样。
我们还可以在分类账中添加一条已知的结束记录,以防止最后一条记录被篡改:
$ ./哈希忍者海盗武士
3899 dcbab 79 f 92 af 727 c 2190 bbd 8 ABC 5忍者
7 EC 21 DCF 528 e 12036 b 04774754 ECC 4 e 0海盗
636730d 86709d 03 fed 9 ba 64 f 84 fc 9 be 6武士
b233d 566 Fe 677d 394 aafb 5 EAF 149 e 453结束
确认
要验证分类帐,您可以重放交易,并确保您可以在每个步骤中获得相同的哈希值:
our_digest =无
对于fileinput.input()中的行:
#分解摘要和文本
file_digest,word = line.strip()。拆分(" \t ")
#计算文本的摘要
our _ digest = hash _ ledger _ entry(word,我们的摘要)
#将计算结果与保存在账簿中的汇总进行比较。
如果我们的_文摘!=文件摘要:
sys . exit(f " { word }的摘要不匹配。)
print("所有条目都匹配。")
通过使用防篡改分类帐,由于每个条目都依赖于前一个条目,我们有效地实现了一个非常简单的区块链。但是,这和真实的区块链还是有区别的;为了实现true 区块链,我们需要...
未经授权的证明
比特币的新颖之处在于,它是一个没有所有者的分布式系统。这就是狂热分子声称区块链不需要信任的东西:很多“矿工”并不像银行那样是中央权威,他们会互相竞争,看谁能成功地给区块链写一条新消息。他们通过工作负载证明算法来做到这一点,我们在书中也可以做到。
#将以下行添加到您的导入中。
从机密导入令牌_字节
def hash _ ledger _ entry _ with _ salt(salt,string,previous_digest=None):
" " "散列分类帐(如果有)之前的条目的字符串和摘要。"""
hash = md5(string.encode("utf-8 "))
hash.update(salt)
如果上一个_摘要:
hash . update(previous _ digest . encode(" utf-8 "))
返回hash.hexdigest()
def generate_ledger(难度,*字符串):
#难度决定了我在总结前面需要多少个零。
prefix = "0" *难度
摘要=无
previous_digest =无
对于字符串中的字符串:
#添加随机盐并重复散列一个字符串,直到满足由前缀确定的零的数量。
while digest为None或not digest.startswith(前缀):
salt = token_bytes(16)
digest = hash _ ledger _ entry _ with _ salt(salt,string,previous_digest)
#和以前一样,您需要生成摘要和条目,但是您还需要salt。
#否则,没有办法重复这些记录并验证它们。
yield digest,salt.hex(),string
previous_digest =摘要
摘要=无
yield hash _ ledger _ entry _ with _ salt(salt," END ",previous_digest),salt," END "
if __name__ == "__main__ ":
parser = ArgumentParser()
parser.add_argument(
“难度”,help=“确认分类账分录的难度。”,type=int
)
parser.add_argument("STRINGS ",help = " ledger entries ",nargs="+")
args = parser.parse_args()
对于digest,salt,generate_ledger中的string(args。难度,*args。字符串):
print(f " { digest } \ t { salt } \ t { string } ")
这个新程序将接受一个额外的参数difference,并尝试生成一个salt值,而salt值又会生成一个与预期数量的零相匹配的hash值:
$ ./hash 5忍者海盗武士
00000 ad 72553509 e6c 197 e 45 ab 7 fa 436 af 0 DCE 7 AC 4c 87 C2 b 9d 9 eafb 6561 c 09 f 4忍者
000000 f 556426 CFA 894 ba 2 ce 57383 B1 d b 9d 51 e 0e 8 ea 977 ba 004 e 7c 30 be 757144海盗
000006373 B2 b 336 D6 DAC 403 a5 fa 90 a 73 DD 9 c 6 ad 89 f 5014 a 0901 BCB 142 e 04 e 28 b武士
fa 35 b5 a 39 BC 0318015620684d 60 a 27 f 0 DD 9 c 6 ad 89 f 5014 a 0901 BCB 142 e 04 e 28 b END
“挖掘”的过程可能需要大量的计算。这个例子平均需要大约250万次尝试。所以比特币挖矿比很多国家都要耗电:在“real”区块链上,矿工们要计算和重新计算每一个被挖矿的比特币的万亿哈希值。
注意:请注意,在实际应用中,md5不应用于此目的。本文选择md5是因为它生成摘要简单,但md5并不安全。
译者:博西。
相关文章
- 美股异动|建安科技盘前涨逾19%,领涨区块链比特币近两年首次突破45000美元/枚。
- 产业集群进一步发展,广州区块链企业数量达到500家。
- 腾讯获得CN110597887B专利,减少了对节点存储空间的占用,提高了业务性能。
- 币安区块链:让全人类都拥有NFT资产
- 中央网信办发布区块链创新应用案例征集,上海7个案例入选。
- 博瑞医药:运营管理中未使用区块链技术,持续打造数字生态,提升智能制造管理水平。
- 由中国主导的全球首个“区块链+物联网安全”国际标准正式发布。
- 长虹牵头制定了首个国际标准“区块链+物联网安全”,并正式发布。
- 长虹牵头发布全球首个“区块链+物联网安全”国际标准。
- 长虹率先制定首个国际标准“区块链+物联网安全”并正式发布。
发表评论
评论列表
- 这篇文章还没有收到评论,赶紧来抢沙发吧~