社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  区块链

带你探索区块链的原理

区块链技术学习 • 6 年前 • 563 次点击  

来自公众号:一个不甘平凡的码农


阅读本文大约需要 7 分钟 


写在前边


之前经常听别人说,挖矿、比特币、区块链之类的东西,听起来好高大上呀,后来在网上了解相关知识,但是网上大部分都是转载,没一个能讲明白的,后来不知不觉接触到了一些易懂的点,所以今天整合一下,让大家彻彻底底的明白到底什么是区块链、什么是挖矿、什么是比特币。


从头到尾都是小鹿三个小时的手动敲打,因为最近准备面试,写作的时间越来越少,但是我还是喜欢抽时间分享出来给各位读者们,如果你明白了今天的内容,不要忘记转发给你们的朋友哦,我相信他们会感激你能够给他带来那么清晰易懂的文章。


什么叫比特币?


比特币其实是一种虚拟的电子货币,它是基于密码学的。


虚拟?电子货币?密码学?还是有点懵懂,好吧,再详细点,比特币与所有的货币不同,它不依靠特定的货币机构发行,而是基于特定的算法产生的,这一点我们接下来会讲到。


比特币的概念是在 2008 年 11 月 1 日有个自称中本聪的人提出的,到现在他的身份还是未知的。它在《白皮书》中提到,这是一种去中心化的电子记账系统。


什么是去中心化?我们现在每个人都有银行卡和支付宝,我们的钱都是由银行和支付宝保存的,因为我们对国家的信任,银行就是相当于中心,我们每个人的存入支出记录都是银行或支付宝给我们记录的。


那么这个中本聪提出的电子记账系统去中心化呢,就是说,我们每个人不需要银行和支付宝的记录,而是公开自己的消费记录,让别人给我们记录,就相当于公开了我们的账本,我们的余额、消费都会被他人所知道。


假如有 A、B、C、D 四个人,A 向 B 支付了 10 个比特币,那么 C 和 D 就会记录 A 向 B 支付了 10 个比特币。然后 B 向 C 支付了  20 个比特币,那么 A 和 D 将会记录到自己的账单,B 向  C 支付了 20 BTC。同样的 C 向 D 支付了 5 个 BTC ,A 和 B 也会记录这个交易。


什么是区块链?


然后我们将记录的账单打包成一个包,这个包叫就叫做「区块」。每个区块大约记录 4000 条数据左右(1兆左右),我们将此区块接到上一个区块上,就形成了一条链,叫做「区块链」。



那么你可能遇到几个问题,第一个问题,每个人都记账,假如 A 支付 给B 的 10 个BTC,然后 B 支付给 C 20 个BTC ,另外记账的人出现网络延迟,一个人记录的是 A 先支付的 B ,而 另外一个人先记录的 B 支付给了 C ,那我们以谁的账单为准呢?


第二个问题,为何记账?假如张三给李四付款,那小鹿凭什么给他记账呢?不但浪费我宝贵的时间,还浪费了我的电脑资源。


第三个问题,假如小鹿给他记账,我背后偷偷的伪造了一条数据,也叫伪造记录,那怎么防止这种问题发生呢?


这里时间有限,只分享前两个问题的解决方案。


我们每个人在记账系统中记账都会有手续费提成的,我帮你记账,支付的人会拿出一小部分作为手续费给记账的人,那么话说回来了,银行存钱取钱还有手续费呢,但是我们的电子记账系统的手续费是非常低的。而且谁最后打包了账本形成区块,还会有打包费用,还有这样的好事,那就可以给他打包赚钱啦。


给你的费用就是比特币,那么给你多少比特币呢?中本聪是这么设计的,每 10 分钟就会打一个包,每四年打包费就会减半。也就是说这个系统刚刚运作的时候,打包费用为 50 个比特币,每过四年,就会减少一半,也就是 25 个, 12.5 个......


那我们来算算一共产生多少比特币,每个小时有 6 个十分钟,一天 24 小时,一年 365 天,前四年是 50 个,每过四年减少一半,通过数学计算:50 x 6 x 24 x 365 x 4 x(1 + 1/2 + (1/2)² + ...)  ,我们可以算出,世界上一共有 2100 万个比特币。


问题来了,打包既有手续费也有打包费,每个人都想干这件事,那么每个人都抢着干,以谁为准呢?


什么是挖矿?


既然都想做,那么我们来设计一到数学题吧,谁先做出来谁就可以打包赚取比特币。如果你说,我数学非常好,拿过奥林匹克竞赛一等奖等等,不好意思,就算著名的数据家高斯也是无法手动解出来的。这道数学题人脑根本是无法算出来的,那么这道数学题难到什么程度呢?


所有的是哈希算法,学过数据结构的都知道,哈希算法正向算是非常容易的,反向算是及其困难的,简直无法想象的难,只能通过 CPU 的运算才能算出来。


这倒数学题正是所用的 SHA256 算法,MD5 加密听说过吧,想必 SHA256 也不陌生。将一个字符串生成 256 位 的二进制。无论大小,都会有 256 位,给你一个 20 G 的视频,也会生成一个 256 位的二进制。所谓的难题就是这个 256 位的二进制对应的字符串是什么?



我们就将解决这道数学题的过程叫做「挖矿」。


那么这个字符串是怎么生成的呢?这字符串的信息是由前区块头的信息+当前账单的信息+账单的时间等各种信息,前边这些是固定的,但是最后一个还要加一个随机数,这是设计的一个难点。


对于这个字符串,进行两次哈希(SHA256)运算,HASH = sha256(sha256(字符串)) ,求出来就是一个256 位的二进制数,我们要求前 n 位是零。加入前几位要求的是 6 个零,如果你算出来是 6 个人零,那么你就算对了。算对了就可以进行打包,将你算出来的哈希值作为新块的头部接入上一个区块中,然后你就获得了想要的奖励。



有小伙伴就要问了,怎么求出规定的前几位是 0 呢?那么我们要改变一个数,那就是字符串中的随机数,因为其他的内容是固定不变的,如果我们想通过 HASH 求出这个哈希值,只能一个一个的数去试,将 1 带入看哈希值是否满足条件,如果不满足,然后依次将 2 、3、4、5...... 直到有人试出来为止,将此区块打包,求出来的字符串作为此区块的头部,接入上一个区块。



每个人对应的随机数是不一样的,所以说要想挖到矿,一个是看你的运气,另一个是看你的 CPU 每秒计算的速度。有人运气好,虽然计算能力不够,第一个数就试出来了,有人运气不好,CPU 计算能力再强,也白搭。平均来讲,还是看 CPU 的计算能力,算出来的希望就会大一些。所以很多人都去拼命的买矿机,来进行 24 小时挖矿。



●编号206,输入编号直达本文

●输入m获取文章目录


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/34293
 
563 次点击