主页 > imtoken钱包华为手机安装不了 > 研究比特币代码后,我发现了一个惊人的秘密!

研究比特币代码后,我发现了一个惊人的秘密!

比特币概念股票代码_1个比特币代码样子_比特币开源代码 java

作者简介: 段新亚,来自郑州大乘信息技术有限公司,总部位于郑州,致力于网络安全领域的技术研究和产品开发。 是一家为相关部门提供计算机取证、互联网取证和信息安全产品和服务的公司。 专业化企业。 本文是作者深入研究比特币代码后的心得体会,帮助大家对比特币和区块链有一个全新的认识!

现在,因为比特币,越来越多的人在谈论区块链,甚至开始出现把区块链说成庞氏骗局的说法。 区块链算法本身就是一种分布式存储模型,是一种专门用来解决记账问题的算法。 与其看那么多区块链文章,不如看比特币的代码更靠谱。

就像我们编写代码来制作烹饪设备一样,您的重点应该放在哪里? 我觉得不应该是你用什么语言,用什么框架,系统稳定性参数是多少,成本有多低,而是油炸食品好不好。 就像没有人关注技术细节一样,人们关注的是它能做什么。 不管你的代码写得多么好,系统架构如何,硬件或模型设计多么优化,用的技术多么高科技,只要饭菜不好吃,就是废品。

1个比特币代码样子_比特币开源代码 java_比特币概念股票代码

现在一般来说,只要提到区块链,就是“因果韭菜”、“加密货币”、“货币”,但区块链其实只是解决中心记账问题的一种模式。

现在让我们回归到区块链记账体系的本质,然后按照区块链作为记账模型。

传统会计记账的模型都是中心模型。 以阿里为例,阿里中心设有财务部、省级财务部、市级财务部。 阿里每天产生大量的交易,财务部门也有无数的账单。 市财政部门核算统计票据上报省级; 市级寄出的票据,由省级统计,发给阿里的财务总部。

我们现在的财务核算模型都是这个样子,但是像阿里这样的大公司,每分每秒产生的交易量就被夸大了。 这种情况下,数据量小的时候,各级财务部门我自己统计,可是我越汇总,这个账就越恐怖。 如果有人伪造账目,篡改历史账目,或者漏掉某一个账目,那基本上就是无数海量账目中的一个烂账。 再好的管理制度,也基本上不可能查出修改过的错误票据。

区块链就是用来解决这个金融坏账问题的算法模型。

第一阶段

下面是一个尽可能简单的区块链最基本存储模型的代码示例。

// 片

类型块结构{

// 时间戳

时间戳 int64

// 账单数据

数据[]字节

// 前一个区块的哈希值

PrevBlockHash []byte

//哈希值

哈希[]字节

}

Golang的代码不需要看懂太多,看注释就行。 比特币代码中的这个区块可以理解为记在金融票据上的账户,票据上需要注明记账时间和交易数据。

1个比特币代码样子_比特币开源代码 java_比特币概念股票代码

PrevBlockHash暂时理解为一个数字,后面会解释。

这个Hash可以理解为当前的记账时间和交易数据,以及编号PrevBlockHash,它用一个奇怪的数学公式计算出一个校验值,用来保护账单不被修改。

如果有人要查看账户是否被修改,需要查看记账时间和交易的原始数据,然后查看PrevBlockHash的个数。 把这三个数据都计算一遍,看计算出来的数字是不是Hash里面的数字,就知道账单有没有被修改过。

这样的数据块可以理解为一张一张的账单,一张一张的交易数据。 票据块是用来以后调用的,每个票据块都写有一个数字。

1号票据的PrevBlockHash是一个数字,直接记为0号。这个1号票据块俗称创世块。

2号票据的PrevBlockHash写入1号票据的Hash校验值,以此类推。

假设这张账单现在有 100 个账单块。 如果有人想干什么,就伪造账户,修改1号账户的数据。

1号票据的Hash数是记账时间、票据交易内容和PrevBlockHash计算出来的数,1号票据的PrevBlockHash内容为0。修改记账时间或者修改票据的交易内容都会导致改变哈希数的计算。 如果这个人想做假账,就必须把Hash数改成重新计算的数。

但是我们的法案要求将2号法案的编号PrevBlockHash写入到1号法案的Hash校验值中。

