比特币技术原理

news/2024/11/29 10:52:50/

目录

比特币的兴起

1.以物易物

2.实物货币

3.符号货币

4.中央系统虚拟货币

5.分布式虚拟货币

比特币原理

三大核心问题

问题1——记账必要性

问题2——以谁为准

问题3——如何防伪

RSA算法

数字签名

比特币的优缺点

优点:

缺点

参考链接

PPT:

比特币技术介绍PPT(xinanzhijia.xyz.)

比特币的兴起

比特币的兴起源于2008.11.01一篇极客的论文,至今作者没有公布身份。论文中提出了一种去中心化货币的概念——Bitcoin。

这个想法在当时金融危机的背景下堪称疯狂,然而在无数爱好者和有识之士的支持下如今成为了现实。不光比特币的交易呈现爆炸式增长,也激发了几千种虚拟货币的诞生:

那么我们为什么要进行去中心化呢?这不得不从头开始讲起。

1.以物易物

很久很久以前的农村,人们过着以物易物的生活。

2.实物货币

由于这样存在价值彼此不认可的问题,我们统一规定物价,使用一些稀有且容易分割的东西作为货币进行交易,例如黄金或者贝壳等。

3.符号货币

目前也还有一个问题,货币本身携带不便,还有磨损等诸多问题,并且采集货币,如炼金、收集贝壳等等耗费了许多财力物力。这时有人提出了解决办法,我们未必要拿着真的黄金交易,可以找可靠机关(例如村委会)发行一些带有”一克黄金”的纸币,纸币上带有专门的防伪标志,大家用纸币交易。

4.中央系统虚拟货币

刚刚的问题显然治标不治本,贪婪的人类感觉携带纸币交易也是太麻烦了,因此又有人提出了改进办法。我们未必要真的带着货币交易。比如目前找可靠机关,统计所有村民的余额,以后交易直接跟这个可靠机关报备即可。这个可靠机关负责记录每一笔交易,计算所有人余额,大家都信任这个“可靠机关”。

5.分布式虚拟货币

然而好景不长,大家都信任的这个“可靠机关”出现了贪腐问题,导致整个中央系统虚拟货币系统轰然倒塌,然而人们已经完全习惯了不带现金交易的生活模式,这该怎么办呢……

这时,极客中本聪华丽登场。

比特币原理

我们模拟一次交易,可以抽象成如下账本的形式:

付款方付款金额收款方……(验证字段)
Alice10BTCBob
Bob5BTCCici
Cici2BTCDavid

每个人都要进行记账,我们使用区块存储交易记录。每个区块大小为1M,能存储约4000条交易记录。把这个区块连接到前面的区块,就形成了区块链。

  • Pre Hash:前一个区块的哈希值。

  • Nonce:使得区块的哈希值满足要求的数值,即挖矿计算的结果。

  • Transaction Data:区块中的交易数据。

三大核心问题

  • 为什么要记账?

  • 以谁为准?(网络延迟)

  • 如何防伪?

问题1——记账必要性

为什么要记账呢?因为记账有奖励。所有的比特币最终来源都是记账,即挖矿。并且记录交易还有一定量的手续费(远小于目前银行手续费)。比特币交易系统期望每10min要打包一个交易块,在2008年创世纪块出现后,每打包一个块可以获得50个比特币,后每4年减半。这样算下来:

50 \times 6 \times 24 \times 365 \times 4 \times(1+\frac{1}{2}+...+\frac{1}{2^n}) \approx 2100w

比特币最终会发行2100万枚。

问题2——以谁为准

想解释清楚这个问题,不得不了解挖矿的原理。首先介绍一个这样的函数:sha256(),使用链接

Hash函数

sha256()是一种哈希算法,他可以将任何字符串转化为256bit的哈希值,算法有如下关键特点:

1.不可逆性

哈希函数具有不可逆性,具体的不可逆性可以类比成:

y=x^8+log_6x+sin(x)+cot(x)

给出一个x,可以轻松算出y;但给出y反算x,这将是灾难。

2.小变化大改变