同样,因为bill 2中的PrevBlockHash的个数发生了变化,所以Hash的个数也发生了变化。

以此类推,我们当前的bill block是100,要修改bill 1中的任何数据,从1到100的所有bill都需要做相应的修改。 否则,因为校验值错误,该账本将作为错误账本被丢弃。

这样一来,基本上就不可能修改之前记录的账号了。 这就是区块链作为分布式存储和记账系统的优势。 账单一旦录入,基本无法修改。 计费系统也是一种存储模型,一种存储账单的模型。

第二阶段

以上只是最基本的区块链存储模型。 在实际使用中,这里的Data并不是真正的账单,而是Merkle树根节点的校验值。 后面加上默克尔树,再重新认识区块链。

// 片

类型块结构{

// 区块头

脑袋木头

// 账单数据

数据默克尔

}

// 区块头

键入 BlockHead 结构 {

比特币开源代码 java_比特币概念股票代码_1个比特币代码样子

// 时间戳

时间戳 int64

// 账单数据

MerkleRoot[]byte

// 前一个区块的哈希值

PrevBlockHash []byte

//哈希值

哈希[]字节

}

// 账单

键入 Merkle 结构 {

// 每笔交易记录

数据[]字节

}

对于上面的Merkle参数,Merkle树可以理解为一张票据。 刚才还是第一阶段,每个Data都不是交易记录,可以理解为一个block记录就是一个bill。

当交易记录过多时,记账的交易数据量太大,整张票据参与Hash值的计算又太大又麻烦,所以采用Merkle树的方法簿记。

Merkle树我就不多说了。 如果您有兴趣,可以查看一下。 它实际上与区块链非常相似。 每个树节点都是通过这个树节点的子节点的Hash校验值来计算的。

简单理解,可以认为是通过Merkle树来做一个bill。 这张票据有一个根节点,这里记为MerkleRoot,是树结构的一个节点。 如果不理解,也可以理解为支票号码。 只要整个账单中的任何一个字节不匹配,就会导致 MerkleRoot 的编号发生变化,所以一旦完成账单,将 Merkle 账单的 MerkleRoot 编号写入区块头,则整个账单的任何一个不能修改单词。 一旦有修改,整个树形结构上每条交易记录的Hash值都需要重新计算。

最终,MerkleRoot 的数量会发生变化,一旦发生变化,就会导致区块头的 Hash 值发生变化。 如此一来,这个账单进入后的所有账单的PrevBlockHash值都会发生变化,这个区块之后的所有账户都将作废重做。 区块链通过这样的管理模式来管理账单。

比特币开源代码 java_比特币概念股票代码_1个比特币代码样子

区块链总结

其实区块链到此为止已经完蛋了。 区块链其实是一种简单的记账模型,目的是避免人为修改账户报表。 随着交易记录的增加,区块链的每个区块都会不断添加。 因为任何一个区块的数据都被一个完美的数学系统锁定1个比特币代码样子,任何一个词都不能被修改。 只要有修改,从这个账单块开始的所有后续账单块都需要重新计算,否则账单是错误的。 该账单将不会被系统接受。

目前的区块链实际上有三种使用模式:去中心化、以联盟为中心和多中心。 根据投票决定谁的账单最长,根据谁的账单是总账。

比特币概念股票代码_1个比特币代码样子_比特币开源代码 java

这样就避免了中心化记账,财务中心的人恶意修改数据,无人管。 如果多个中心相互核对,每个人都有一个完整的账户。 首先验证账单的各个节点是否计算正确,保证账单没有被修改。 二、验证每个区块的内容,谁的账单是账户数最多的(俗称最长的区块链),根据谁的账单作为总账,其他所有节点收到通知后更新自己的账单.

去中心化是指任何人都可以加入金融中心,每个人都可以获得总账,验证总账,帮助记账。 只要你的计算正确,计算速度最快,就可以被采纳。

以联盟为中心的模式是多家公司相互制衡的模式。 多家公司使用这种模式来管理总账。 任何公司都无法轻易修改这种一直记录在案的动态账单。

多中心类型类似于中国银行,仍然是集中管理,但不再是一个节点记账,而是多个点同时记账,防止任何一个账户被财务人员篡改。中央。

在这里,区块链已经需要面对两个严重的问题。 区块链的每个票据块中可以记录的票据数量是有上限的。 现在一个bill块的大小是2MB,不能超过这个大小。 一旦要修改区块大小,区块链系统的所有节点算法都需要跟着变化,代价会很大。

这里我只说一个数字,假设一个区块可以保存2000条交易记录,比如今年阿里巴巴的双十一,3分01秒交易额100亿元。 划分为500万,即3分钟内将写入500万个票据块。 由于挖矿等一些原因(后面解释),比特币平均每十分钟写一个bill block。

每小时6元,24小时,也就是说,去年双十一,阿里巴巴三分钟出单用时约34722天,记账用时约95年。 这记账速度简直就是个笑话。

这个计费速度可以通过算法来调整,但是这么大的交易量,提高计费速度会导致区块容易冲突,因为少数必须服从多数来投票选出最长的账单,全网都会通知而投票这件事也需要时间。 电脑虽然快,但也需要时间。 增加区块大小或加快计费速度的通信成本很高,而且在计费数量过多时也是一件很不现实的事情。

比特币开源代码 java_比特币概念股票代码_1个比特币代码样子

第三阶段

看到这里大家应该明白什么是区块链了吧。 比特币使用区块链技术来管理其账单。 也很清楚比特币是如何利用区块链技术进行交易的。 但是比特币挖矿呢?

这里不详细讨论加密货币的加密交易过程,有兴趣的可以自行查看。 我这里假设的是明文交易模型,每笔交易的交易记录都没有加密,直接写在账单上。

这个记账系统的管理工作是通过算法来实现的,只需要真正记下每个账目的“会计”,而区块链系统中的“会计”就是我们俗称的“矿工”。

所谓矿工挖矿是什么意思? 在这种多中心模式中,没有财务管理。 人人都是“会计”。 记下整个区块链中下一个bill block的工作,成功写bill并计算正确的人将他的bill发给大家,然后把我们每个人做的bill放在一起。 计算正确且最长的账本一定是第一个成功入账的“会计”。

然后现场根据算法计算,他成功记了一个账户,应该给他多少,然后现场发放奖励,这就是挖矿。 但是这个挖矿有一个问题。 谁的计算能力强,谁的钱就永远拿得出手,其他人就没有工作的积极性。 而且每个人的记账速度都差不多,很容易崩溃同时提交账单。

所以让我们稍微重构一下这个块。

// 片

类型块结构{

// 区块头

脑袋木头

// 账单数据

数据默克尔

}

比特币开源代码 java_1个比特币代码样子_比特币概念股票代码

// 区块头

键入 BlockHead 结构 {

// 时间戳

时间戳 int64

// 难度值

位[]字节

// 目标数量

随机数[]字节

// 账单数据

MerkleRoot[]byte

// 前一个区块的哈希值

PrevBlockHash []byte

//哈希值

哈希[]字节

}

// 账单

键入 Merkle 结构 {

// 每笔交易记录

数据[]字节

}

这里在区块头结构中增加了两个参数:Bits difficulty value 和 Nonce target number。

先说一下添加这两个参数的原因。 刚才遇到的问题是有个“会计”的房间,大家都在做账。 谁做账最快,计票后大家更新账本,账本按照谁做账最快的人的账本更新。

但是要计算这个账单,虽然加入了一些麻烦的算法,但是还是很简单的。 大家飞快地计算,一起提交,全部计算正确。 这件事很容易引起争议。 如果有一个人计算的很快,而且他总是记账,他会不会做一些小动作? 所以,每个人都应该记一个小账,这样比较靠谱。

比特币开源代码 java_比特币概念股票代码_1个比特币代码样子

这就是中本聪提出的“工作量证明机制”,大家不开始记账。 我们都是从一道非常难的数学题开始的,那是一道超级麻烦,完全没用,基本上是幸运的数学题。 谁算谁就按流程算你的账。 电脑基本都是瞬间按照流程写账,但是算这道麻烦的数学题需要时间,而且是靠运气的数学题。 男人确保他能弄清楚。 这样就耽误了记账时间。

如果真的把区块链当记账系统用,不需要刻意拖慢记账速度的东西,但比特币就是这么写的。 我也认为这种“工作证明机制”是一种资源浪费。 然后我会详细解释这个数学体是什么。