import hashlib
​
message = "Hello, world!" # 待计算哈希值的消息
message2 = "Hello, w0rld!"
hash_object = hashlib.sha256(message.encode('utf-8'))
# 获取哈希值(以16进制表示)
hex_dig = hash_object.hexdigest()
​
print(hex_dig)  # b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9
print(hex_dig2) # 3FBE0E7AA29A4A4071A2DD78E2A02AD6209D23CEC2F861BE75D24B72462D911B

可以看出,略微的输入变化,哈希值就会出现巨大变化。

3.抗碰撞性

在哈希函数设计合理的情况下,两个不同值计算后产生同样哈希值的概率,微乎其微。

挖矿过程

矿工首先获得交易记录,记录达到一定数量后开始计算一个字符串。这个字符串由:区块头+账单+开始时间+随机数组成。

接着,计算Hash=sha256(sha256(字符串)),然而,计算出的结果Hash必须前n位都为0才算成功。

由于字符串的前三部分都不能随意变化,并且哈希函数不能反算,所以我们只能反复试验随机数,直到算出满足前n位都为0的字符串,这时我们就算挖矿成功。由于哈希值受到前面三项的影响,所以挖矿一定程度上跟运气有关,但更重要的是依靠算力找到对应的随机数。

同样我们不难看出,n的取值越大,挖矿就越难。为了保证矿工们能够10分钟打包一个块,但打包过程又不那么轻松,目前设定n=66

总的比特币挖矿流程图如下:

综上我们可以得出,所有的交易以矿工打包后的区块为准。

问题3——如何防伪

防伪基于非对称加密的数字签名。最常见的非对称加密即为RSA算法。

RSA算法

 算法的加密解密过程如下:

  1. 选择一对不相等的大质数,记作p、q

  2. 计算N = p \times q

  3. 计算\phi(N) = (p-1)\times(q-1)

  4. 选择一个与\phi(N)互质的整数e

  5. 计算出e对于φ(N)的模反元素d

  6. 公钥 KU = (e,N) ,私钥KR = (d,N) 注意这括号不是最大公约数,而是表达形式。

例题如下:

  1. 取p=3、q=11;

  2. N=p \times q = 33

  3. \phi(N) = (p-1)(q-1) = 20

  4. 选择一个与\phi(N)互素的数,我们选择e=3

  5. 找到一个d使得ed \equiv 1 \mod \phi(N),解得d \equiv 7 \mod 20

  6. 公钥KU = (e,n) = (3,33) ,私钥KR = (d,n) = (7,33)

假如明文M=20,加密即为20^3 \mod 33 = 14,解密即为 14^7 \mod 33 = 20

数字签名

比特币交易过程中数字签名的操作流程如下:

首先A注册比特币账号,获得自己的公私钥对。A将自己的交易信息进行哈希运算获得摘要,用自己的密钥加密摘要获得一份密文。

之后A向互联网广播一组信息,请求大家认证这份消息:交易信息+自己的公钥+加密的密文。

其他用户首先将交易信息进行Hash运算获得摘要1,接着用A的公钥解密密文,获得解密的明文摘要2。如果摘要1和摘要2相同,则交易属实。因为如果想伪造一条广播信息,我们无法制造一份密文,使得他解密的结果是伪造的交易信息,因为哈希函数是无法反算的;同样的道理,这份信息也只能是A发出的,因为只有A有自己的私钥能够制造出这份密文。

比特币的优缺点

优点:

  1. 去中心化:比特币不受任何中央机构或政府监管,由网络中的节点来维护和验证交易。

  2. 保护隐私:比特币使用公开密钥加密技术,可以保护用户的信息和隐私。

  3. 可追溯性:所有比特币交易都被记录在区块链上,可以追踪其交易历史。

  4. 通货膨胀率低:比特币的总量被限定在2100万个左右,因此通货膨胀率很低,具有一定的保值功能。

缺点

  1. 安全性问题:比特币被盗、遗失或黑客攻击的风险仍然存在,需要用户自己保管好比特币私钥。

  2. 交易速度有限:比特币交易需要被打包进块,并等待6个块后才能确保交易成功。每10分钟打包4000条交易记录,每秒钟只能完成约7次交易。目前为了解决这个问题,比特币推出一个新协议,希望将区块从1M变为8M,目前协议还在推动中。