刚才说了区块头Hash校验值的计算是利用记账时间、账单数据和上一个区块的Hash值计算出来的。 我们还将Bits的难度值和Nonce也带入了Hash计算。

先说一下Bits的难度值。 这个数字是根据之前记录的帐户计算的。 可以认为在待记录的往来账户中,是一个确定的硬编码数字。 它是怎么来的? 你可以自己查材料。

比特 = difficulty_1_target / current_target

所以当我开始计算这个区块的Hash值时,这个Bits可以认为是不影响计算结果的。

然后是Nonce目标数,记账员随便写这个数。 但是因为Nonce是参与计算的,所以写不同的Nonce值,计算出来的结果是不一样的。

那么接下来的工作就全靠套路了1个比特币代码样子,不断尝试各种Nonce数,使得计算出的Hash值小于硬编码的数Bits。

如果成功拿到这个号码,就赶紧把计算出来的账单和账单上的Nonce数字广播发给家里的每一个人,大家也都验证了账单没问题。 通过猜测Nonce数计算出的Hash数确实小于Bits数。 房间里所有的“会计”都更新了自己的账单,把你记账成功写进账单,然后系统计算出应该给你多少工资,当场结算。

因为计算出的Hash小于Bits的数量,如果Bits的数量太多,很多人很快就能算出来。 因为记账的时候账单上写的是当前记账的时间,这个数字是不允许修改的,所以可以算出你们一组平均需要多长时间算出一个账单块提交给总账。 . 速度太快的话,不到10分钟就算完了,Bits的数量会根据算法稍微减少,根据之前的账本记录时间计算。

因为每个人手里都有一个账本,这个数字需要写多少,自己可以直接算出来。 无需任何人控制记账难度系数,继续维护无中心、无管理的区块链记账系统。

同时通过这种难度波动的方式来控制大家记账的速度,即上面提到的比特币平均每10分钟记录一次,写入一个bill block,避免多人同时记账造成数据冲突。

继续吐槽,这种“工作量证明机制”简直就是用来拖慢记账速度的。 这个模型确实有点傻,但是确实很有效。 它确实解决了如何让彼此完全不信任的人之间管理账本的问题。

比特币开源代码 java_比特币概念股票代码_1个比特币代码样子

补充

其实还有很多细节没有提到,比如比特币的发行模型。 通过记账成功的方式,根据算法直接发放奖励。 这只是中本聪写的一个奖励方法。 为了让大家继续玩这个记账游戏。

在比特币系统中,只有“会计”挖矿才能凭空获得比特币。 记账成功后根据算法自动获得,同时也有系统奖励衰减,避免通货膨胀问题。

但是现在更多的模型是在没有奖励的情况下“算账”。 系统一开始直接发币,中央系统发币。 其实监管是有的,监管中心可能会出现币控等问题。

这个记账系统没有账可记,于是就变成了中本聪编写的记账游戏系统“比特币”系统。 在记账的过程中,产生只发给“会计”的货币,然后是参与者之间相互交易的模型。 但说白了,比特币就是一个游戏系统,没人用的时候,就是一堆废弃的数据。 尤其是当“会计”从系统中消失后,记账系统就会崩溃。 没有记账的“会计”,就没有交易,所有的交易单都将成为废品。

此外,每次记账成功发行的比特币数量平均每四年除以二。 四年前你记账成功得10000,现在你记账成功得5000。 数字是我随便写的,因为奖励分配是用浮点数记录的,不是那种数学上可以无限细分的数字,所以实际上从某个时刻开始,比特币记账是拿不到收益的.

要么有其他办法让“会计”赚到钱,要么使用交易佣金等,否则“会计”肯定会退出这场无利可图的游戏,也就是比特币系统必须崩溃的那一天。

虽然比特币的游戏模型是一个注定要被打破的模型,但它只是一个记账游戏。 区块链技术绝对不是庞氏骗局,它只是一个记账系统。

比特币开源代码 java_比特币概念股票代码_1个比特币代码样子

比特币开源代码 java_1个比特币代码样子_比特币概念股票代码

比特币概念股票代码_比特币开源代码 java_1个比特币代码样子