参考链接

CodingLabs - 一个故事告诉你比特币的原理及运作机制

https://coinmarketcap.com/zh/rankings/exchanges/

https://assets.pubpub.org/d8wct41f/31611263538139.pdf

<iframe src="//player.bilibili.com/player.html?aid=45247943&bvid=BV1Bb411B7dq&cid=79224469&page=1" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true"> </iframe>
<iframe src="//player.bilibili.com/player.html?aid=45597148&bvid=BV12b411q7ku&cid=79839195&page=1" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true"> </iframe>
<iframe width="560" height="315" src="https://www.youtube.com/embed/bBC-nXj3Ng4" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
<iframe width="560" height="315" src="https://www.youtube.com/embed/BODyqM-V71E" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

http://www.ppmy.cn/news/545932.html

相关文章

PTA-换硬币

换硬币 将一笔零钱换成5分、2分和1分的硬币&#xff0c;要求每种硬币至少有一枚&#xff0c;有几种不同的换法&#xff1f; 输入格式: 输入在一行中给出待换的零钱数额x∈(8,100)。 输出格式: 要求按5分、2分和1分硬币的数量依次从大到小的顺序&#xff0c;输出各种换法。每行输…

c语言 人民币兑换

**c 1 元 5 角钱人民币兑换 5 分、2 分和 1 分的硬币&#xff08;每一种都要有&#xff09;共 100 枚&#xff0c;会有很多种兑换方案。请编写程序给出各种兑换方案。 输入格式: 输入为一个正整数 n&#xff0c;表示要求输出前 n 种可能的方案。方案的顺序&#xff0c;是按照 5…

十二硬币问题

十二硬币问题 解题思想源于“约翰比斯利”&#xff08;一个歪果仁&#xff09; ##1、问题重述 给出12个硬币&#xff0c;其中一个是假硬币&#xff0c;用一个天平来确定三种重量的假币&#xff08;其中假币可能比其他硬币轻或重&#xff09;。问&#xff1a;至少称量多少次能够…

c语言换硬币

将一笔零钱换成5分、2分和1分的硬币&#xff0c;要求每种硬币至少有一枚&#xff0c;有几种不同的换法&#xff1f; 待换的零钱数额x&#xff0c;整数&#xff0c;不少于8&#xff0c;不超过100。 要求按5分、2分和1分硬币的数量依次从大到小的顺序&#xff0c;输出各种换法。…

新手,如何获取C币

新手&#xff0c;如何获取C币 论文数据处理&#xff0c;需要GS应用的软件包&#xff0c;软件包下载需要C币&#xff0c;请问各位大神如何获取C币&#xff0c;感激不尽 你好&#xff01; 第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔…

抓包抖音充值接口,实现微信支付宝充值抖币收款通道

前段时间搞了个抖音充值的通道&#xff0c;现在搞个YY充值的。 接下来这段时间的安排就是把各个这种平台的充值接口全分析一遍做成接口。 相比抖音的充值抖币接口&#xff0c;yy充值y币的风控就小很多&#xff0c;可以忽略不计&#xff0c;所以开发上也顺利很多。 把调用的相…

性、谎言、直播间,网红主播的生存游戏和金钱帝国

性、谎言、直播间&#xff0c;网红主播的生存游戏和金钱帝国&#xff08;转&#xff09; 作者&#xff1a;黄周颖&#xff0c;编辑&#xff1a;郑道森 青年歌手关迟在刚毕业的时候&#xff0c;就残酷地发现民族声乐已经快被市场淘汰了——几乎没有商演会请歌手去唱一首民歌。但…

KeeperErrorCode = NoAuth for /hbase/tokenauth/keys

kerberos配置hbase出現問題 環境如下&#xff1a; 问题描述 想要在hadoop ha的場景上&#xff0c;基於kerberos配置hbase ha&#xff0c;出現了如下的bug org.apache.zookeeper.KeeperException$NoAuthException: KeeperErrorCode NoAuth for /hbase/runningat org.apache.…