imtoken波宝钱包下载|比特币算法原理

imtoken波宝钱包下载 2024-03-10 21:48:21

比特币挖矿算法详解 - 知乎

比特币挖矿算法详解 - 知乎首发于清源的区块链实验室切换模式写文章登录/注册比特币挖矿算法详解清源区块链工程师比特币网络中,源源不断的收到交易,需要节点不断的打包这些交易,而网络中的所有节点都是对等的,如何判断谁可以打包这些交易,如何避免重复打包这些交易呢?这个时候就需要用到工作量证明(PoW,Proof-of-Work)的方式决定记账权。网络中的任何全节点,都可以试图创建区块,但区块只有在至少满足下列条件时创建的区块才会被其他节点认可和接受。 区块中包含的交易都是合法的; 区块哈希要小于等于一个目标值;要满足第一个条件很简单,节点只要将每笔交易都验证一遍,丢弃掉不合法的交易即可。但要满足第二个条件就需要挖矿。挖矿比特币挖矿就是找到一个随机数(Nonce)参与哈希运算Hash(Block Header),使得最后得到的哈希值符合难度要求,用公式表示就是Hash(Block Header)<= target 比特币采用的哈希算法是 SHA-256 ,也就是说最后会产生256位的输出,一共2^256种可能的取值。 最后得到的哈希值小于target的意思是把哈希后得到的bytes转换成数字后小于target转换成的数字。举个例子,直观的感受一下挖矿的难度;SHA-256计算123的值

a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3

下面这段字符是比特币第1000个区块的哈希(2009年1月产生);

00000000c937983704a73af28acdec37b049d214adbda81d7e2a3dd146f6ed09

可以看到前面有8个0,虽然哈希值的生成是随机的,但是生成前面有8个0的值对计算机穷举来说也并不算太难。

再看一下这段字符,是比特币第560000个区块的哈希(2019年1月产生);

0000000000000000002c7b276daf6efb2b6aa68e2ce3be67ef925b3264ae7122

可以看到前面有18个0,要生成满足这个条件的哈希对于普通电脑来说几乎是不可能完成的任务了。简单来看挖矿难度的高低就是生成区块头的哈希值有多少0。挖矿难度在比特币系统中出块时间被设置为一个常数10分钟,但是挖出区块的速度并不是固定的,而是随着挖矿难度的变化在10分钟上下浮动, 挖矿难度越大,出块时间就越长,为了得到相对平均的出块时间,需要动态调整挖矿难度。 比特币每产生2016个区块调整一次挖矿难度,一个块10分钟,2016个块大概是两周的时间,而调整挖矿难度的这些逻辑都在代码中,当大多数诚实节点采用这个策略的时候整个网络就会自动遵循这个策略。挖矿难度的计算公式如下:diffculty = difficulty_1_target / target此处的 difficulty_1_target 为一个常数,非常大的一个数字( 2^(256-32)−1 )。表示挖矿的初始难度,目标值越小,区块生成难度越大。 2^(256-32)−1 是比特币的初始难度,是前2016个块的难度。 这个难度被存储在比特币的区块头nBits字段中,当有恶意节点篡改这个策略时,挖矿产生的区块头的哈希值就会和诚实节点产生冲突,不会被接收,白白浪费了算力。 因为策略不同,也就是nBits不同,恶意节点产生的区块哈希无法被诚实节点验证。 调整出块时间比特币系统中区块的生产速度是根据之前产生区块速度调整的,之前出块速度大于10分钟,则认为需要降低难度,则需要提高第一个公式中target的值,而target则通过如下公式计算;target = current_target * ( actual time / excepted time )current_target是当前系统中的难度值,target是调整后的难度值,actual time是实际产生区块的时间,excepted time是期望出块时间(2016块*10分钟),actual time有上下限,actual time最多8周,最小二分之一周。挖矿算法比特币中nBits标识了挖矿的难度,也就是说这个区块头进行SHA-256哈希算法后得到的bytes转换成数字后要小于这个难度,而SHA-256计算后的结果有256位,如果直接存储需要32个字节比较占用空间,所以采用了一种压缩算法。压缩算法nBits有4个字节32位,将SHA-256计算得到的值经过如下算法压缩到32位;将数字转换为 256 进制。如果第一位数字大于 127(0x7f),则前面添加 0。压缩结果中的第一位存放该256进制数的位数。后面三个数存放该256进制数的前三位,如果不足三位,从后补零。举个例子,将十进制1000压缩;1. 1000转换256进制数,1000 = 3 * 256 + 232 = 3*256^(2-1) + 232*256^(1-1)

2. 3小于127,不需要补0,跳过

3. 从第一部看到1000转换成256位数有2位,压缩结果第一位应该存放2

4. 因为只有两位,所以最后一位补0,得到存放的值为 [2, 3, 232, 0]十进制,转换十六进制 [0x02, 0x03, 0xe8, 0x00] 合并存储到nbits为 0x0203e800难度计算在第一个公式中difficulty_1_target的值为 2^(256-32)-1,转换成256进制为;FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF第一位大于0x7f,前面补0,变为00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF其长度等于 28+1=29 (0x1d),且长度超过三位,无需补零,则压缩结果为:0x1d00FFFF,因为压缩存储容量只有才4个字节,前两字节已经被长度和添加的 00 所占用,只剩下2个字节来存储数字,这样后面的26个 FF 值被丢弃。T=0x00FFFF * 256^(0x1b-3) = 0x00000000FFFF0000000000000000000000000000000000000000000000000000比特币中的difficulty就是0x1d00FFFF,如果区块中的nBits为0x1d00FFFF则说明这个区块挖矿难度为最小挖矿难度1.实际上专业的矿池程序会保留被截断的FF:00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF我们算一下比特币101799号区块的挖矿难度,通过区块链浏览器可以看到101799号区块的nBits为0x1b0404cbD = 0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF / 0x00000000000404CB000000000000000000000000000000000000000000000000 = 16307.669773817162 (pdiFF)pdiFF也被称为矿池难度。算力为了找到符合条件的值在挖矿的时候需要不断的调整区块头中Nonce的值,但是又会有一个问题,在比特币中Nonce的值是32位的,如果挖矿难度太大,就算穷尽Nonce的所有可能还是不能算出符合条件的值。铸币交易在一个区块产生的时候,会有一个铸币交易(coinbase),也就是矿工为自己铸币,产生新的比特币。铸币交易没有UTXO输入,只有输出指向自己的比特币地址,当挖矿成功,这个区块被网络接收的时候,新产生的币就转移到这个矿工地址了。看一下铸币交易包含的字段; transaction hash:“交易哈希”字段32个字节全部填充0(因为其没有UTXO输入);ouput index:“交易输出索引”字段全部填充0xFF(十进制的255); coinbase data:coinbase数据长度最小2字节,最大100字节。除了开始的几个字节外,矿工可以任意使用coinbase的其他部分,随意填充任何数据。以创世块为例,中本聪在coinbase中填入了这样的数据“The Times 03/Jan/ 2009 -Chancellor on brink of second bailout for banks“; - coinbase data size:coinbase数据大小; sequence number:现在未使用,设置为0xffffffff可以看到铸币交易的coinbase data字段是我们可以控制的,当Nonce不能满足挖矿难度的时候,我们可以通过调整coinbase data字段,从而影响区块头的默克尔树根的值,提供更多的可能来满足挖矿难度的要求。算力单位通过上面的流程,进行一次可能的挖矿尝试被称为H。 1 H/s = 每秒可执行一次哈希运算。 1 KH/s = 每秒1,000哈希(一千次)。 1 MH/s = 每秒1,000,000次哈希(百万次)。 1 GH/s = 每秒1,000,000,000次哈希(十亿次)。 1 TH/s = 每秒1,000,000,000,000次哈希(万亿次)。 1 PH/s = 每秒1,000,000,000,000,000次哈希。 1 EH/s = 每秒1,000,000,000,000,000,000次哈希。挖矿收益矿机挖矿的时候就会出现很长的时间找不到符合条件的哈希值,如果找不到哈希值不能打包区块就没有收益,显然对矿工十分不友好,但是如果挖到就像中彩票一样获得非常丰厚的回报。矿池为了避免单个矿工挖矿收益的不稳定性,就出现了矿池,矿池集合了大量的矿工,平均挖矿的收益,避免了挖矿收益的不稳定性。 矿池组织大量的矿工挖矿面临很重要的一个问题就是如何把高难度计算哈希的任务拆解成相对简单的任务,发送给单个矿工,回顾之前挖矿难度的计算,可以简单的认为前面0的多少表明了挖矿的难易。 0越多,挖矿难度越高,为了降低挖矿难度我们就要增加挖矿哈希0的数量,举个例子假设挖矿目标值 0x000abc,只要满足这个值就可以打包区块获得挖矿收益;

降低挖矿难度为 0x001abc,发送给矿工,矿工只要计算区块头满足这个相对低一点的难度就可以得到一个分片(shared),但是单个矿工挖到这个简单难度的块是无法发布到整个网络中的,但是矿池可以把这个分片记录下来,作为以后给这个矿工奖励的凭证。

0x001abc是0x000abc的子集,只要子集足够多总有一个会满足目标值。

当有一个矿工挖出一个满足目标值之后就可以获得挖矿收益,而挖矿就可以根据矿工分片多少来获得收益。

矿工收益 = 挖矿收益 / 挖到的分片数量但是现在还有一个问题没有解决,单个矿工挖到目标值以后如果私吞收益,私自广播区块怎么办?矿池有集中托管式的,也有分布式的。 集中托管式矿池,矿工可以把挖矿的机器托管给矿池,由矿池统一操作维护,只需要支付一些电费管理费即可,这样就避免了私自广播。 分布式矿池,矿工将机器自行管理,通过矿池协议从网络连接矿池即可,这样就会出现私自广播的可能。回顾一下铸币交易coinbase,可以看到有output字段,UTXO模型中币的来源都是上一个交易的output,所以可以把铸币交易的output字段设置为矿池的地址,然后随机生成一些coinbase data的填充后生成区块头的默克尔树,最后发由矿工去尝试目标值。通过这样的方式,即使矿工找到满足条件的哈希值,铸币交易的地址也是矿池的地址,私自广播区块没有任何收益,如果调整铸币交易的地址,这样又回到了独立挖矿的场景。全网算力如果要获知全网算力,可以通过出块时间,挖矿难度大致反推出全网算力。区块确认当一个区块产生之后,它不是立即可信的,网络上的节点总是相信最长的区块链,当一条交易记录被打包进一个区块之后,就有了一个确认,而这个区块所在的链后面被再加入一个区块,就是第二个确认,如此下去,一个交易有了6个确认,我们就认为这个交易已经确定了,会被永远记录在区块链中。 为什么是6个确认呢?因为每一个确认就是一个挖矿过程,需要大量的工作量证明,因此,这6个区块被同一个矿工创建的可能性微乎其微(可以说是不可能),因此矿工伪造交易也基本不可能。由于比特币的区块平均产生时间是10分钟,所以一个交易要1小时左右才能保证成功(最快),不过也不是所有的系统都这样认为,有些网站在接受比特币支付时,认为4个确认就可以给客户发货了,区块确认越多则越难被逆转。区块广播在区块链中,为了尽快收到其他节点的信息,节点间并不是直接传递区块信息的。 节点向附近节点发送一个Inv消息,Inv消息中包含已经被发送者(sender)接收并验证过的“交易记录的哈希”、以及“区块哈希”。接收者(receiver)收到Inv消息后,如果他还尚未从其他节点收到过相同的信息,他会发送一个getdata消息给发送者,要求得到交易记录及区块哈希包含的具体信息。此时,区块和交易记录的信息才会进行整体传递。 其中Inv消息结构如下;type MsgInv struct {

InvList []*InvVect

}

type InvVect struct {

Type InvType // Type of data

Hash chainhash.Hash // Hash of the data

}欢迎关注我的博客(qyuan.top),不定期分享一些区块链底层技术文章,博客排版要比知乎好一点(ㄟ( ▔, ▔ )ㄏ)。编辑于 2020-05-12 11:18挖矿区块链(Blockchain)比特币 (Bitcoin)​赞同 82​​11 条评论​分享​喜欢​收藏​申请转载​文章被以下专栏收录清源的区块链

百度百科-验证

百度百科-验证

比特币的工作原理 - 比特币

比特币的工作原理 - 比特币

Bitcoin.org 是一个社区支持的社区,我们十分感谢任何捐助。这些捐助会用于改进网站。

捐助

Bitcoin.org 需要你的帮助!

×

捐助Bitcoin.org

使用下方二维码或地址

3E8ociqZa9mZUSwGdSmAEMAoAxBK3FNDcd

$5.00

(... BTC)

$25.00

(... BTC)

$50.00

(... BTC)

介绍

个人

商家

开发者

入门指南

工作原理

White paper

资源

资源

兑换

社区

词汇表

活动

比特币核心

创新

参与

支持比特币

购买比特币

开发

常见问题

简体中文

Bahasa Indonesia

Català

Dansk

Deutsch

English

Español

Français

Italiano

Magyar

Nederlands

Polski

Português Brasil

Română

Slovenščina

Srpski

Svenska

Türkçe

Ελληνικά

български

Русский

Українська

Հայերեն

العربية

فارسی

עברית

हिन्दी

한국어

ខ្មែរ

日本語

简体中文

繁體中文

Bahasa Indonesia

Català

Dansk

Deutsch

English

Español

Français

Italiano

Magyar

Nederlands

Polski

Português Brasil

Română

Slovenščina

Srpski

Svenska

Türkçe

Ελληνικά

български

Русский

Українська

Հայերեն

العربية

فارسی

עברית

हिन्दी

한국어

ខ្មែរ

日本語

简体中文

繁體中文

Language: zh_CN

比特币的工作原理

这是个经常引起混淆的问题,下面是个简明扼要的解释!

新用户所需了解的基本知识

作为新用户,你可以开始使用比特币,而不需要理解其中的技术细节。一旦你在电脑或手机上安装一个比特币钱包,它会生成你的第一个比特币地址,并且在你需要的任何时候都可以生成更多的地址。你可以将你的地址告诉你的朋友们,他们便能够通过这个地址向你支付比特币,反之亦然。事实上,这跟电子邮件的运作方式是非常相似的,除了一个比特币地址应该只被使用一次。

余额 - 区块链

比特币区块链是整个比特币网络所依赖的公共共享总帐。所有确认的交易均包含在区块链中。这样比特币钱包可以计算出可用余额,并核实新的交易中消费方花费的确实是自己的比特币。密码学确保了区块链的完整性和时间顺序。

交易 - 私钥

一笔交易是指包含在区块链里的比特币钱包之间的价值转移。 比特币钱包保存着一份称作私钥或种子的保密数据用来为交易签名,即提供数学证据证明这些交易来自钱包的拥有者。这个 签名也确保交易发生后不会被任何人修改。所有的交易在用户之间广播,通常在接下来的10-20分钟内通过一个称作 挖矿的处理过程开始被比特币网络所确认。

处理 - 挖矿

挖矿是个将待确认的交易数据包含到区块链中,从而完成对这些交易进行确认的分布式共识系统。通过挖矿,可以强制性保证块链中的数据按时间顺序存储,保持比特币网络的中立性,且允许比特币网络上不同的计算机对系统状态达成一致。交易要获得确认,必须要被打包到一个符合非常严格的密码学规则的区块中,并通过比特币网络进行验证。这些规则可以防止对已有块的修改,因为一旦有改动,之后所有的块都将失效。挖矿的难度和中彩票相当,没人可以轻易地、连续地将新块加入到块链中。因此,没有集体和个人可以控制块链中包含什么样的内容或者替换掉块链中的部分内容以达到撤销他们交易的目的。

深入探究

这只是一份比特币的概要。如果你需要更多的细节,你可以阅读描述了比特币设计的最初的论文,开发者文档,或者查看比特币百科。

支持Bitcoin.org:

捐助

3E8ociqZa9mZUSwGdSmAEMAoAxBK3FNDcd

介绍:

个人

商家

开发者

入门指南

工作原理

注意事项

White paper

资源:

资源

兑换

社区

词汇表

活动

比特币核心

参与:

支持比特币

开发

其他:

法律

Privacy Policy

新闻媒体

关于bitcoin.org

Blog

© Bitcoin Project 2009-2024 基于MIT协议授权发布

Network Status

简体中文

Bahasa Indonesia

Català

Dansk

Deutsch

English

Español

Français

Italiano

Magyar

Nederlands

Polski

Português Brasil

Română

Slovenščina

Srpski

Svenska

Türkçe

Ελληνικά

български

Русский

Українська

Հայերեն

العربية

فارسی

עברית

हिन्दी

한국어

ខ្មែរ

日本語

简体中文

繁體中文

Bahasa Indonesia

Català

Dansk

Deutsch

English

Español

Français

Italiano

Magyar

Nederlands

Polski

Português Brasil

Română

Slovenščina

Srpski

Svenska

Türkçe

Ελληνικά

български

Русский

Українська

Հայերեն

العربية

فارسی

עברית

हिन्दी

한국어

ខ្មែរ

日本語

简体中文

繁體中文

zh_CN

比特币入门教程 - 阮一峰的网络日志

比特币入门教程 - 阮一峰的网络日志

阮一峰的网络日志 » 首页 » 档案

上一篇:区块链入门教程    

下一篇:加密货币的本质    

分类:

理解计算机

⇐ 

 ⇒

比特币入门教程

作者: 阮一峰

日期: 2018年1月 4日

比特币(bitcoin)诞生于2008年的一篇论文。

一个署名为中本聪的人,提出了革命性的构想:让我们创造一种不受政府或其他任何人控制的货币!这个想法堪称疯狂:一串数字,背后没有任何资产支持,也没有任何人负责,你把它当作钱付给对方,怎么会有人愿意接受?

但是,狂想居然变成了现实。随后的几年,在全世界无数爱好者的支持下,比特币网络运行起来了,越来越多的人和资本参与,星星之火,终成燎原。刚刚过去的2017年,比特币迎来了爆发式的增长,从年初的1000美元,最高涨到了2万美元,全世界都为之震动,上到政府,下到普通百姓都在关注。事实就是比特币已经并将继续改变世界。

新闻媒体往往只关注它的火爆表现,忽视或者无法回答一些基本的问题。

比特币的原理是什么?

为什么这个无人管理的体系可以成功运作?

比特币交易的流程是怎么回事?

它与区块链又是什么关系?

下面,我尝试回答这些问题,希望帮助大家理解比特币。抛开技术细节,还是很容易解释的。

有一点说明,本文只讨论技术问题,不涉及如何投资比特币,更不会预测价格走势。事实上,我也不知道,如果我知道怎么发财,可能就不会在这里写博客了。

一、非对称加密

首先,理解比特币,必须理解非对称加密。

你可能听说过这个词,所谓非对称加密,其实很简单,就是加密和解密需要两把钥匙:一把公钥和一把私钥。

公钥是公开的,任何人都可以获取。私钥是保密的,只有拥有者才能使用。他人使用你的公钥加密信息,然后发送给你,你用私钥解密,取出信息。反过来,你也可以用私钥加密信息,别人用你的公钥解开,从而证明这个信息确实是你发出的,且未被篡改,这叫做数字签名(更详细的介绍请看《什么是数字签名》)。

现在请设想,如果公钥加密的不是普通的信息,而是加密了一笔钱,发送给你,这会怎样?

首先,你能解开加密包,取出里面的钱,因为私钥在你手里。其次,别人偷不走这笔钱,因为他们没有你的私钥。因此,支付可以成功。

这就是比特币(以及其他数字货币)的原理:非对称加密保证了支付的可靠性。

由于支付的钱必须通过私钥取出,所以你是谁并不重要,重要的是谁拥有私钥。只有拥有了私钥,才能取出支付给你的钱。(事实上,真实的交易流程稍有不同,私钥保证的不是取出支付给你的钱,而是保证只有你能把这些属于你的钱支付出去,详见后文。)

二、比特币钱包

对于比特币来说,钱不是支付给个人的,而是支付给某一把私钥。这就是交易匿名性的根本原因,因为没有人知道,那些私钥背后的主人是谁。

所以,比特币交易的第一件事,就是你必须拥有自己的公钥和私钥。

你去网上那些比特币交易所开户,它们会让你首先生成一个比特币钱包(wallet)。这个钱包不是用来存放比特币,而是存放你的公钥和私钥。软件会帮你生成这两把钥匙,然后放在钱包里面。

根据协议,公钥的长度是512位。这个长度不太方便传播,因此协议又规定,要为公钥生成一个160位的指纹。所谓指纹,就是一个比较短的、易于传播的哈希值。160位是二进制,写成十六进制,大约是26到35个字符,比如 1BvBMSEYstWetqTFn5Au4m4GFg7xJaNVN2。这个字符串就叫做钱包的地址,它是唯一的,即每个钱包的地址肯定都是不一样的。

你向别人收钱时,只要告诉对方你的钱包地址即可,对方向这个地址付款。由于你是这个地址的拥有者,所以你会收到这笔钱。

由于你是否拥有某个钱包地址,是由私钥证明的(具体的证明方法稍后介绍),所以一定要保护好私钥。这是极其重要的,如果你的私钥被偷了,你的比特币也就等于没了,因为他人可以冒用你的身份了,把钱包里面的钱都转走。

同样的,你向他人支付比特币,千万不能写错他人的钱包地址,否则你的比特币就支付到了另一个不同的人了。

三、交易过程

下面,我把整个流程串起来,看看比特币如何完成一笔交易。

一笔交易就是一个地址的比特币,转移到另一个地址。由于比特币的交易记录全部都是公开的,哪个地址拥有多少比特币,都是可以查到的。因此,支付方是否拥有足够的比特币,完成这笔交易,这是可以轻易验证的。

问题出在怎么防止其他人,冒用你的名义申报交易。举例来说,有人申报了一笔交易:地址 A 向地址 B 支付10个比特币。我怎么知道这个申报是真的,申报人就是地址 A 的主人?

比特币协议规定,申报交易的时候,除了交易金额,转出比特币的一方还必须提供以下数据。

上一笔交易的 Hash(你从哪里得到这些比特币)

本次交易双方的地址

支付方的公钥

支付方的私钥生成的数字签名

验证这笔交易是否属实,需要三步。

第一步,找到上一笔交易,确认支付方的比特币来源。

第二步,算出支付方公钥的指纹,确认与支付方的地址一致,从而保证公钥属实。

第三步,使用公钥去解开数字签名,保证私钥属实。

经过上面三步,就可以认定这笔交易是真实的。

四、交易确认与区块链

确认交易的真实性以后,交易还不算完成。交易数据必须写入数据库,才算成立,对方才能真正收到钱。

比特币使用的是一种特殊的数据库,叫做区块链(blockchain),详细的介绍请看《区块链入门教程》。本文只讨论交易如何写入区块链。

首先,所有的交易数据都会传送到矿工那里。矿工负责把这些交易写入区块链。

根据比特币协议,一个区块的大小最大是 1MB,而一笔交易大概是500字节左右,因此一个区块最多可以包含2000多笔交易。矿工负责把这2000多笔交易打包在一起,组成一个区块,然后计算这个区块的哈希。

计算哈希的过程叫做采矿,这需要大量的计算。矿工之间也在竞争,谁先算出哈希,谁就能第一个添加新区块进入区块链,从而享受这个区块的全部收益,而其他矿工将一无所获。

一笔交易一旦写入了区块链,就无法反悔了。这里需要建立一个观念:比特币不存放在钱包或其他别的地方,而是只存在于区块链上面。区块链记载了你参与的每一笔交易,你得到过多少比特币,你又支付了多少比特币,因此可以算出来你拥有多少资产。

五、矿工的收益

交易的确认离不开矿工。为什么有人愿意做矿工呢?

比特币协议规定,挖到新区块的矿工将获得奖励,一开始(2008年)是50个比特币,然后每4年减半,目前(2018年)是12.5个比特币。这也是比特币的供给增加机制,流通中新增的比特币都是这样诞生的。

你可能看出来了,每4年奖励减半,由于比特币可以分割到小数点后八位,那么到了2140年,矿工将得不到任何奖励,比特币的数量也将停止增加。这时,矿工的收益就完全依靠交易手续费了。

所谓交易手续费,就是矿工可以从每笔交易抽成,具体的金额由支付方自愿决定。你完全可以一毛不拔,一分钱也不给矿工,但是那样的话,你的交易就会没人处理,迟迟无法写入区块链,得到确认。矿工们总是优先处理手续费最高的交易。

目前由于交易数量猛增,手续费已经水涨船高,一个区块2000多笔交易的手续费总额可以达到3~10个比特币。如果你的手续费给低了,很可能过了一个星期,交易还没确认。

一个区块的奖励金12.5个比特币,再加上手续费,收益是相当可观的。按照目前的价格,可以达到100万~200万人民币。想想看,运气好的话,几分钟就能挖到一个区块,拿到这样一大笔钱,怪不得人们对挖矿趋之若鹜。

六、区块的扩容

《区块链入门教程》说过,比特币协议规定,平均10分钟诞生一个区块。区块的大小只有 1MB,最多只能包含2000多笔交易。也就是说,比特币网络每10分钟,最多只能处理2000多笔交易,换算一下,就是处理速度为3~5笔/秒。

全世界的比特币交易这么多,可是区块链每秒最多只能处理5笔,这已经成为制约比特币发展的一个瓶颈。

很早就有人呼吁,改革比特币协议,提升处理速度。这件事在2017年8月有了一点眉目,当时区块链发生了一次分叉,诞生了一个新协议,称为 Bitcoin Cash(简称 BCH)。这种新货币其他方面都与比特币一致,就是每个区块的大小从 1MB 增加到了 8MB,因此处理速度提升了8倍,手续费也低得多。该协议是对原有区块链的分叉,因此当时持有比特币的人,等于一人获赠了一份同样数量的 BCH。

BCH 等于创造了一种新货币,还有人提议,原始比特币的区块大小提升到 2MB,这称为 SegWit2x 。这个建议原定于2017年11月实施,但是最后一刻由于缺乏共识,就被取消了,目前还在讨论中。

七、点对点网络

比特币是一个全世界的开放网络,只要你有服务器,就能加入这个网络,成为一个节点。每个节点都包含了整个区块链(目前大概 100多 GB),并且节点之间时刻不停地在同步信息。

当你发生了一笔支付,你所在的节点就会把这笔交易告诉另一个节点,直至传遍整个网络。矿工从网上收集各种新发生的交易,将它们打包写入区块链。一旦写入成功,

矿工所在节点的区块链,就成为最新版本,其他节点都会来复制新增的区块,保证全网的区块链都是一致的。

最后,你所在的节点也拿到了最新的区块链,从而得知你早先的那笔交易,已经写在里面了,至此交易确认成功。

八、还有一个问题

写到这里,我就介绍完了比特币的基本知识,希望你已经明白了比特币是怎么回事。但是还有一个根本的问题,我没有回答:比特币的本质到底是什么?

说到底,比特币只是区块链的一条记录,是凭空生成的,为什么可以当钱用?举例来说,矿工获得12.5个比特币的奖励,其实就是区块链有一个记录:"xxx地址获得12.5个比特币"。正是这行记录,导致该矿工获得了大笔金钱。如果区块链突然增加了一条记录,记载你的地址获得了1000个比特币,你就真的会有1000个比特币。这到底是为什么?

这篇文章已经够长了,这个问题就留到下次再谈,欢迎关注本系列的最后一篇文章《加密货币的本质》。

九、参考链接

How Bitcoin works , by Timothy B. Lee

Bitcoins the hard way: Using the raw Bitcoin protocol, by Ken Shirriff

(完)

文档信息

版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)

发表日期: 2018年1月 4日

相关文章

2022.08.02: DNS 查询原理详解

通过 DNS 查询,得到域名的 IP 地址,才能访问网站。

2022.06.03: 字节序探析:大端与小端的比较

今天谈谈一个重要的计算机概念,大家可能都听说过它,但是很少深究,那就是字节序(Endianness)。

2022.02.04: 万兆家庭网络的时代

最近,我想将家里的网络设备,都升级到千兆。

2021.12.07: 为什么 Web3 与区块链有关

互联网迄今有两个阶段:Web 1.0 和 Web 2.0。

留言(162条)

Jaxure

说:

哈哈 最近阮老师集中研究这一块

2018年1月 4日 08:59

| #

| 引用

L.Rain

说:

引用Jaxure的发言:

哈哈 最近阮老师集中研究这一块

阮老师要出手了,哈哈

2018年1月 4日 09:25

| #

| 引用

binary

说:

"这个钱包不是用来存放比特币,而是存放你的公钥和私钥。软件会帮你生成这两把私钥,然后放在钱包里面。"

应该是生成这两把密钥

2018年1月 4日 09:34

| #

| 引用

zyg

说:

传说的去中心化呢~ 到头来还是矿工中心化~ 算力决定一切 哈哈~

2018年1月 4日 10:01

| #

| 引用

温国兵

说:

纠正一个错误

“你可能看出来了,每 4 年奖励减半,那么到了 2140 年,矿工将得不到任何奖励,比特币的数量也将停止增加。这时,矿工的收益就完全依靠交易手续费了。”

这里应该是 2040 年。

2018年1月 4日 10:07

| #

| 引用

机器猫电路改造

说:

关于第八个问题,不知道阮老师后续文章会不会谈到"比特币的伦理"问题;

比如比特币的出现对现阶段资源分配方式的影响?

如何面对和传统货币一样会带来犯罪问题? 对资源分配方式的处理问题?

另外,不知道阮老师,有没有机会谈一谈 World Community Grid,BOIN 等等这些分布计算? 很好奇,数字货币有没有可能和这些分布计算实现更科学的结合? 而不是像矿工们那样浪费资源.

2018年1月 4日 10:21

| #

| 引用

HiTimor

说:

好好好,入门篇。

2018年1月 4日 10:27

| #

| 引用

Mike

说:

比特币技术复杂、普通人不能很好的理解。比特币没有金融监管、容易产生金融犯罪。前段时间的黑客勒索无不采用比特币技术。所以个人并不看好这一块的技术。

2018年1月 4日 10:29

| #

| 引用

bravist

说:

写的真是通俗易懂,读了好多比特币的文章,这个原理解释地道

2018年1月 4日 10:35

| #

| 引用

小白

说:

有点疑惑,交易平台肯定需要维护 哪个比特币钱包是哪个用户的吧,而比特币钱包里包含公钥私钥,这样交易平台不就可以知道比特币是哪个用户的么

2018年1月 4日 11:37

| #

| 引用

TONYHEAD

说:

有若干疑问:

一个100GB的数据库就可以记录到比特币创立至今的所有交易往来?

"2000笔交易的区块手续费是3-10个比特币",这个交易成本太高了,2000笔流水,大一点的小卖部都不止这个数,难不成按目前的交易成本, 比特币只适合做大额资金的交易?

2018年1月 4日 11:59

| #

| 引用

问天玄铁

说:

比特币目前的很多问题(交易慢,账本大,算力集中)导致比特币一定不是数字货币的最终形态。我们不妨来想想更接近未来形态的数字货币协议和算法,就能让比特币变得不值钱,而且能让自己再次站在财富大门口。

2018年1月 4日 14:13

| #

| 引用

tc

说:

感谢科普了,通俗易懂。

不过有个疑问,“当矿工将得不到任何奖励,比特币的数量也将停止增加。这时,矿工的收益就完全依靠交易手续费了。”

这样感觉货币流通会很受影响啊,不知道在后面当数字货币的文章中会不会说明

2018年1月 4日 14:47

| #

| 引用

张庆华

说:

最近也在看这块,感觉非常有前途

2018年1月 4日 14:56

| #

| 引用

陈辉

说:

还是阮老师写的通俗易懂,能否一直同步到微信公众号里面。

2018年1月 4日 15:27

| #

| 引用

杨高超

说:

@TONYHEAD:

这个应该这么理解,比特币的交易不是以一个比特币为最小单位的,他可以无穷分割下去,例如一次交易交易了0.000001个比特币。

2018年1月 4日 15:31

| #

| 引用

leter

说:

如果我知道怎么发财,可能就不会在这里写博客了。说的很接地气。。哈哈

2018年1月 4日 15:39

| #

| 引用

没事扯扯蛋

说:

谁能说明比特币怎样和实际金钱或实物挂钩的???

如果不能挂钩,比特币就是个数字游戏,没有价值。

如果挂钩了,那说明比特币背后还是有势力(中心)支持的,否则怎么可能风生水起?

2018年1月 4日 16:08

| #

| 引用

BitcoinFan

说:

您最近有关注币圈么?感觉遗漏了很重要的东西:

1.挖矿赚币只是为了激励矿工,这个不是关键。挖矿的本质是达到分布式共识的手段,或者说,就是随机选一个人来记账,防止作弊,这个才是关键。

比特币安全的一个假设就是没有单个的人/组织能掌控50%以上的算力。

比特币的共识规则规定,大家都认最长链,更准确地说,是积累工作量最多的链。

矿工必须积极地接收别人挖到的新区块、在上面追加自己挖出的区块,并把自己挖出的区块积极广播出去,否则,他的链会被孤立,他就白干了。(可想而知,超过50%的算力,就不用鸟这些了)

2.扩容之争吵了几年了,现在BTC的开发者不愿意提高这个1MB的限制,是因为区块扩大后,会加剧比特币的中心化,这样的话,最后我们还不如直接用支付宝、VISA这样的中心化服务。

有人甚至认为比特币已经失去去中心化的本质,因为中国的大矿池已经垄断了算力,也就垄断了记账权。

有了SegWit之后,支撑交易量堪比VISA的闪电网络,还有其他技术能减少区块占用。而且,还有RSK等侧链技术可以期待。

Bitcoin Cash主要是中国矿工群体支持的,虽说未来扩大区块大小是不可避免的,但是Bitcoin Cash除了扩大区块大小,技术上并没有什么优势,它的宣传者还四处混淆视听,宣称只有自己才是真正的比特币。

闪电网络比较复杂,软件开发了几年,最近才基本成型,还在测试中。不过,也确实不能指望它能解决所有问题,因为闪电网络是为微支付设计的,支付通道的容量是有限的,大额交易可能还是直接走主链交易比较方便。

2018年1月 4日 16:37

| #

| 引用

BitcoinFan

说:

引用tc的发言:

感谢科普了,通俗易懂。

不过有个疑问,“当矿工将得不到任何奖励,比特币的数量也将停止增加。这时,矿工的收益就完全依靠交易手续费了。”

这样感觉货币流通会很受影响啊,不知道在后面当数字货币的文章中会不会说明

有人说最后手续费会占到交易额的5%,也有人认为用户花钱养矿工是不值得的,既浪费电,又不能消除被矿工攻击的风险。不如直接换共识机制,把工作证明(PoW)换掉,换成权益证明(PoS),大体上是谁持币多谁更有记账权,相信持币人不会做伤害体系利益的事情,否则他自己的利益会大大受损。

Peercoin算PoS的始祖,不过有学者指出它有漏洞,受到nothing at stake攻击的威胁;以太坊已经在测试PoS机制;还有Cardano,使用的是Ouroboros这个经过学术界同行评议的PoS机制。

2018年1月 4日 16:46

| #

| 引用

BitcoinFan

说:

引用TONYHEAD的发言:

有若干疑问:

一个100GB的数据库就可以记录到比特币创立至今的所有交易往来?

"2000笔交易的区块手续费是3-10个比特币",这个交易成本太高了,2000笔流水,大一点的小卖部都不止这个数,难不成按目前的交易成本, 比特币只适合做大额资金的交易?

现在已经有170GB了。

您怀疑比特币的交易量极为有限——确实是这样!比特币的交易容量小到“可笑”的程度。按照10分钟1MB来算,其实只相当于每秒7笔交易。

虽说可以把多笔交易拼成一个来节省空间,但这么做的效果是有限的。

对于交易所从1个地址提币给N个人这种情况,把多笔交易拼起来确实可以显著地节省空间,但是,这些币最终还是要再被它们的主人花出去,这个时候仍然需要消耗主链空间。

要理解具体情况,您可以去查一查比特币的交易格式,包括UTXO是什么。

我也可以大概给您描述一下:比特币的交易,由“输入”和“输出”两部分组成。

每一笔交易,都相当于把“输入”的币熔毁,重新铸造成“输出”中指定的金额。(其中输出金额需要小于等于输入,少的那部分作为付给矿工的手续费,计入coinbase交易)

所以,每个比特币地址上的余额都可以看作是通过从2009年“创世”开始的所有交易记录推算出来的。

“输入”部分包括数字签名(也就是“见证”部分),数据量一般比较大。

虽然扩大区块大小就可以提高交易量,但这样只是线性扩容,不能指数级地提升容量。

中国矿工群体和少数开发者认为,扩大区块容量并不会让比特币中心化,但是多数人(尤其是国外的社区)都不认同这种说法,目前排前几名的矿池已经把全网算力差不多都垄断了:https://btc.com/stats/pool。

多数开发者认为小额交易不能用宝贵的主链空间完成,需要放在主链之外,比如闪电网络,还有RSK等侧链。

还可以看看Bitcoin Core官方写的FAQ:https://bitcoincore.org/zh_CN/2015/12/21/%E7%B3%BB%E7%BB%9F%E6%89%A9%E5%B1%95%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98%E8%A7%A3%E7%AD%94/

2018年1月 4日 17:04

| #

| 引用

ixx

说:

引用小白的发言:

有点疑惑,交易平台肯定需要维护 哪个比特币钱包是哪个用户的吧,而比特币钱包里包含公钥私钥,这样交易平台不就可以知道比特币是哪个用户的么

交易平台提供一个钱包地址 你往里充钱并提供交易记录就可以了 跟你用银行转账类似

平台不会要所有人的钱包(要你也不会给的。。。)需要提币的时候 提供给平台你的钱包地址 就可以转到你的钱包里了

2018年1月 4日 18:01

| #

| 引用

ixx

说:

引用没事扯扯蛋的发言:

谁能说明比特币怎样和实际金钱或实物挂钩的???

如果不能挂钩,比特币就是个数字游戏,没有价值。

如果挂钩了,那说明比特币背后还是有势力(中心)支持的,否则怎么可能风生水起?

最开始有一部分人出于各种目的(收藏,或是炒作),允许你买他们的东西使用比特币支付(最开始买个比萨要50比特币。。。。现在想想。。。)慢慢的,越来越多的人接受了他,才发展到现在,这东西不可做假且数量固定,就像限量版的乐高一样,越多的人支持,“收藏”越值钱

2018年1月 4日 18:10

| #

| 引用

林海草原

说:

关于比特币,之前我还真没有了解过。前两天,一位博友的博客被挂马,被挂的是一个在线挖矿代码,每次打开博客都会被执行。我当时简单了解了一下,但是网上的文章晦涩。当今天看到阮老师的博文,我才真正知道挖矿是什么。挖矿能拿到如此高的奖励,难怪有些人会通过程序漏洞给别人的网站挂马来挖矿。

2018年1月 4日 18:12

| #

| 引用

jg

说:

引用小白的发言:

有点疑惑,交易平台肯定需要维护 哪个比特币钱包是哪个用户的吧,而比特币钱包里包含公钥私钥,这样交易平台不就可以知道比特币是哪个用户的么

交易平台是知道的,有的平台还实名认证的。

不放心,可以把从平台转移到自己的钱包就好了

2018年1月 4日 18:50

| #

| 引用

BitcoinFan

说:

引用小白的发言:

有点疑惑,交易平台肯定需要维护 哪个比特币钱包是哪个用户的吧,而比特币钱包里包含公钥私钥,这样交易平台不就可以知道比特币是哪个用户的么

交易平台相当于你把比特币转给他们,然后他们给你一个欠条。

可以说中心化的交易所和比特币的理念是完全背道而驰的。

交易所也确实是各种不靠谱,宣称“被盗”之类事情发生过好多次了,还有结合期货杠杆交易操纵价格、虚发假币之类黑历史。

2018年1月 4日 19:21

| #

| 引用

BitcoinFan

说:

引用林海草原的发言:

关于比特币,之前我还真没有了解过。前两天,一位博友的博客被挂马,被挂的是一个在线挖矿代码,每次打开博客都会被执行。我当时简单了解了一下,但是网上的文章晦涩。当今天看到阮老师的博文,我才真正知道挖矿是什么。挖矿能拿到如此高的奖励,难怪有些人会通过程序漏洞给别人的网站挂马来挖矿。

比特币早就不能用电脑(CPU或GPU)挖了,连FPGA都不行了,现在都是ASIC专用芯片挖矿。详细数据可以看这个:

https://en.bitcoin.it/wiki/Mining_Hardware_Comparison

2018年1月 4日 19:23

| #

| 引用

BitcoinFan

说:

引用jg的发言:

交易平台是知道的,有的平台还实名认证的。

不放心,可以把从平台转移到自己的钱包就好了

比特币的交易记录是一环扣一环,可以追溯的,而且完全公开(随便找个区块浏览器就可以方便地查,开一个比特币全节点也可以直接下载区块链数据)。如果不用混币之类的手段来切断追踪,从实名制交易所转出去还是可以被跟踪的。

2018年1月 4日 19:26

| #

| 引用

BitcoinFan

说:

引用林海草原的发言:

关于比特币,之前我还真没有了解过。前两天,一位博友的博客被挂马,被挂的是一个在线挖矿代码,每次打开博客都会被执行。我当时简单了解了一下,但是网上的文章晦涩。当今天看到阮老师的博文,我才真正知道挖矿是什么。挖矿能拿到如此高的奖励,难怪有些人会通过程序漏洞给别人的网站挂马来挖矿。

现在这些“挖矿木马”挖的都是Monero之类山寨币,它们换掉了比特币的双SHA256工作证明算法,换成对ASIC极不友好的CryptoNight等,这样CPU或GPU挖矿才有可能,否则就被ASIC的能效虐翻了,直接亏本出局。

山寨币一般也都在技术上有创新和改进,比如Monero,已经全网启用RingCT,交易都是机密的,不像比特币那样全部公开透明、可追踪。

2018年1月 4日 19:29

| #

| 引用

ljt2k

说:

对于比特币来说,钱不是支付给个人的,而是支付给某一把私钥。

这里应该是支付给某一把公钥

2018年1月 5日 14:07

| #

| 引用

两只羊

说:

货币的由来是人民生产出来充当流通的东西。

这个是怎么来的,炒作来的。为什么能存在,值得思量的事情。

2018年1月 5日 14:55

| #

| 引用

麻三

说:

老师,下一篇啥时候来啊

2018年1月 5日 15:45

| #

| 引用

区块链小白

说:

如果因为战争,切断了所有出口网络,是不是就变成两条比特链了?

2018年1月 5日 17:54

| #

| 引用

H-u-a-n

说:

写的确实简单易懂,阮老师,受教了,Thanks♪(・ω・)ノ

2018年1月 6日 11:38

| #

| 引用

Dong

说:

有个疑问求解答:

一块区块链只能存2000笔交易,2040年就挖不到新的区块链,但交易是继续增加的,那么区块链用完了怎么办呢?

2018年1月 6日 11:47

| #

| 引用

Ellie Ren

说:

赞 以后可以follow 看你的博客了

2018年1月 6日 11:55

| #

| 引用

xunzhang

说:

如果10分钟内写不满1MB记录,如何处理

2018年1月 6日 15:12

| #

| 引用

Asid

说:

有那个比特币钱包能用的?搜了几个网让,还有ANDORID/IOS的APP,不敢用啊。怕有后门。

2018年1月 6日 17:09

| #

| 引用

方减

说:

浅显易懂,非常好的科普入门文章!期待下一篇

2018年1月 6日 20:30

| #

| 引用

zero

说:

引用小白的发言:

有点疑惑,交易平台肯定需要维护 哪个比特币钱包是哪个用户的吧,而比特币钱包里包含公钥私钥,这样交易平台不就可以知道比特币是哪个用户的么

交易所才是真正密钥的掌控者,用户实际上是不掌控密钥的。

2018年1月 7日 02:09

| #

| 引用

哈哈

说:

引用jg的发言:

交易平台是知道的,有的平台还实名认证的。

不放心,可以把从平台转移到自己的钱包就好了

这点倒是真的,哈哈哈,我做个这样的平台

2018年1月 8日 09:58

| #

| 引用

max210

说:

期待下一篇

2018年1月 8日 11:16

| #

| 引用

吕海超

说:

连着看完区块链和比特币,特别期待你写《数字货币的本质》,这几天每天都会登上来看一下有没有更新。。。

2018年1月 8日 14:20

| #

| 引用

杨峰

说:

很好奇,比特币是怎么开始的?有这个想法是因为,采矿是产生比特币的“造血系统”,而造血的过程是写入交易记录,而最初是没有交易记录给人来写的。

2018年1月 8日 15:50

| #

| 引用

BitcoinFan

说:

引用Dong的发言:

有个疑问求解答:

一块区块链只能存2000笔交易,2040年就挖不到新的区块链,但交易是继续增加的,那么区块链用完了怎么办呢?

你混淆了比特币发行和挖矿机制。

比特币发行是以区块补贴的形式发放,四年一减半,2140年区块补贴才会归零,但十几年后区块补贴就接近归零了。

但是,矿工还能收到手续费收入。只要矿工有收入,他们就会继续挖。

而且,比特币的难度调整机制让它保持大约10分钟挖出一个区块,无论挖矿的算力是多还是少都是这样。挖矿的算力多了,难度就上升、出块(先加快再)放缓,反之难度下降、出块(先放缓再)加快。

2018年1月 8日 19:05

| #

| 引用

BitcoinFan

说:

引用xunzhang的发言:

如果10分钟内写不满1MB记录,如何处理

以前一直是写不满的,写满了才有拥堵问题。

2018年1月 8日 19:06

| #

| 引用

BitcoinFan

说:

引用杨峰的发言:

很好奇,比特币是怎么开始的?有这个想法是因为,采矿是产生比特币的“造血系统”,而造血的过程是写入交易记录,而最初是没有交易记录给人来写的。

没人用,矿工可以打空块。

比特币最初就是中本聪一个人在那里挖。

2018年1月 8日 21:15

| #

| 引用

BitcoinFan

说:

引用Asid的发言:

有那个比特币钱包能用的?搜了几个网让,还有ANDORID/IOS的APP,不敢用啊。怕有后门。

比特币官网:https://bitcoin.org/zh_CN/

按照去中心化的精神,比特币是没有官网的,这个网站的管理员是Cobra。

一般用户推荐Electrum,最好结合硬件钱包,防止木马偷币。

比太钱包也不错,有方便的冷热钱包选择。

想折腾技术就装Bitcoin Core,不过这个是全节点,要下载一百多GB的区块链数据。

顺便说一下,现在1M区块空间已经满了,手续费比较高,转账时最好启用RBF(勾选Replacable),这样万一转账卡着了,可以直接加手续费加速确认。

2018年1月 8日 21:18

| #

| 引用

BitcoinFan

说:

SegWit2x的目的其实是把Core踢出去,而不是扩容。但实际上支持Core的人还是不少的,Core不愿意被“打脸”,这个2x还能有多少支持率呢……

而且,实际上2x这个项目搞出来的btc1软件(从Core fork出来的)很挫,最后还爆出off-by-one这种低级bug,参与者大概本来就是同床异梦吧。

2018年1月 9日 07:30

| #

| 引用

Mark

说:

引用BitcoinFan的发言:

您最近有关注币圈么?感觉遗漏了很重要的东西:

1.挖矿赚币只是为了激励矿工,这个不是关键。挖矿的本质是达到分布式共识的手段,或者说,就是随机选一个人来记账,防止作弊,这个才是关键。

比特币安全的一个假设就是没有单个的人/组织能掌控50%以上的算力。

比特币的共识规则规定,大家都认最长链,更准确地说,是积累工作量最多的链。

矿工必须积极地接收别人挖到的新区块、在上面追加自己挖出的区块,并把自己挖出的区块积极广播出去,否则,他的链会被孤立,他就白干了。(可想而知,超过50%的算力,就不用鸟这些了)

2.扩容之争吵了几年了,现在BTC的开发者不愿意提高这个1MB的限制,是因为区块扩大后,会加剧比特币的中心化,这样的话,最后我们还不如直接用支付宝、VISA这样的中心化服务。

有人甚至认为比特币已经失去去中心化的本质,因为中国的大矿池已经垄断了算力,也就垄断了记账权。

有了SegWit之后,支撑交易量堪比VISA的闪电网络,还有其他技术能减少区块占用。而且,还有RSK等侧链技术可以期待。

Bitcoin Cash主要是中国矿工群体支持的,虽说未来扩大区块大小是不可避免的,但是Bitcoin Cash除了扩大区块大小,技术上并没有什么优势,它的宣传者还四处混淆视听,宣称只有自己才是真正的比特币。

闪电网络比较复杂,软件开发了几年,最近才基本成型,还在测试中。不过,也确实不能指望它能解决所有问题,因为闪电网络是为微支付设计的,支付通道的容量是有限的,大额交易可能还是直接走主链交易比较方便。

想问 BitcoinFan 一个问题,挖矿的成功与否是不是取决于计算机计算力的大小,假设有人的或者某个组织的计算机计算力非常强,那不代表每次的挖矿都是他们成功了?这不就有可能超过50%以上的算力了吗

2018年1月 9日 11:35

| #

| 引用

henry

说:

交易所才是中心化的东西!我猜你在交易所买卖比特币,真正的比特币有可能是交易所帮你代持!就像互联网彩票一样!

2018年1月 9日 11:42

| #

| 引用

重本聪

说:

看了一片文章 都是深入浅出的讲这个技术 能看懂一半吧 可是作为货币 货币啊 它的基础在哪 目前看就是谁的矿机多谁厉害啊 比特币个数是定的 所谓涨跌 都是炒出来的 这不是货币的基本价值啊 还有 这玩意不唯一 现在有起码数十种 加密货币 这肯定不算那些传销用货币 这些货币号称都是更牛逼的 更合理的 发明的人更吊的 说道发明人 这些中本聪就是因为聪明发明了这么一套理论? 他定的各种协议 规矩大家就 必须遵守 就是因为互联网精神就是公平公正?这是不是太乌托邦了 那以后有没有大本聪 巨本聪 利用这些干坏事呢

2018年1月 9日 11:48

| #

| 引用

重本聪

说:

引用Mark的发言:

想问 BitcoinFan一个问题,挖矿的成功与否是不是取决于计算机计算力的大小,假设有人的或者某个组织的计算机计算力非常强,那不代表每次的挖矿都是他们成功了?这不就有可能超过50%以上的算力了吗

有个机制 算出来的时间并不固定 如果一段时间内太多了 就会增加难度 太少了 就会减小 大概这么个意思 算力是基础 但不是一定就最先算出来 但矿机多 肯定没错 你看看网上那些一片矿机的照片

2018年1月 9日 11:52

| #

| 引用

sms

说:

所以说,下个钱包app就分了一对key和一个地址?没有交易的话这个地址有效么?不怎么懂

2018年1月 9日 14:47

| #

| 引用

凡浩浩

说:

关注的博客很久了,看了你很多文章,佩服您的才华,敬佩您的坚持,感谢您的分享,很想问您一个问题,您最初热爱文学,后来获得经济学博士学历,成为大学教授,现在又是计算机工程师,在每一次选择的时候,您迷茫过吗?什么才您的热爱,您未来还会选择做别的吗?

2018年1月 9日 15:35

| #

| 引用

小米

说:

有一个地方不明白,需要请教博主。

如果我是矿工,挖矿时在当前交易记录中擅自增加一条“我获得1000比特币”的记录,然后很幸运这块矿被我挖到,交易记录被记录和通报全网了。

那是不是就能作弊了?

2018年1月 9日 16:30

| #

| 引用

王挺

说:

引用BitcoinFan的发言:

你混淆了比特币发行和挖矿机制。

比特币发行是以区块补贴的形式发放,四年一减半,2140年区块补贴才会归零,但十几年后区块补贴就接近归零了。

但是,矿工还能收到手续费收入。只要矿工有收入,他们就会继续挖。

而且,比特币的难度调整机制让它保持大约10分钟挖出一个区块,无论挖矿的算力是多还是少都是这样。挖矿的算力多了,难度就上升、出块(先加快再)放缓,反之难度下降、出块(先放缓再)加快。

我也有此疑问,但感觉这个回答没答到点上。

交易记录是必须要附在新的区块里,再写入主区块链才能生效的。而2040年之后,已经没机会“算出”新的区块了,还怎么附加交易记录呢?

2018年1月 9日 20:00

| #

| 引用

小米

说:

引用王挺的发言:

我也有此疑问,但感觉这个回答没答到点上。

交易记录是必须要附在新的区块里,再写入主区块链才能生效的。而2040年之后,已经没机会“算出”新的区块了,还怎么附加交易记录呢?

你没有分清楚生成区块与取得比特币之间的区别。区块是永远可以生成的,只要对上一区块的头文件进行hash运算并符合难度要求即可。但生成区块后,能否得到比特币奖励,是不一定的,固定收益是逐年递减的。

2018年1月10日 14:24

| #

| 引用

davino

说:

有几个疑问:

1. 交易平台是不是本身自己就是矿工?

2. 如果交易平台是矿工,在上面平台上用户的交易是实时的,但交易平台如果成功把记录放到链上,是不是等于你和用户没有进行任何操作?

3. 火币现在能进行P2P的交易。如果火币没有挖到矿,不是等于买方白给钱了?

2018年1月10日 16:10

| #

| 引用

齐宁

说:

我在想,中本聪拥有多少比特币,现在财富有多少了...

2018年1月10日 16:54

| #

| 引用

YANG

说:

如果我说这东西是骗人的,会不会有人来教育我?

区块链本质不谈,就说普通用户层面。

1. 普通人使用比特币的最大理由是什么?

2. 为什么要去挖矿?货币不是拿来用的么,为啥大部分人不去使用它。

3. 根据文中所写,在极端情况下一笔交易可能不会被确认,或者很长时间才能被记录下来。人们使用这种东西图了个啥?

4. 为什么要相信比特币组织,而不相信现有的货币发行组织?

2018年1月11日 10:47

| #

| 引用

FTY

说:

个人认知太浅,无非是浪费世界资源。与权贵争,成王败寇而已。

2018年1月11日 11:16

| #

| 引用

张鹏

说:

1,打包是谁做的? 旷工如何判断打包没有造假?

2,一个打包要2000条交易记录,如果当前一直不足2000条,打包会一直等待?

3,全网同步区矿链,这个效率会不会很低? 这很容易发生不一致问题。新的区块如何保证链到了最新的区块后面?

2018年1月11日 15:44

| #

| 引用

fogin

说:

引用TONYHEAD的发言:

有若干疑问:

一个100GB的数据库就可以记录到比特币创立至今的所有交易往来?

"2000笔交易的区块手续费是3-10个比特币",这个交易成本太高了,2000笔流水,大一点的小卖部都不止这个数,难不成按目前的交易成本, 比特币只适合做大额资金的交易?

连大额资金交易这个场景也做不了, 你知道这个世界上每秒发生着多少笔大额交易么。。。

2018年1月11日 16:59

| #

| 引用

forget

说:

引用小白的发言:

有点疑惑,交易平台肯定需要维护 哪个比特币钱包是哪个用户的吧,而比特币钱包里包含公钥私钥,这样交易平台不就可以知道比特币是哪个用户的么

可以这样理解:比特币是在全世界网络中交易的,而公钥和私钥是用比特币底层了一组加密算法产生的。我们想要参与其中就需要得到这组秘钥。这个交易平台(比如:比特币中国)就是帮我们来用这个加密算法产生这组秘钥的。谁都可以去要,然后平台就给你生成这对秘钥。中间应该不会记录你的任何信息。就好比:我是大街上的一个小贩,你是路人,你想买了东西了,我卖给你就是了,不需要你的任何信息。

2018年1月12日 11:22

| #

| 引用

BitcoinFan

说:

引用王挺的发言:

我也有此疑问,但感觉这个回答没答到点上。

交易记录是必须要附在新的区块里,再写入主区块链才能生效的。而2040年之后,已经没机会“算出”新的区块了,还怎么附加交易记录呢?

新的比特币目前是通过每区块12.5BTC、四年一减半的区块补贴形式发放的(也就是从coinbase交易里“凭空生成”)。

但是,挖新区块在技术上并不需要生成新的比特币。

实际上,就在现在,矿工就可以选择不拿区块补贴(目前是每区块12.5BTC)——最近就有矿池出了Bug,涉事矿工不慎“弄丢”了12.5BTC:

http://8btc.com/thread-121250-1-1.html

对于矿工来说,有利益驱动,他们才会去挖矿。没了区块奖励,他们还可以收交易手续费,这个可以成为驱动他们挖矿的激励。

但是,其实很多人都觉得这个设计不好,他们认为手续费必须占交易额的一个比例才能维持系统安全,这个比例低了,矿工作为“保安”就可能反过来“监守自盗”。而且,维持这个体系运转还要白白烧电。

所以,现在还有人在研究PoS等新共识机制,比如以太坊的Casper、Cardano的Ouroboros,试图取代目前被比特币和以太坊使用的PoW共识机制(这个我也是拾人牙慧,各位感兴趣可以去知乎关注maxdeath这位大神)

引用davino的发言:

有几个疑问:

1. 交易平台是不是本身自己就是矿工?

2. 如果交易平台是矿工,在上面平台上用户的交易是实时的,但交易平台如果成功把记录放到链上,是不是等于你和用户没有进行任何操作?

3. 火币现在能进行P2P的交易。如果火币没有挖到矿,不是等于买方白给钱了?

1.交易平台相当于一个比特币用户。平台不需要是矿工,但也有矿业兼职开交易平台,比如ViaBTC,是个矿池,他们就开过交易所。

2.没太理解你的意思。你想问交易所能不能赖账么?

现在的交易所一般都是中心化的,而且好像大多没有第三方存管,这不就坑爹了——相当于你把比特币和人民币、美元等法币转给他,他给你一个欠条,他们赖账跑路你就GG了。然后,平台上的各种交易都和比特币区块链无关,直到你提币或充币。哪怕是ViaBTC这样的也不例外。

3.P2P?你说的是OTC场外交易么?场外是把原来的集中竞价撮合去掉,大家手动发布交易信息、进行交易,平台只做信息交流和中间人担保。币一般是其他用户充的,不是平台挖的。而且这种场外交易确实不能完全保证货银对付,可能发生一方伪造法币支付凭据、忽悠对方放币等欺诈。

2018年1月13日 00:53

| #

| 引用

BitcoinFan

说:

引用张鹏的发言:

1,打包是谁做的? 旷工如何判断打包没有造假?

2,一个打包要2000条交易记录,如果当前一直不足2000条,打包会一直等待?

3,全网同步区矿链,这个效率会不会很低? 这很容易发生不一致问题。新的区块如何保证链到了最新的区块后面?

1.只有矿工有记账权:因为只有矿工有算力、能挖出满足全网的难度需求的新区块,所以只有他们能挖出合法的区块。

2.不会,矿工可以打空块(只有一条给自己发奖励的coinbase交易)。区块满了反而会有问题——拥堵、手续费高涨。

现在的区块大小上限是1MB,或者说是浮动的(因为SegWit已经激活,交易信息被分为两部分,其中“见证”这个部分字节数按照乘0.25计算)

3.效率确实很低。不一致问题,挖矿就是解决这个问题的,挖矿是一种分布式共识机制,叫工作证明。大家只认最长链有效(准确地说是积累工作量最大的链)。

2018年1月13日 00:57

| #

| 引用

BitcoinFan

说:

引用张鹏的发言:

1,打包是谁做的? 旷工如何判断打包没有造假?

2,一个打包要2000条交易记录,如果当前一直不足2000条,打包会一直等待?

3,全网同步区矿链,这个效率会不会很低? 这很容易发生不一致问题。新的区块如何保证链到了最新的区块后面?

比特币的交易记录是一环扣一环的。如果一个新节点要严格验证的话,需要从2009年的创世区块开始验证(不断地更新UTXO集合,也就是删掉“已经被原主人花掉的币”,加入“有了新主人的币”)。但是,这样跑一遍验证,只能防止抢劫比特币、无端凭空生成比特币,不能阻止双重支付。

每条交易都会被广播到整个网络。交易包含数字签名,节点也会维持一个UTXO集合,可以验证交易是否有效,强制花别人的币、花无中生有的币都是无效交易,会被丢弃。矿工会把验证过的交易加到要挖的区块里,如果hash值碰出来了,挖到了有效的区块,他们就会立刻把这个新区块广播出去,让大家检查、承认。

2018年1月13日 01:10

| #

| 引用

BitcoinFan

说:

引用forget的发言:

可以这样理解:比特币是在全世界网络中交易的,而公钥和私钥是用比特币底层了一组加密算法产生的。我们想要参与其中就需要得到这组秘钥。这个交易平台(比如:比特币中国)就是帮我们来用这个加密算法产生这组秘钥的。谁都可以去要,然后平台就给你生成这对秘钥。中间应该不会记录你的任何信息。就好比:我是大街上的一个小贩,你是路人,你想买了东西了,我卖给你就是了,不需要你的任何信息。

你的描述是错的。

密钥是任何人都可以生成的。比特币用了ECDSA这个非对称加密算法,它被用来确定一个币的控制权/所有权——只有掌握私钥的人才能花对应地址上的币。

这个和交易平台完全没关系,交易平台只是为了方便比特币法币(如人民币/美元)或比特币山寨币的交易而存在的,只有集中竞价撮合的交易所才能产生足够的流动性和市场深度——有了交易所,一秒钟你就可以卖掉/买入1.5BTC,币很多的话还能挂冰山委托慢慢买/卖,如果没有交易所,你就需要自己去场外交易平台甚至是微信群等地方,手动挂单、喊单、吃单,一大意还会被骗。

可以说交易所在比特币系统里也只是个用户而已。

2018年1月13日 01:18

| #

| 引用

BitcoinFan

说:

引用张鹏的发言:

1,打包是谁做的? 旷工如何判断打包没有造假?

2,一个打包要2000条交易记录,如果当前一直不足2000条,打包会一直等待?

3,全网同步区矿链,这个效率会不会很低? 这很容易发生不一致问题。新的区块如何保证链到了最新的区块后面?

补充一下,花“已经花掉的币”也是无效交易。

至于双重支付,需要有很大的算力(51%攻击)才能做到,原理是用大算力挖一条更长的链,在这条链里,原先转给A的币被转给了B。有了超过50%的算力,只要坚持时间够长就一定能成功;如果没有那么多算力,也有一定概率能成功,但确认数越多,成功概率越低。

51%攻击能产生的实质威胁主要就是双重支付,除此之外还有审查交易(换句话说就是冻结指定的地址)等手段。

2018年1月13日 01:22

| #

| 引用

BitcoinFan

说:

@YANG:

这个就是信仰问题了,是信政府这个中央权威,还是信比特币这套分布式共识机制呢?没法说得通啦。

有人就认为比特币最后会像“世界语”一样半死不活。

要说骗局的话,拉高出货就可以看作是欺诈,无论是股市还是币市,这种现象都存在。

2018年1月13日 01:28

| #

| 引用

BitcoinFan

说:

引用小米的发言:

有一个地方不明白,需要请教博主。

如果我是矿工,挖矿时在当前交易记录中擅自增加一条“我获得1000比特币”的记录,然后很幸运这块矿被我挖到,交易记录被记录和通报全网了。

那是不是就能作弊了?

你这么做,挖出的区块就是非法的。

只要别的节点(无论是矿工的全节点,还是不挖矿的全节点)接收到区块进行检查就会发现新生成的币量超过共识规则规定的区块奖励,然后就会拒绝承认这个区块。

2018年1月13日 01:30

| #

| 引用

BitcoinFan

说:

引用Mark的发言:

想问 BitcoinFan一个问题,挖矿的成功与否是不是取决于计算机计算力的大小,假设有人的或者某个组织的计算机计算力非常强,那不代表每次的挖矿都是他们成功了?这不就有可能超过50%以上的算力了吗

没有人掌握超过50%的算力是比特币安全的前提。

如果有人掌握的算力超过50%,他就可以不用鸟别的节点挖出的区块,然后就可以进行51%攻击——比如回滚交易记录,或者审查交易(冻结任意比特币地址)。但即使是这样,他也可能会顾忌攻击行为是否会让比特币失去价值(然后他的矿机和币就都作废了),所以即使有人手里有超过50%的算力也未必会实行51%攻击。

2018年1月13日 01:35

| #

| 引用

BitcoinFan

说:

引用温国兵的发言:

纠正一个错误

“你可能看出来了,每 4 年奖励减半,那么到了 2140 年,矿工将得不到任何奖励,比特币的数量也将停止增加。这时,矿工的收益就完全依靠交易手续费了。”

这里应该是 2040 年。

博主没错,就是2140年。

但是,四年一减半还是很快的,再减半几次,区块补贴就已经接近归零了。

2018年1月13日 01:40

| #

| 引用

BitcoinFan

说:

引用davino的发言:

有几个疑问:

1. 交易平台是不是本身自己就是矿工?

2. 如果交易平台是矿工,在上面平台上用户的交易是实时的,但交易平台如果成功把记录放到链上,是不是等于你和用户没有进行任何操作?

3. 火币现在能进行P2P的交易。如果火币没有挖到矿,不是等于买方白给钱了?

前面的回帖好像没显示出来,不知道是不是博主要审核……

交易平台只相当于一个比特币用户,往难听了说,就是你把币转给他们,他们给你一个欠条。

也有ViaBTC这样矿业兼职开交易所的,即使是这样,性质仍然不变。

2018年1月13日 01:43

| #

| 引用

BitcoinFan

说:

引用sms的发言:

所以说,下个钱包app就分了一对key和一个地址?没有交易的话这个地址有效么?不怎么懂

密钥是任何人都可以生成的,必须随机生成,否则别人就可以猜出来,这样就不安全了。

比特币用了ECDSA这个非对称加密算法,打个比方,就是认章不认人,章(密钥)其实有机器就能刻(任何人都可以用电脑生成,甚至可以用骰子来生成),只有你手里有章(私钥),能给账单盖章(数字签名),其他人手里都有完整账本,如果你想花无中生有的钱、花之前已经被花掉的钱、花别人的钱,都是无效的。

私钥可以推算出公钥,公钥经过两次哈希运算,再加上校验值、经过Base58编码就得到地址。反推在目前是不可能的,除非ECDSA、RIMEPD160、SHA256算法被破解(哈希算法本来就是不可逆的,即使“破解”,也不能由哈希值“恢复原状”,只是能找到碰撞值而已,不过目前找到碰撞也足够花别人地址上的钱了)。

现在的钱包一般都是HD的,也就是分层确定性钱包,由一个随机种子就可以推算出几乎无穷无尽的私钥,种子还可以表示为一串单词(密语),这样备份/恢复钱包就方便了,而且可以每次使用比特币都换一个地址。

2018年1月13日 01:58

| #

| 引用

BitcoinFan

说:

引用sms的发言:

所以说,下个钱包app就分了一对key和一个地址?没有交易的话这个地址有效么?不怎么懂

没用过的地址也是有效的。

博主对比特币地址的描述有误:比特币地址不是用十六进制表示公钥的哈希,而是用Base58编码表示公钥的哈希+一段校验值。用那段校验值就可以知道地址有没有错。

甚至还有找不到对应私钥的“烧币地址”(Proof of Burn),转进去的币就无法被转出来,等于被销毁了,这种地址同样是有效的。比如:合约币CounterParty提出的1CounterpartyXXXXXXXXXXXXXXXUWLpVr。生成这种地址也不难,先写出Base58地址,内容可以任意,然后算出对应的二进制数据(Base58解码),再计算对应的校验值,加到后面,然后重新Base58编码,就可以得到这种“烧币地址”。

2018年1月13日 02:17

| #

| 引用

BitcoinFan

说:

@YANG:

比特币的优点在于无国界、(伪)匿名、快速(相对电汇等传统服务)、安全等。价格波动大也确实是个问题,不过也不是完全没办法,比如用期货交易对冲(不过目前期货交易平台也是中心化的,甚至有平台亲自下海操纵市场等黑历史,而且,平台肯定要收交易手续费)。

挖矿是达成分布式共识的手段,这样才能防止双重支付。也有人觉得挖矿不好,达成共识慢、吞吐量有限、浪费能源、可能“监守自盗”,就开始想办法改进,所以现在也有其他共识机制,比如以太坊的Casper、Cardano的Ouroboros,都是PoS共识机制;还有比特股的DPoS等。

2018年1月13日 02:47

| #

| 引用

walker

说:

问两个问题啊:

1, 目前每个节点大小约为100G, 也就是说选择加入这个网络的话, 初始是要"同步"100G 的内容到硬盘上对吧?

2, 没有确认的交易, 是以什么形式传遍全网的? 从文中的描述, 好像是"纯请求, 不持久化", 那么文中又描述了有的交易因为手续费低, 可能几周都没有确认, 那么可以推断出任何交易其实都是持久化了的(并且严格遵循区域链的原因, 保证了不可篡改), 并不是单纯靠

"即时"的网络请求, 所以一个比特币节点严格意义上是有确认的和多如牛毛未确认的"数据库"构成? 这样的话, 目前总量100G 的大小, 其实饱含了即时全网所有未确认的交易数据, 这个理解对么?

2018年1月15日 01:51

| #

| 引用

Leo

说:

引用小白的发言:

有点疑惑,交易平台肯定需要维护 哪个比特币钱包是哪个用户的吧,而比特币钱包里包含公钥私钥,这样交易平台不就可以知道比特币是哪个用户的么

有道理啊

2018年1月15日 11:09

| #

| 引用

rstevens

说:

首先赞一下阮老师的文章!

不过还是有很多细节的地方有疑惑,例如

"首先,所有的交易数据都会传送到矿工那里。矿工负责把这些交易写入区块链。

根据比特币协议,一个区块的大小最大是 1MB,而一笔交易大概是500字节左右,因此一个区块最多可以包含2000多笔交易。矿工负责把这2000多笔交易打包在一起,组成一个区块,然后计算这个区块的 Hash。"

1、 交易数据是怎么传到矿工那的? 是发给所有矿工么?

2、 矿工自己来决定把多少个交易合并到一个区块中么?

这些细节,如果有实现代码可以看到就好了。阮老师知道有哪些开源的代码可以学习么?

2018年1月15日 16:41

| #

| 引用

ty

说:

所有的交易数据都会传送到矿工那里。矿工负责把这些交易写入区块链。

根据比特币协议,一个区块的大小最大是 1MB,而一笔交易大概是500字节左右,因此一个区块最多可以包含2000多笔交易。

相请教第一个块区是怎么来的?没有交易矿工就没办法写入块区,不写入块区就得不到比特币。

实在想不通,求指教。

2018年1月15日 21:34

| #

| 引用

Alex

说:

其实,任何东西想成为货币,就是一个信心,当然还有方便性。

要是人们都认为这东西能当钱使,那它就值钱了。

就像一般等价物的诞生一样,只不过现在的技术让这个过程简化快捷了很多。

这发行起来岂不就是通货膨胀啊!!!首先就让这显卡贵到姥姥家去了。

2018年1月16日 17:14

| #

| 引用

yaro

说:

每个区块的容量随着时间的增长会越来越大么,不会爆掉么?

2018年1月17日 17:03

| #

| 引用

BitcoinFan

说:

@walker:

1.现在已经冲着200GB去了。如果要完整从头验证一遍,需要把这么多区块链数据全部下载一遍。全节点也支持修剪模式(prune),但就我自己的经验,修剪模式会带来一些不便,比如不能rescan(导入私钥的时候就需要rescan来显示出正确的转账记录和余额)。以后可能有backward syncing,也就是从最近的区块倒着往回同步,而且还要同步UTXO集合(相当于余额数据)。

2.不对。

一百多GB是2009年比特币诞生至今的所有已确认交易。中间有不少孤块/分叉都被丢弃了,还有很多零确认因为被双花/手续费太低等原因也被丢弃了。

每个比特币节点都会连接到附近的节点(不过连接数默认是受限的),一个人广播一笔交易后,会一传十十传百,直到传遍整个网络。

零确认交易是保存在内存池里的,这些交易只是等待着矿工把它打包进链,是不算数的(比如,已有一笔零确认交易,但是矿池在新挖出的区块中,把另一笔与之冲突的“双重支付”交易打包进去了,那么大家都承认区块链里的那个交易有效,零确认交易无效)。

不过,现在大矿池基本垄断了算力,而且都遵守Opt-in RBF的规则,所以一般的零确认交易在几天之内还是不能双花的(也就是“卡着确认不了”),因为RBF现在还不是默认启用,但未来会改成默认启用。

2018年1月19日 16:03

| #

| 引用

BitcoinFan

说:

引用ty的发言:

所有的交易数据都会传送到矿工那里。矿工负责把这些交易写入区块链。

根据比特币协议,一个区块的大小最大是 1MB,而一笔交易大概是500字节左右,因此一个区块最多可以包含2000多笔交易。

相请教第一个块区是怎么来的?没有交易矿工就没办法写入块区,不写入块区就得不到比特币。

实在想不通,求指教。

第一个区块就是创世区块(genesis block),只有一笔“凭空”生成50BTC的coinbase交易(也就是区块补贴),内容算是中本聪随便写的。

就是这个:

https://btc.com/000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f

点开coinbase交易,就可以看到著名的The Times 03/Jan/2009 Chancellor on brink of second bailout for banks了:

https://btc.com/4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b

2018年1月19日 16:07

| #

| 引用

BitcoinFan

说:

引用yaro的发言:

每个区块的容量随着时间的增长会越来越大么,不会爆掉么?

原来是一个区块最大1MB(矿工还可以自己设置更低的上限),但是直到最近这个上限才被填满,然后,矿工优先打包手续费高的交易,手续费不够高的,就在内存池里排队等着。

即使是鼓吹超大区块的Bitcoin Cash,矿工们现在也没敢把这个限制完全拿掉,目前的上限是8MB,前一阵子BCH发生了粉尘攻击(有人发帖说是“压力测试”),可以看到有些矿池甚至还保留着1MB的限制。

去年软分叉SegWit已经激活了,引入了一种新的交易格式(和老格式并存),这种格式把交易数据分成两块,一块是资金往来和数额,另一块是用数字签名证明交易有效的“见证”;对见证部分,计算字节数时要少算四分之三(给了折扣),这样就等于允许区块大小超过1MB。

SegWit格式的交易使用率越高,区块就可以扩到越大。目前SW使用率只有10%。

根据估计,这样扩容最大可以达到2MB左右。(4MB是不可能达到的,因为非见证部分字节数不会是零)

未来BTC应该还会有硬分叉,可能要扩大区块,不过近期是不会有了。

目前还有一些方法能减少交易字节数,比如压缩公钥、batching等。以后还会有Schnorr签名等技术。

2018年1月19日 16:22

| #

| 引用

BitcoinFan

说:

@Alex:

现在比特币的概念还被很多人抵触,多数人还是宁愿相信国家政权,而不是分布式共识。

政府也是,不少都对比特币不友好,像我国不就是这样,只是把比特币定位为合法的虚拟商品,不承认它是货币,而且把交易所都关了,连矿场都要赶出去……

而且比特币-法币“汇率”波动很大,市场投机性很强,这也是个本质上的问题。

比特币还面临着扩容问题,区块大了就趋向于中心化,闪电网络现在还没准备好。

还有,就是比特币不存在账户密码、密码忘记找回、资金冻结这种概念,算是“认密钥不认人”的,丢失被盗都是责任自负的。

比特币早就不能用显卡挖了,连莱特币都不行了,只能用ASIC矿机挖,否则是纯浪费电、耗费显卡寿命。

现在用显卡挖的是其他加密货币,比如以太币(ETH,以太坊Ethereum平台上用的代币,其实人人都可以轻易在以太坊上发行自己的ERC20代币)、门罗币(XMR,Monero)、零币(ZEC,Zcash)等等。

2018年1月19日 16:32

| #

| 引用

BitcoinFan

说:

引用没事扯扯蛋的发言:

谁能说明比特币怎样和实际金钱或实物挂钩的???

如果不能挂钩,比特币就是个数字游戏,没有价值。

如果挂钩了,那说明比特币背后还是有势力(中心)支持的,否则怎么可能风生水起?

这个都是老生常谈的问题了。

有价值的东西未必是“实物”,比如大数据,或者……玩游戏氪金;黄金就是没有人担保背书的,但它仍然有价值。

所以,现在有人想让比特币成为“数字黄金”……

2018年1月19日 16:46

| #

| 引用

nonehat

说:

纠正小错误:每笔交易的大小约为250B左右,也就是说1个区块可以包含 1 * 1024 * 1024 / 250 笔交易,而挖出一个区块约10分钟。所以每秒的交易量: 1*1024*1024 / 600 = 6.9。 也就是人们常说的不超过7笔。

2018年1月19日 22:25

| #

| 引用

lies

说:

假如算力能垄断比特币的交易权,那这个就是集权中心化了,因为假如算力越分散,那么想要垄断的成本就越低,51%对政府来说,想要达到并不难,什么时候政府管不住了,自己这么一折腾,是不是比特币就该没了

2018年1月21日 10:04

| #

| 引用

anor

说:

引用Dong的发言:

一块区块链只能存2000笔交易,2040年就挖不到新的区块链,但交易是继续增加的,那么区块链用完了怎么办呢?

区块链不会用完吧?只是用来奖励的比特币可能就没有了,到那时矿工只能靠手续费获得奖励了。

2018年1月25日 16:37

| #

| 引用

风君子-神游

说:

关于交易,按照文章里面所说,没交易一次是不是相当于生成了一个新的区块,因为会生成一个新的hash,那这个交易所产生的区块,和矿工新挖出来的区块有什么区别,其次,交易是通过矿工去填写数据的,那矿工会不会恶意的去写数据,例如,把新交易的比特币写自己钱包里面

2018年1月26日 14:24

| #

| 引用

ade

说:

引用Mike的发言:

比特币技术复杂、普通人不能很好的理解。比特币没有金融监管、容易产生金融犯罪。前段时间的黑客勒索无不采用比特币技术。所以个人并不看好这一块的技术。

比特币只是一种货币形式,RMB也是一种货币形式,如果敲诈勒索犯罪用RMB,那我们不是??

2018年1月26日 16:46

| #

| 引用

ALLEN

说:

区块链 和 比特币交易大概理解了。 但是作为交易者怎么获利。这一点是不是类似股票说,在比特币网上用现金(真实货币)交易购买虚拟比特币,然后等着升值再出售。

2018年1月29日 16:05

| #

| 引用

wjzsuperman

说:

是不是新增一个区块,就代表新增一个比特币?

2018年1月30日 10:08

| #

| 引用

胡吃喝

说:

引用wjzsuperman的发言:

是不是新增一个区块,就代表新增一个比特币?

最开始,新增一个区块,增加50个比特币,后来新增一个区块,增加25个,再后来就是12.5个

2018年2月 2日 20:32

| #

| 引用

胡吃喝

说:

引用anor的发言:

区块链不会用完吧?只是用来奖励的比特币可能就没有了,到那时矿工只能靠手续费获得奖励了。

区块链用不完,比特币倒是会用完,也就是再也挖不出来了。

2018年2月 2日 20:33

| #

| 引用

郭海峰

说:

原文:目前由于交易数量猛增,手续费已经水涨船高,一个区块2000多笔交易的手续费总额可以达到3~10个比特币。如果你的手续费给低了,很可能过了一个星期,交易还没确认。

请教:如果一个区块的2000比交易中有没有确认的,那这个区块怎么确认呢?不是一个小时就可以确认了吗?另外,如果一笔交易在确认过程中但还没没有支付成功,这些比特币是否可能再次支付给其它方,而因为第二次交易所在的区块被确认导致第二次交易成功,第一次交易失败呢?

2018年2月 3日 21:11

| #

| 引用

夜上

说:

引用Dong的发言:

有个疑问求解答:

一块区块链只能存2000笔交易,2040年就挖不到新的区块链,但交易是继续增加的,那么区块链用完了怎么办呢?

新开区块没有奖励了而已,并不是不开新的

2018年2月 5日 11:47

| #

| 引用

cqcmdwym

说:

你也可以用私钥加密信息,别人用你的公钥解开,从而证明这个信息确实是你发出的

你好,阮老师,这样是不是不安全,人家有公钥就能解开?

2018年2月 7日 07:45

| #

| 引用

airomyas

说:

引用王挺的发言:

我也有此疑问,但感觉这个回答没答到点上。

交易记录是必须要附在新的区块里,再写入主区块链才能生效的。而2040年之后,已经没机会“算出”新的区块了,还怎么附加交易记录呢?

区块永远可以增加,区块链的长度并没有限制。只是矿工取得记账权的时候,系统没有给矿工比特币来奖励了。

2018年2月12日 09:53

| #

| 引用

airomyas

说:

引用cqcmdwym的发言:

你也可以用私钥加密信息,别人用你的公钥解开,从而证明这个信息确实是你发出的

你好,阮老师,这样是不是不安全,人家有公钥就能解开?

这个叫数字签名,目的是为了证明这条用私钥签名的消息的确是你发出的(因为别人没有你的私钥),那么怎么证明呢?就是这条消息能够用你发布的公钥解开,这就说明消息是你发的,因为用别人的公钥不可能揭开你的私钥签名的消息。

这种情况下,不是为了保密,而是为了验证身份。

2018年2月12日 10:28

| #

| 引用

天空

说:

一开始错了,是欧美各大银行以及金融机构的一个需求,最后是一个中本聪的人或者组织造出一个比特比的产品来,本身不是中本聪的想法,它是需求的实现者

2018年2月13日 14:52

| #

| 引用

路人甲

说:

怎么全是小白?

2018年2月14日 01:10

| #

| 引用

老宽

说:

区块链记录着完整的账本,而比特币本质是希望解决去中心化的问题。1M的块大小引起交易堵塞的问题我能理解,通过扩容等技术手段肯定能解决的,只是扩多少的问题了。但是这个只是解决交易速度的问题啊?

但是,将来积累的账本数据肯定越来越多啊,那岂不是意味着每个安装了比特币钱包的客户端软件都得同步这些账本信息呢,比如现在账本数据如果几百G能理解不是问题,但是将来账本数据累积了总会很大啊,这个问题怎么能搞定啊?

2018年2月17日 00:22

| #

| 引用

谦修

说:

引用binary的发言:

"这个钱包不是用来存放比特币,而是存放你的公钥和私钥。软件会帮你生成这两把私钥,然后放在钱包里面。"

应该是生成这两把密钥

可以理解为,一个是银行卡号,一个是密码吗。。前者对应公钥,后者是私钥!

2018年2月23日 15:28

| #

| 引用

纪钟磊

说:

您好,我想问一个问题。就是张三有10个比特币,同时向另外两个他自己的私钥(s1,s2)分别支付10个比特币。把支付给s1的交易让旷工1处理。支付给s2的交易让旷工2处理。恰巧旷工1和旷工2出处理的达到的分支数也都是大于6并且相同的。那不是这个时候张三就把10个比特币分别成功支付给了自己的两个私钥,他本身拥有的10个bitcoin就变成了20个?解答一下我的疑惑吧,谢谢!

2018年2月24日 14:42

| #

| 引用

zcqshine

说:

引用TONYHEAD的发言:

有若干疑问:

一个100GB的数据库就可以记录到比特币创立至今的所有交易往来?

"2000笔交易的区块手续费是3-10个比特币",这个交易成本太高了,2000笔流水,大一点的小卖部都不止这个数,难不成按目前的交易成本, 比特币只适合做大额资金的交易?

比特币的价格现在已经够大额了...哈哈

2018年2月24日 16:30

| #

| 引用

btcoin小白

说:

区块是不是可以是0-2000条交易记录(包含是0条交易记录),我在想比特币诞生时应该是还没有交易的吧,这个时候区块里面应该是没有交易记录的吧?

2018年2月26日 23:22

| #

| 引用

xmokdjs

说:

引用温国兵的发言:

纠正一个错误

“你可能看出来了,每 4 年奖励减半,那么到了 2140 年,矿工将得不到任何奖励,比特币的数量也将停止增加。这时,矿工的收益就完全依靠交易手续费了。”

这里应该是 2040 年。

一尺之棰,日取其半,万世不竭。——《庄子·天下》

2018年2月27日 11:50

| #

| 引用

戴祎程

说:

我想问一下阮老师,如果矿工没有收集全交易记录,或者故意写错了交易记录,从而生成了最新的区块,后续的矿工怎么发现他记录的有问题?

2018年2月28日 16:42

| #

| 引用

DannyPei

说:

我想问个问题,矿工们从网络上收集各种交易请求,组包并计算hash,当计算出的hash不满足要求时,是会更换或重新收集网络上的各种交易请求然后重新打包计算hash,直到所计算出的hash满足要求吗?(因为如果不更换组包的交易内容的话,计算出的hash还是会和原来的一样)这样的话作为一个交易请求的提出方,所提出的交易请求能否被认可、何时被认可都是完全未知的,这样将难以满足货币日常流通的基本需求。不知道是否是这样,求阮老师和各位老师解答。

2018年3月 1日 15:22

| #

| 引用

DannyPei

说:

引用纪钟磊的发言:

您好,我想问一个问题。就是张三有10个比特币,同时向另外两个他自己的私钥(s1,s2)分别支付10个比特币。把支付给s1的交易让旷工1处理。支付给s2的交易让旷工2处理。恰巧旷工1和旷工2出处理的达到的分支数也都是大于6并且相同的。那不是这个时候张三就把10个比特币分别成功支付给了自己的两个私钥,他本身拥有的10个bitcoin就变成了20个?解答一下我的疑惑吧,谢谢!

不会,矿工1和矿工2同时计算出符合要求区块链,并且两个分支又同时达到6个链的长度,这是不可能发生的

2018年3月 1日 15:23

| #

| 引用

alex

说:

有个地方没明白。

假如说矿工A抢到了这块区块。然后广播出去。大家承认了以后。这块区块的HASH值就定了。

然后再在这块区块中输入"A挖到了这块区块 获得12.5个比特币"。那这个输入信息不是会导致这块区块的HASH值变了么?

2018年3月 2日 17:13

| #

| 引用

Aspi1in

说:

“事实上,我也不知道,如果我知道怎么发财,可能就不会在这里写博客了。”

扎心了老铁~

2018年3月 2日 19:17

| #

| 引用

gelvshige

说:

引用Aspi1in的发言:

“事实上,我也不知道,如果我知道怎么发财,可能就不会在这里写博客了。”

扎心了老铁~

坦白的很可爱!

2018年3月 2日 19:22

| #

| 引用

peakandyuri

说:

我其实有一个疑问,比特币是没有中心节点的,如果我要加入矿工的行列,我怎么才能知道其它节点并和它们交换数据。

2018年3月 5日 14:31

| #

| 引用

xuewuchen

说:

其实我觉得这里最大的问题就是,所有的资源都浪费在无意义的计算上面了。如果这些算力真的可以一起计算,是不是能够解决很多计算上面的难题呢

2018年3月 7日 09:14

| #

| 引用

zbw

说:

引用没事扯扯蛋的发言:

谁能说明比特币怎样和实际金钱或实物挂钩的???

如果不能挂钩,比特币就是个数字游戏,没有价值。

如果挂钩了,那说明比特币背后还是有势力(中心)支持的,否则怎么可能风生水起?

你可以把它当做一件物品,一个东西,这个东西只要有人愿意花钱去买,那就能与真实货币挂钩

2018年3月 9日 15:01

| #

| 引用

csha

说:

引用zyg的发言:

传说的去中心化呢~到头来还是矿工中心化~ 算力决定一切 哈哈~

你把去中心化这个概念理解错了

2018年3月13日 19:05

| #

| 引用

中本葱

说:

引用王挺的发言:

我也有此疑问,但感觉这个回答没答到点上。

交易记录是必须要附在新的区块里,再写入主区块链才能生效的。而2040年之后,已经没机会“算出”新的区块了,还怎么附加交易记录呢?

有区块啊,只是这些区块不会新生成比特币而已

2018年3月18日 11:27

| #

| 引用

沈小扬

说:

请教,矿工记录交易记录生成新的区块,从而得到奖励的比特币。这个奖励本身的交易又是谁来记录呐?有没有区块链来保存?

2018年3月19日 13:10

| #

| 引用

Satan

说:

160位是二进制,写成十六进制,大约是26到35个字符

这个是怎么算的?

2018年3月19日 13:13

| #

| 引用

Bicong Wang

说:

引用杨峰的发言:

很好奇,比特币是怎么开始的?有这个想法是因为,采矿是产生比特币的“造血系统”,而造血的过程是写入交易记录,而最初是没有交易记录给人来写的。

阮老师没有细讲挖矿,实际上挖矿的要求是造出一个哈希值小于xx的区块,这个跟交易是否存在没有必然关系。而随着区块的产生,比特币会被制造出来。

2018年3月19日 19:04

| #

| 引用

ieayoio

说:

引用小米的发言:

有一个地方不明白,需要请教博主。

如果我是矿工,挖矿时在当前交易记录中擅自增加一条“我获得1000比特币”的记录,然后很幸运这块矿被我挖到,交易记录被记录和通报全网了。

那是不是就能作弊了?

不知道你的问题解决了没,我觉得“我获得1000比特币”的这条记录不能凭空的产生,它必须是“xxx向你转账了1000比特币”才能达到你获得比特币的目的,而这个动作需要有向你转账的人的数字签名作为凭证

2018年3月20日 17:31

| #

| 引用

ieayoio

说:

所谓交易手续费,就是矿工可以从每笔交易抽成,具体的金额由支付方自愿决定。你完全可以一毛不拔,一分钱也不给矿工,但是那样的话,你的交易就会没人处理,迟迟无法写入区块链,得到确认。矿工们总是优先处理手续费最高的交易。

这里我有个疑问,是不是说等到矿工挖到新的区块没有奖励的时候,如果支付不付手续费,是不是说有可能交易永远无法写入区块链,这岂不是有钱花不出去了吗,所以只能追加手续费来完成交易吧?而且手续费少了也很有可能迟迟完成不了交易

2018年3月20日 17:40

| #

| 引用

悟空

说:

现在比特币的区块有多高了啊?

2018年4月 2日 21:05

| #

| 引用

mall

说:

有几点疑问:

1 公钥和私钥都是软件生成的,如何保证软件平台不会私自保存用户的私钥?

2 区块链本身的机制只承认最长新增链(block),那么最终会对导致每个block都只包含最简单的信息(空block或者只包含一笔交易的block),因为你等到2000笔交易凑齐的时候再开始打包计算,可能别人已经算出来的了。这样推演下去最终区块链里每个块只会包含一笔交易,1M的大小根本就用不完。为什么还会出现提议将block size增加 ?

望哪位大侠能指教一下?谢谢

2018年4月 9日 08:57

| #

| 引用

崔文远

说:

私钥的保存用什么方式最安全?

2018年4月11日 20:34

| #

| 引用

帅锅

说:

越看越带劲,真的十分感谢作者这么辛苦写的文章呀!已经能理解很多很多了,感激

2018年4月19日 16:10

| #

| 引用

shilion

说:

引用Satan的发言:

160位是二进制,写成十六进制,大约是26到35个字符

这个是怎么算的?

这个是十六进制和2进制的转换了。就像我们的十进制,冯10进1,十六进制是冯16进1,有0-9,A-F组成。

2018年4月19日 22:17

| #

| 引用

没有

说:

引用Mike的发言:

比特币技术复杂、普通人不能很好的理解。比特币没有金融监管、容易产生金融犯罪。前段时间的黑客勒索无不采用比特币技术。所以个人并不看好这一块的技术。

你不看好的原因我却感觉是比特币火的真正原因,不接受黑暗并不代表黑暗不存在

2018年4月28日 17:52

| #

| 引用

chen

说:

想请问一下:

比特币第一个区块Block #0是相当于初始化创建的,记录的交易一个新闻报纸的标题。

产生50个比特币的奖励(这50个比特币好像不能被使用)。

那第二个区块Block #1它的交易记录是什么呢(是否是用比特币交易呢)?

这些交易的手续费所需的比特币从何处来呢?

2018年5月 2日 18:11

| #

| 引用

梦元

说:

“我获得1000比特币”的这条记录不能凭空的产生,btc不会凭空产生,它产生的唯一渠道是旷工算出合规hash值后获得的奖励,而且会有专门的标识记录这笔btc的产生,以及它产生的条件。首先“我获得1000比特币”这条记录不会添加进去,因为这条记录不合规范至少是“xxx转给xx多少btc”或者是“xx算出了新的合规hash获得XX个btc的奖励”,其次即使你想办法强行添到了数据库,请求同步数据时,其它节点也会算出你这笔凭空产生的记录是非法,拒绝同步你的数据。

每一笔交易都必须具备 (from, to, value,fee ) ,而且每一笔交易应该都会有from方进行数字签名,避免旷工把转账给to方的5个btc改成了10个

2018年5月 3日 18:46

| #

| 引用

晨晨

说:

我就想知道怎么开户 交易

2018年5月11日 22:53

| #

| 引用

虾米

说:

虽然在币圈工作几年了,但是每次需要给小白讲解btc的时候都不知从何讲起。

以后我可以让他们来看峰哥的文章。

2018年5月17日 18:45

| #

| 引用

虾米

说:

引用梦元的发言:

“我获得1000比特币”的这条记录不能凭空的产生,btc不会凭空产生,它产生的唯一渠道是旷工算出合规hash值后获得的奖励,而且会有专门的标识记录这笔btc的产生,以及它产生的条件。首先“我获得1000比特币”这条记录不会添加进去,因为这条记录不合规范至少是“xxx转给xx多少btc”或者是“xx算出了新的合规hash获得XX个btc的奖励”,其次即使你想办法强行添到了数据库,请求同步数据时,其它节点也会算出你这笔凭空产生的记录是非法,拒绝同步你的数据。

每一笔交易都必须具备 (from, to, value,fee ) ,而且每一笔交易应该都会有from方进行数字签名,避免旷工把转账给to方的5个btc改成了10个

峰哥应该是想表达对 btc 的价值思考

2018年5月17日 18:47

| #

| 引用

浅蓝

说:

引用小白的发言:

有点疑惑,交易平台肯定需要维护 哪个比特币钱包是哪个用户的吧,而比特币钱包里包含公钥私钥,这样交易平台不就可以知道比特币是哪个用户的么

只需管理用户对应的钱包地址就行,不需要知道具体的公钥私钥,就好比支付宝管理用户的账号,但是不知道你的密码也能使交易正常完成

2018年5月18日 13:07

| #

| 引用

卫道者

说:

引用Mike的发言:

比特币技术复杂、普通人不能很好的理解。比特币没有金融监管、容易产生金融犯罪。前段时间的黑客勒索无不采用比特币技术。所以个人并不看好这一块的技术。

比特币勒索与比特币无关,只是通过比特币来收钱。

2018年7月13日 13:54

| #

| 引用

Tiger.xu

说:

每个节点都包含了整个区块链(目前大概 100多 GB),并且节点之间时刻不停地在同步信息。------目前100多GB,后面随着时间推移,这个区块链是否会非常之大。而且100多GB的数据在这么多节点中复制,会不会造成网络堵塞?

2018年7月15日 19:22

| #

| 引用

haiker

说:

为什么交易数据要包含双方的地址呢,既然交易数据中已经包含了公钥,而交易的支付方地址就是公钥计算hash得到,只提供公钥,私钥签名和接受方的地址和上次交易的hash不行吗?

2018年10月 7日 10:43

| #

| 引用

张淼

说:

嗯 讲的很清楚

2018年12月21日 11:31

| #

| 引用

风一样的男子

说:

老师,您好,我正在探究比特币的源码,现在有一块没弄清楚,就是同步机制.我想知道比特币的同步时机除了节点启动时,还有其他时机吗?特别时在处理孤块上,加入第k个区块在广播给A节点时丢了,那么对于A节点是采取怎样的措施来获得这个区块的呢?希望老师不吝赐教

2018年12月31日 12:08

| #

| 引用

哈哈

说:

很不错呢,通俗易懂。

2019年4月 9日 20:07

| #

| 引用

代富贵

说:

突然发现一个问题,有人(以为为例)炒币好几年了,说啥币都多少听说过,但是突然被问到到底什么是区块链,什么是加密货币的时候,还是一脸蒙。

2019年5月27日 17:02

| #

| 引用

柚子

说:

引用温国兵的发言:

纠正一个错误

“你可能看出来了,每 4 年奖励减半,那么到了 2140 年,矿工将得不到任何奖励,比特币的数量也将停止增加。这时,矿工的收益就完全依靠交易手续费了。”

这里应该是 2040 年。

每四年减半,要乘以4兄弟,就是2140年咯

2019年6月 1日 12:57

| #

| 引用

BitcoinFan

说:

引用haiker的发言:

为什么交易数据要包含双方的地址呢,既然交易数据中已经包含了公钥,而交易的支付方地址就是公钥计算hash得到,只提供公钥,私钥签名和接受方的地址和上次交易的hash不行吗?

交易数据其实压根就没有包含“地址”。地址只在应用层(钱包软件)里存在,在底层(区块链数据里)并不存在。

交易数据包含的是“输入”和“输出”。

每一项“输出”都含有金额和“锁定脚本”。就好像开宝箱一样,你必须有密码,或者钥匙(取决于这个宝箱最初是怎么制作的)才能打开,打开后想干啥就全部由你做主了。

一般情况下,锁定脚本的内容基本上就是公钥的哈希,外加一点点脚本操作码,

地址只是把公钥的哈希加上校验码,再用Base58编码了一下而已。加上校验码可以防止打错字,用Base58编码可以方便人类阅读。

每一项“输入”都要声明被“解锁”的是具体哪一笔钱,用上一笔交易的哈希(txid)和输出序号指定。同时还要拿出“解锁脚本”,一般就是公钥、数字签名,以及一点点脚本操作码。

2019年9月 6日 22:18

| #

| 引用

BitcoinFan

说:

引用haiker的发言:

为什么交易数据要包含双方的地址呢,既然交易数据中已经包含了公钥,而交易的支付方地址就是公钥计算hash得到,只提供公钥,私钥签名和接受方的地址和上次交易的hash不行吗?

更正一下,地址里不止包含公钥哈希和校验码,还有一个版本号。

实际上这还只是最简单的P2PKH地址,除此之外还有3开头的P2SH地址(含有脚本哈希而不是公钥哈希),以及bc1开头的P2WPKH、P2WSH地址(原生隔离见证地址,功能和P2PKH和P2SH类似)。

P2SH地址可以设置更复杂的脚本,也就是设定更复杂细致的解锁条件。一般它用于多重签名。除了多重签名,还可以“封装”隔离见证脚本,因为bc1开头的原生隔离见证地址很多地方还不兼容,封装成3开头的地址,就能保持兼容了(代价是交易略大,手续费略贵)。

对bc1开头的原生隔离见证地址来说,编码不再使用中本聪设计的Base58,而是使用重新设计的Bech32,只包含小写字母,但也可以全部转换成大写字母来表示(这样可以让二维码更小更“轻便”)。这样更方便在电话中口述这种用途。

2019年9月 6日 22:27

| #

| 引用

BitcoinFan

说:

引用haiker的发言:

为什么交易数据要包含双方的地址呢,既然交易数据中已经包含了公钥,而交易的支付方地址就是公钥计算hash得到,只提供公钥,私钥签名和接受方的地址和上次交易的hash不行吗?

比特币很多时候都是反直觉的……就比如“3开头的P2SH地址可以封装隔离见证”,可能会让很多人产生一种误解:“3开头的地址和bc1开头的地址往往使用同一个公钥”——实际上很多时候并不是这样,因为一般HD钱包都遵守BIP44/49/84规范,生成不同类型的地址时,使用的私钥也不一样;只有少数钱包,比如Bitcoin Core,在一些特殊情况下(老版本的addwitnessaddress,以及importprivkey/importpubkey导入单个私钥/公钥)是这么做的。

2019年9月 6日 22:32

| #

| 引用

BitcoinFan

说:

引用Tiger.xu的发言:

每个节点都包含了整个区块链(目前大概 100多 GB),并且节点之间时刻不停地在同步信息。------目前100多GB,后面随着时间推移,这个区块链是否会非常之大。而且100多GB的数据在这么多节点中复制,会不会造成网络堵塞?

确实是越攒越大的……有些比特币开发者反对增大区块,就是出于“历史区块增长的速度已经超过技术进步速度”这种理由。

网络堵塞,现在看还不至于,因为跑全节点的比特币用户算是少数(很多人只是在交易所里炒一炒,或者就只是用一下轻量级钱包而不是全节点钱包),而且只有一开始要下载那么多,后面只需要不断跟进就可以了,并不需要一遍遍地从头下载。

2019年9月 6日 22:36

| #

| 引用

BitcoinFan

说:

引用alex的发言:

有个地方没明白。

假如说矿工A抢到了这块区块。然后广播出去。大家承认了以后。这块区块的HASH值就定了。

然后再在这块区块中输入"A挖到了这块区块 获得12.5个比特币"。那这个输入信息不是会导致这块区块的HASH值变了么?

实际上当然是先把区块里的各种数据填好、把交易都打包进去,再发给矿机、让矿机去暴力试错凑hash值啊。矿机只需要拿到区块头、coinbase交易等很少的信息就可以进行挖矿了,并不需要拿到完整的区块。

2019年9月 6日 22:42

| #

| 引用

BitcoinFan

说:

引用老宽的发言:

区块链记录着完整的账本,而比特币本质是希望解决去中心化的问题。1M的块大小引起交易堵塞的问题我能理解,通过扩容等技术手段肯定能解决的,只是扩多少的问题了。但是这个只是解决交易速度的问题啊?

但是,将来积累的账本数据肯定越来越多啊,那岂不是意味着每个安装了比特币钱包的客户端软件都得同步这些账本信息呢,比如现在账本数据如果几百G能理解不是问题,但是将来账本数据累积了总会很大啊,这个问题怎么能搞定啊?

交易确认速度这个问题争议比较大。主流认可的办法是开发闪电网络,放弃原有的零确认交易。少数派的办法是用avalanche预共识加固零确认。还有侧链,以前经常提,现在已经有了liquid、rsk这些,却很冷清,几乎没人用。而且也有adam back等大佬认为侧链并不能从根本上解决扩容问题。

区块越攒越多的问题,也有争议。

有人坚持全节点必须把所有区块都下载验证一遍(启用修剪,也只是一边下载新的一边删旧的,并不是不下载旧的),有人就认为这么做太浪费,可以妥协一下,直接从最近的状态开始,跳过历史(也就是utxo commitment、assumeutxo之类的)。

以前对这个问题还提出一个解决方法,就是“欺诈证明”,也就是让轻量级客户端随机挑一部分进行验证,“众目睽睽”之下,总能发现猫腻。但是后来这个基本上是弃坑了,理由是如果有恶意矿工挖违反规则的链,那他完全可以把有猫腻的部分藏着不发出来,轻量级客户端拿它没办法,没办法证明这里缺了一块(而不只是网速卡了)。

引用DannyPei的发言:

我想问个问题,矿工们从网络上收集各种交易请求,组包并计算hash,当计算出的hash不满足要求时,是会更换或重新收集网络上的各种交易请求然后重新打包计算hash,直到所计算出的hash满足要求吗?(因为如果不更换组包的交易内容的话,计算出的hash还是会和原来的一样)这样的话作为一个交易请求的提出方,所提出的交易请求能否被认可、何时被认可都是完全未知的,这样将难以满足货币日常流通的基本需求。不知道是否是这样,求阮老师和各位老师解答。

区块头里有个nonce值,矿机一般是先修改nonce值。nonce值用完了,还可以稍微改一下时间戳,让时间戳前后稍微变动一下。除了时间戳,还有coinbase交易,可以用作extranonce,这里面的空间就大了,但是每次修改extranonce的计算成本都比较大,所以这一般是放到最后尝试。

还有像asicboost这样有争议的办法,(分显式和隐式两种,隐式asicboost里面有提到交换交易顺序,是多种办法中的一种),显式asicboost是修改nversion,争议相对较小。

2019年9月 6日 22:55

| #

| 引用

李晓铭

说:

请问博主,矿工们如何收集交易请求啊?我有一个交易,如何发给矿工呢?这个过程,需要一个中心转发吗?矿工们之间如何联系呢?

就像bt技术一样,最终离不开一个中心来发布种子和登记提供bt服务的ip地址,比特币和区块链能完全脱离一个中心吗?

2019年12月18日 17:38

| #

| 引用

BitcoinFan

说:

引用李晓铭的发言:

请问博主,矿工们如何收集交易请求啊?我有一个交易,如何发给矿工呢?这个过程,需要一个中心转发吗?矿工们之间如何联系呢?

就像bt技术一样,最终离不开一个中心来发布种子和登记提供bt服务的ip地址,比特币和区块链能完全脱离一个中心吗?

比特币有一套P2P协议啊,简单说就是一传十、十传百。

BT不也是有完全去中心化的DHT么,DHT是不需要Tracker服务器的。

不过,比特币的节点软件里确实有硬编码写进几个“种子节点”,一开始不知道其他节点的IP时,就可以向这些“种子节点”查询(这个查询用的是DNS协议,所以叫DNS seeding)。如果从其他途径来发现其他节点,比如手动添加、从已经连接上的其他节点查询等等,那DNS seeding就不是必要的。

这个话题细说的话就不简单了。

比如“节点”具体指什么呢?要是去阅读中本聪最初的介绍和发言,就会发现他默认“矿工即节点、节点即矿工”。

现在的话,“节点”(负责验证交易)和“矿工”(负责穷举哈希来“挖矿”)已经自然而然地分离了。

矿工自己并不会运行节点,他们会把矿机的算力输出给矿池,让矿池的“节点”(或者说是“全节点”full node)负责产生区块。

很多“全节点”背后也是没有算力的,只能监视网络,不能出块。

现在的比特币核心开发者大多认为用户需要跑全节点,因为全节点可以独立、完整地验证区块链账本的内容。

如果是SPV轻量级钱包的话,因为没有对交易内容进行验证,所以,理论上,即便是矿工打破了比特币的规则,比如凭空造100万币,那SPV也是无法识别的。

但是,全节点很笨重,很显然并不适合一般用户;而且有人认为“按照中本聪原本的设计,就不需要普通用户去跑全节点”,比特币的社区可以说也因为这个分歧而分裂了,反对“普通人应该跑全节点”的人很多转而去支持BCH(然后BCH又分裂成ABC和SV两个币……)。

比特币核心开发者则会指出中本聪很早以前就消失了,在他消失之前,他也并没有把SPV轻量级钱包设计完善,因为缺失了“警报机制”来提醒SPV不要去跟随违反规则的区块链账本。

2020年1月 4日 02:06

| #

| 引用

BitcoinFan

说:

还有,矿池之间可能未必是走比特币自身的P2P网络,他们可能还会走更快的FIBRE、Falcon等更加中心化、但也更快的网络,这样可以避免自己因为网络通信不畅(没有及时收到最新区块,或者没有及时把自己新挖出的区块广播出去)而挖出废块。

2020年1月 4日 02:11

| #

| 引用

JAK

说:

用核心钱包交易是不是每次交易都会生成一个新的地址,且钱包内所有的比特币都会转移到新的钱包内,接收了比特币是不是也是一样,所有的比特币包括不是交易所得的比特币都会自动到一个新的找零地址里去?

2020年3月31日 12:15

| #

| 引用

BCG

说:

引用温国兵的发言:

纠正一个错误

“你可能看出来了,每 4 年奖励减半,那么到了 2140 年,矿工将得不到任何奖励,比特币的数量也将停止增加。这时,矿工的收益就完全依靠交易手续费了。”

这里应该是 2040 年。

就是2140年,不是2040.

2020年4月30日 12:07

| #

| 引用

BitcoinFan

说:

引用JAK的发言:

用核心钱包交易是不是每次交易都会生成一个新的地址,且钱包内所有的比特币都会转移到新的钱包内,接收了比特币是不是也是一样,所有的比特币包括不是交易所得的比特币都会自动到一个新的找零地址里去?

避免重复使用同一个地址,这个是中本聪的白皮书里提到的。这是一种很鸡肋的、聊胜于无的隐私保护措施。

每次收款时都用新的收款地址,结合每次转出时都用新的找零地址,双管齐下,理想情况下就分不清哪个地址是回到原主人手里的找零,然后就无法进一步追查资金去向,从而保护隐私。

实际上有不少情况会泄露“哪个地址是找零”这个信息;甚至还有不少轻量级钱包是直接上传xpub主公钥的,钱包服务商直接就知道哪些地址背后是同一个主人了。

(而且Bitcoin Core虽然是HD钱包,但是用的是很蛋疼的hardened derivation,压根就没有xpub主公钥——这个情况可能在未来版本会有所改革,开发者现在正在做descriptor wallet)

每次转出,并不是会把所有币都转移到新的找零地址上。这要看你转出的金额大不大,以及你的钱包如何“选币”,选择花掉哪些UTXO。一般情况下钱包是只选择差不多够用的UTXO(所以这也会造成交易里的找零输出项金额较小,可以被猜测分辨出来;但是如果选了太多UTXO,也要注意,把不同地址上的币同时花出去本身也是隐私信息泄露,因为这样透露了这些地址背后实际上是属于同一个主人)。

2020年10月 2日 01:56

| #

| 引用

undefined

说:

挖到新区块的矿工可以获得比特币奖励,奖励的数量逐年递减,这个机制可以修改吗?谁来决定呢

2022年4月15日 11:56

| #

| 引用

sutungpo

说:

请教下在第三部分交易流程中:

转出比特币的一方提供的数据中的数字签名是不是也保证了交易金额的属实?否则交易的金额在申报提交过程中存在被篡改的可能性?

2022年8月15日 14:54

| #

| 引用

我在2023看世界

说:

2023年再看这篇文章,确实受益匪浅

2023年5月12日 21:43

| #

| 引用

我要发表看法

您的留言

(HTML标签部分可用)

您的大名:

«-必填

电子邮件:

«-必填,不公开

个人网址:

«-我信任你,不会填写广告链接

记住个人信息?

正在发表您的评论,请稍候

«- 点击按钮

Weibo |

Twitter |

GitHub

Email: [email protected]

比特币挖矿算法详解 - 知乎

比特币挖矿算法详解 - 知乎首发于清源的区块链实验室切换模式写文章登录/注册比特币挖矿算法详解清源区块链工程师比特币网络中,源源不断的收到交易,需要节点不断的打包这些交易,而网络中的所有节点都是对等的,如何判断谁可以打包这些交易,如何避免重复打包这些交易呢?这个时候就需要用到工作量证明(PoW,Proof-of-Work)的方式决定记账权。网络中的任何全节点,都可以试图创建区块,但区块只有在至少满足下列条件时创建的区块才会被其他节点认可和接受。 区块中包含的交易都是合法的; 区块哈希要小于等于一个目标值;要满足第一个条件很简单,节点只要将每笔交易都验证一遍,丢弃掉不合法的交易即可。但要满足第二个条件就需要挖矿。挖矿比特币挖矿就是找到一个随机数(Nonce)参与哈希运算Hash(Block Header),使得最后得到的哈希值符合难度要求,用公式表示就是Hash(Block Header)<= target 比特币采用的哈希算法是 SHA-256 ,也就是说最后会产生256位的输出,一共2^256种可能的取值。 最后得到的哈希值小于target的意思是把哈希后得到的bytes转换成数字后小于target转换成的数字。举个例子,直观的感受一下挖矿的难度;SHA-256计算123的值

a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3

下面这段字符是比特币第1000个区块的哈希(2009年1月产生);

00000000c937983704a73af28acdec37b049d214adbda81d7e2a3dd146f6ed09

可以看到前面有8个0,虽然哈希值的生成是随机的,但是生成前面有8个0的值对计算机穷举来说也并不算太难。

再看一下这段字符,是比特币第560000个区块的哈希(2019年1月产生);

0000000000000000002c7b276daf6efb2b6aa68e2ce3be67ef925b3264ae7122

可以看到前面有18个0,要生成满足这个条件的哈希对于普通电脑来说几乎是不可能完成的任务了。简单来看挖矿难度的高低就是生成区块头的哈希值有多少0。挖矿难度在比特币系统中出块时间被设置为一个常数10分钟,但是挖出区块的速度并不是固定的,而是随着挖矿难度的变化在10分钟上下浮动, 挖矿难度越大,出块时间就越长,为了得到相对平均的出块时间,需要动态调整挖矿难度。 比特币每产生2016个区块调整一次挖矿难度,一个块10分钟,2016个块大概是两周的时间,而调整挖矿难度的这些逻辑都在代码中,当大多数诚实节点采用这个策略的时候整个网络就会自动遵循这个策略。挖矿难度的计算公式如下:diffculty = difficulty_1_target / target此处的 difficulty_1_target 为一个常数,非常大的一个数字( 2^(256-32)−1 )。表示挖矿的初始难度,目标值越小,区块生成难度越大。 2^(256-32)−1 是比特币的初始难度,是前2016个块的难度。 这个难度被存储在比特币的区块头nBits字段中,当有恶意节点篡改这个策略时,挖矿产生的区块头的哈希值就会和诚实节点产生冲突,不会被接收,白白浪费了算力。 因为策略不同,也就是nBits不同,恶意节点产生的区块哈希无法被诚实节点验证。 调整出块时间比特币系统中区块的生产速度是根据之前产生区块速度调整的,之前出块速度大于10分钟,则认为需要降低难度,则需要提高第一个公式中target的值,而target则通过如下公式计算;target = current_target * ( actual time / excepted time )current_target是当前系统中的难度值,target是调整后的难度值,actual time是实际产生区块的时间,excepted time是期望出块时间(2016块*10分钟),actual time有上下限,actual time最多8周,最小二分之一周。挖矿算法比特币中nBits标识了挖矿的难度,也就是说这个区块头进行SHA-256哈希算法后得到的bytes转换成数字后要小于这个难度,而SHA-256计算后的结果有256位,如果直接存储需要32个字节比较占用空间,所以采用了一种压缩算法。压缩算法nBits有4个字节32位,将SHA-256计算得到的值经过如下算法压缩到32位;将数字转换为 256 进制。如果第一位数字大于 127(0x7f),则前面添加 0。压缩结果中的第一位存放该256进制数的位数。后面三个数存放该256进制数的前三位,如果不足三位,从后补零。举个例子,将十进制1000压缩;1. 1000转换256进制数,1000 = 3 * 256 + 232 = 3*256^(2-1) + 232*256^(1-1)

2. 3小于127,不需要补0,跳过

3. 从第一部看到1000转换成256位数有2位,压缩结果第一位应该存放2

4. 因为只有两位,所以最后一位补0,得到存放的值为 [2, 3, 232, 0]十进制,转换十六进制 [0x02, 0x03, 0xe8, 0x00] 合并存储到nbits为 0x0203e800难度计算在第一个公式中difficulty_1_target的值为 2^(256-32)-1,转换成256进制为;FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF第一位大于0x7f,前面补0,变为00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF其长度等于 28+1=29 (0x1d),且长度超过三位,无需补零,则压缩结果为:0x1d00FFFF,因为压缩存储容量只有才4个字节,前两字节已经被长度和添加的 00 所占用,只剩下2个字节来存储数字,这样后面的26个 FF 值被丢弃。T=0x00FFFF * 256^(0x1b-3) = 0x00000000FFFF0000000000000000000000000000000000000000000000000000比特币中的difficulty就是0x1d00FFFF,如果区块中的nBits为0x1d00FFFF则说明这个区块挖矿难度为最小挖矿难度1.实际上专业的矿池程序会保留被截断的FF:00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF我们算一下比特币101799号区块的挖矿难度,通过区块链浏览器可以看到101799号区块的nBits为0x1b0404cbD = 0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF / 0x00000000000404CB000000000000000000000000000000000000000000000000 = 16307.669773817162 (pdiFF)pdiFF也被称为矿池难度。算力为了找到符合条件的值在挖矿的时候需要不断的调整区块头中Nonce的值,但是又会有一个问题,在比特币中Nonce的值是32位的,如果挖矿难度太大,就算穷尽Nonce的所有可能还是不能算出符合条件的值。铸币交易在一个区块产生的时候,会有一个铸币交易(coinbase),也就是矿工为自己铸币,产生新的比特币。铸币交易没有UTXO输入,只有输出指向自己的比特币地址,当挖矿成功,这个区块被网络接收的时候,新产生的币就转移到这个矿工地址了。看一下铸币交易包含的字段; transaction hash:“交易哈希”字段32个字节全部填充0(因为其没有UTXO输入);ouput index:“交易输出索引”字段全部填充0xFF(十进制的255); coinbase data:coinbase数据长度最小2字节,最大100字节。除了开始的几个字节外,矿工可以任意使用coinbase的其他部分,随意填充任何数据。以创世块为例,中本聪在coinbase中填入了这样的数据“The Times 03/Jan/ 2009 -Chancellor on brink of second bailout for banks“; - coinbase data size:coinbase数据大小; sequence number:现在未使用,设置为0xffffffff可以看到铸币交易的coinbase data字段是我们可以控制的,当Nonce不能满足挖矿难度的时候,我们可以通过调整coinbase data字段,从而影响区块头的默克尔树根的值,提供更多的可能来满足挖矿难度的要求。算力单位通过上面的流程,进行一次可能的挖矿尝试被称为H。 1 H/s = 每秒可执行一次哈希运算。 1 KH/s = 每秒1,000哈希(一千次)。 1 MH/s = 每秒1,000,000次哈希(百万次)。 1 GH/s = 每秒1,000,000,000次哈希(十亿次)。 1 TH/s = 每秒1,000,000,000,000次哈希(万亿次)。 1 PH/s = 每秒1,000,000,000,000,000次哈希。 1 EH/s = 每秒1,000,000,000,000,000,000次哈希。挖矿收益矿机挖矿的时候就会出现很长的时间找不到符合条件的哈希值,如果找不到哈希值不能打包区块就没有收益,显然对矿工十分不友好,但是如果挖到就像中彩票一样获得非常丰厚的回报。矿池为了避免单个矿工挖矿收益的不稳定性,就出现了矿池,矿池集合了大量的矿工,平均挖矿的收益,避免了挖矿收益的不稳定性。 矿池组织大量的矿工挖矿面临很重要的一个问题就是如何把高难度计算哈希的任务拆解成相对简单的任务,发送给单个矿工,回顾之前挖矿难度的计算,可以简单的认为前面0的多少表明了挖矿的难易。 0越多,挖矿难度越高,为了降低挖矿难度我们就要增加挖矿哈希0的数量,举个例子假设挖矿目标值 0x000abc,只要满足这个值就可以打包区块获得挖矿收益;

降低挖矿难度为 0x001abc,发送给矿工,矿工只要计算区块头满足这个相对低一点的难度就可以得到一个分片(shared),但是单个矿工挖到这个简单难度的块是无法发布到整个网络中的,但是矿池可以把这个分片记录下来,作为以后给这个矿工奖励的凭证。

0x001abc是0x000abc的子集,只要子集足够多总有一个会满足目标值。

当有一个矿工挖出一个满足目标值之后就可以获得挖矿收益,而挖矿就可以根据矿工分片多少来获得收益。

矿工收益 = 挖矿收益 / 挖到的分片数量但是现在还有一个问题没有解决,单个矿工挖到目标值以后如果私吞收益,私自广播区块怎么办?矿池有集中托管式的,也有分布式的。 集中托管式矿池,矿工可以把挖矿的机器托管给矿池,由矿池统一操作维护,只需要支付一些电费管理费即可,这样就避免了私自广播。 分布式矿池,矿工将机器自行管理,通过矿池协议从网络连接矿池即可,这样就会出现私自广播的可能。回顾一下铸币交易coinbase,可以看到有output字段,UTXO模型中币的来源都是上一个交易的output,所以可以把铸币交易的output字段设置为矿池的地址,然后随机生成一些coinbase data的填充后生成区块头的默克尔树,最后发由矿工去尝试目标值。通过这样的方式,即使矿工找到满足条件的哈希值,铸币交易的地址也是矿池的地址,私自广播区块没有任何收益,如果调整铸币交易的地址,这样又回到了独立挖矿的场景。全网算力如果要获知全网算力,可以通过出块时间,挖矿难度大致反推出全网算力。区块确认当一个区块产生之后,它不是立即可信的,网络上的节点总是相信最长的区块链,当一条交易记录被打包进一个区块之后,就有了一个确认,而这个区块所在的链后面被再加入一个区块,就是第二个确认,如此下去,一个交易有了6个确认,我们就认为这个交易已经确定了,会被永远记录在区块链中。 为什么是6个确认呢?因为每一个确认就是一个挖矿过程,需要大量的工作量证明,因此,这6个区块被同一个矿工创建的可能性微乎其微(可以说是不可能),因此矿工伪造交易也基本不可能。由于比特币的区块平均产生时间是10分钟,所以一个交易要1小时左右才能保证成功(最快),不过也不是所有的系统都这样认为,有些网站在接受比特币支付时,认为4个确认就可以给客户发货了,区块确认越多则越难被逆转。区块广播在区块链中,为了尽快收到其他节点的信息,节点间并不是直接传递区块信息的。 节点向附近节点发送一个Inv消息,Inv消息中包含已经被发送者(sender)接收并验证过的“交易记录的哈希”、以及“区块哈希”。接收者(receiver)收到Inv消息后,如果他还尚未从其他节点收到过相同的信息,他会发送一个getdata消息给发送者,要求得到交易记录及区块哈希包含的具体信息。此时,区块和交易记录的信息才会进行整体传递。 其中Inv消息结构如下;type MsgInv struct {

InvList []*InvVect

}

type InvVect struct {

Type InvType // Type of data

Hash chainhash.Hash // Hash of the data

}欢迎关注我的博客(qyuan.top),不定期分享一些区块链底层技术文章,博客排版要比知乎好一点(ㄟ( ▔, ▔ )ㄏ)。编辑于 2020-05-12 11:18挖矿区块链(Blockchain)比特币 (Bitcoin)​赞同 82​​11 条评论​分享​喜欢​收藏​申请转载​文章被以下专栏收录清源的区块链

十分钟带你看懂比特币的运行原理 - 知乎

十分钟带你看懂比特币的运行原理 - 知乎首发于大数据分析·人工智能切换模式写文章登录/注册十分钟带你看懂比特币的运行原理CDA数据分析师有一种货币目前价值成百上千美元 ,但不是由金子、铂金或任何贵重金属制造的,这就是比特币,那么比特币的原理是什么呢?针对不方便打开视频的小伙伴,CDA字幕组也贴心的整理了文字版本,如下:假设有一种货币目前价值成百上千美元 ,但不是由金子、铂金或任何贵重金属制造的,实际上这不是你能放在手中或存钱罐中的钱币。这是数字货币,意味着它只以电子的形式存在。我说的就是比特币,比特币的原理与大多数货币很不一样。它不依附于国家或政府,因此它没有中央发行机构或监管机构。这意味着没有组织机构决定:什么时候要制造更多的比特币;决定要制造多少;追踪比特币流向或调查欺诈行为。那么作为一种货币,比特币是怎么运作的呢?或者比特币是如何具有价值的呢?如果没有整个互联网或密码学,比特币不会存在。实际上有时比特币也被认为是世界上第一种加密货币。​比特币的运行原理比特币是数字货币。你能在世界范围内,点对点互联网中的计算机间进行比特币交换。大多数点对点互联网的目的在于进行分享。比如让人们对合法的音乐或电影进行复制从而下载。如果比特币是数字货币,那么什么阻止你复制出大量的伪币,从而变得富到流油呢?不像mp3或视频文件,比特币不是一串可以进行复制的数据。比特币实际上是一种名为区块链的大型全球分类账,之后我们会详细解释。区块链会记录所发生的每笔比特币交易。截止到2016年底整个分类账的数据为107GB。因此当你给他人发送比特币时,不像发送文件,你实际上是将交易记录在大型的分类账上。例如"Michael发给Hank 5个比特币”。可能你在想 "等等,你说比特币没有中央机构进行记录”。虽然比特币是中央记录的,但没有任何官方的人会更新分类账,像银行一样跟踪每个人的钱。它是分散式的。实际上任何人都能主动更新区块链的全部新交易,非常多的人都在做。这是可行的,因为许多人在追踪相同的内容,保证所有的交易是正确的。假设你和一些朋友在玩扑克,但你们都没有扑克牌筹码,而且你忘带钱,大家都没有钱。因此你们拿出笔记本开始记录谁下注了多少,谁赢谁输。你不完全信任其他人,因此每个人都单独记录自己的账。每一手牌结束时,你们都会对比互相写了什么。这样的话,如果有人记错了或想作弊,为自己多记一些钱,那就会当场被发现。在几手牌之后,你会发现你在笔记本上记录了钱的流向。你可以把记录的每页视为一个交易块。最终你的笔记本会记录了许多页的信息,即一连串的块,因此形成了区块链。如果有成千上万的人在分别维护比特币区块链,那么这些分类账是如何保持一致的呢?回到之前扑克牌的例子。把整个比特币点对点网络视为一个很大的扑克牌桌,周围坐着数百万的人参加。有些人只是在交换钱币,但许多人在主动记录分类账。如何你想发送或收到钱,你必须告诉桌上的每个人,那么记录的人就能更新分类账。因此每次交易你需要告知比特币网络几点内容:你的账号;你要发送比特币的人的帐号;以及你要发送多少比特币。所有记录区块链的人会将你的交易添加到目前的区块上。让许多人记录交易似乎是不错的安全措施。但是如何发送比特币只需要一些账号数字的话,这样似乎会存在安全问题。只是普通钱币的话,这会是一个大问题,不妨想想那些试图盗取他人信用卡信息的不法分子。比特币中不存在中央银行去发现有哪儿出了问题,从而阻止欺诈行为,比如突然你把毕生的存款都花在牛肉干上之类的。那么如何阻止Hank假装是我,把我的比特币都发送给他自己呢?多亏了密码学,比特币十分安全。这也是为什么比特币被认为是一种加密货币。密钥具体来说,比特币能保持安全是由于密钥。密钥含有大量信息从而能从数学上确保一些消息,比如”嘿,这真的是来自我本人”。当你在比特币网络上创建账号,也就是你听说的所谓"钱包”。这个账号连接了两个独特的密钥:私人密钥和公共密钥。在这种情况下,私人密钥对一些数据进行标记,也就是所谓的进行"签名”。那么其他人就可以在之后对签名进行验证。假设我想在网络中发送消息说,”Michael给Olivia发送了3比特币”。那么我用我的私人密钥对消息进行签名,私人密钥只有我有,其他人都无法仿制。接着我将签名后的消息发送到比特币网络中,每个人都能用我的公共密钥保证我的签名生效。这样每个记录所有的比特币交易的人,能够将我的交易添加到他们的区块链副本中。换而言之,如何公共密钥奏效的话,这就证明了消息是通过我的私人密钥签名的,同时这也是我想发送的内容。不同于手写签名或信用卡号,这种身份证明无法被骗子伪造。交易中的时间每笔交易的"谁"是非常重要的,用来确保正确的人在比特币交易;但”何时"同样重要。假设你在银行账号中有一千美元,你想买两个均为一千美元的物品。银行会接受第一次的购买,拒绝第二次的购买。如果银行不这么做你将可以多次使用同一笔钱,这听起来很棒 ,但也很糟糕。金融系统不能这样运行,因为没有人会获得报酬。如果我有一笔钱只够支付给Olivia或者Hank,但我想付给他们两个人。在比特币系统中内置了检查,比特币网络和你的钱包会自动检查你以前的交易,以确保你有足够的比特币可供发送。但围绕时间又存在一个问题,因为全世界有许多人在记录区块链的副本,网络延迟意味着你无法总是以同样的顺序收到交易请求。现在有许多人有稍微不同的区块可选,但每个人都不一定是错的。比特币要怎么解决这个问题呢?数学问题证明是通过真正解决问题,数学问题。要添加一个区块的交易,每个维护分类账的人必须解决一个由加密哈希函数创建特殊的数学问题。哈希函数是一个算法,当中输入的大小任意,但得出的输出大小固定。假设你有一些数字作为输入,哈希函数定义要把这些数字加起来,这种情况下输出为10。对于密码学来说哈希函数很棒的点在于,当你给出输入,很容易得出输出。但是给出输出很难弄清最初的输入是什么。即使是这个简单的例子,也有很多数字加起来为10。唯一得出输入为1 2 3 4 的方法就是不断猜直到答对。如今比特币使用的哈希函数称为SHA256,这表示安全的哈希算法256位,最初由美国国家安全局创建。专门用来解决SHA256哈希问题的计算机,平均需要10分钟来解决每个问题,意味着在答对前需要数以亿计次尝试。谁第一个解答了哈希问题能够在交易中添加下一个区块,从而生成新需要解决的数学问题。如果许多人几乎在同时添加了区块,网络选出其中一个 这就成为全长且最信任的链子。这些没被选择的链子上的交易将重新被放入池中,将被添加到之后的区块上。这些志愿者在专门的计算机上花费了数千美元,从而去解答SHA256问题,付高昂的电费保持机器的运转,但为什么呢?维护区块链他们能获得什么呢?只是社区服务吗?奖励系统比特币其实有内置的系统来奖励他们。如今每次当你率先添加区块到区块链中,就有12.5个比特币会凭空添加到你的账号中。实际上你可能通过比特币分类账维护者的另一个名字知道他们:矿工。因为更新区块链,就像在那些哈希问题上挥舞着镐头希望以此致富。当比特币在2009年首次被创建时,它没有太多价值,数十个比特币可能相当于一堆硬币。然而在2016年11月10日,一个比特币价值708美元,因此12.5比特币价值8850美元,这是很不错的改变。 每个比特币的存在都是为了奖励比特币矿工而创造的,除了在交易中添加新区块时获得的报酬,矿工在每笔交易中还能获得一小笔小费。同样值得注意的是,每到21万区块时,当添加新的区块时,产生的币数量会减少一半。因此开始奖励为50比特币,减少为25,之后是12.5。在之后几年会变为6,并且继续下降。最终一个区块中会有很多笔交易,矿工们主要通过从当中获得小费,这还是值得的。最新的预测是:最后的比特币,大约是第2100万个,会在2140年内被挖到。比特币数量的减少实际上在模拟地球上被开采金子的速度。目的是限制比特币提供数量能够随着时间提高其价值。那么投资比特币是一个好主意吗?在这里我们不进行深究。比特币仍然不稳定并且在实验阶段,很多人喜欢比特币,还有很多人认为它注定会失败。我们觉得这是个有趣的想法,让我们不禁思考密码学之后又能为我们做些什么。获取更多内容可移步:数据分析培训,12年全栈数据科学教育品牌-CDA数据分析师编辑于 2019-02-26 10:17区块链(Blockchain)​赞同 262​​14 条评论​分享​喜欢​收藏​申请转载​文章被以下专栏收录大数据分析·人工智能分享行业干货,分享实时热点,还有生活的点点

十分钟带你看懂比特币的运行原理 - 知乎

十分钟带你看懂比特币的运行原理 - 知乎首发于大数据分析·人工智能切换模式写文章登录/注册十分钟带你看懂比特币的运行原理CDA数据分析师有一种货币目前价值成百上千美元 ,但不是由金子、铂金或任何贵重金属制造的,这就是比特币,那么比特币的原理是什么呢?针对不方便打开视频的小伙伴,CDA字幕组也贴心的整理了文字版本,如下:假设有一种货币目前价值成百上千美元 ,但不是由金子、铂金或任何贵重金属制造的,实际上这不是你能放在手中或存钱罐中的钱币。这是数字货币,意味着它只以电子的形式存在。我说的就是比特币,比特币的原理与大多数货币很不一样。它不依附于国家或政府,因此它没有中央发行机构或监管机构。这意味着没有组织机构决定:什么时候要制造更多的比特币;决定要制造多少;追踪比特币流向或调查欺诈行为。那么作为一种货币,比特币是怎么运作的呢?或者比特币是如何具有价值的呢?如果没有整个互联网或密码学,比特币不会存在。实际上有时比特币也被认为是世界上第一种加密货币。​比特币的运行原理比特币是数字货币。你能在世界范围内,点对点互联网中的计算机间进行比特币交换。大多数点对点互联网的目的在于进行分享。比如让人们对合法的音乐或电影进行复制从而下载。如果比特币是数字货币,那么什么阻止你复制出大量的伪币,从而变得富到流油呢?不像mp3或视频文件,比特币不是一串可以进行复制的数据。比特币实际上是一种名为区块链的大型全球分类账,之后我们会详细解释。区块链会记录所发生的每笔比特币交易。截止到2016年底整个分类账的数据为107GB。因此当你给他人发送比特币时,不像发送文件,你实际上是将交易记录在大型的分类账上。例如"Michael发给Hank 5个比特币”。可能你在想 "等等,你说比特币没有中央机构进行记录”。虽然比特币是中央记录的,但没有任何官方的人会更新分类账,像银行一样跟踪每个人的钱。它是分散式的。实际上任何人都能主动更新区块链的全部新交易,非常多的人都在做。这是可行的,因为许多人在追踪相同的内容,保证所有的交易是正确的。假设你和一些朋友在玩扑克,但你们都没有扑克牌筹码,而且你忘带钱,大家都没有钱。因此你们拿出笔记本开始记录谁下注了多少,谁赢谁输。你不完全信任其他人,因此每个人都单独记录自己的账。每一手牌结束时,你们都会对比互相写了什么。这样的话,如果有人记错了或想作弊,为自己多记一些钱,那就会当场被发现。在几手牌之后,你会发现你在笔记本上记录了钱的流向。你可以把记录的每页视为一个交易块。最终你的笔记本会记录了许多页的信息,即一连串的块,因此形成了区块链。如果有成千上万的人在分别维护比特币区块链,那么这些分类账是如何保持一致的呢?回到之前扑克牌的例子。把整个比特币点对点网络视为一个很大的扑克牌桌,周围坐着数百万的人参加。有些人只是在交换钱币,但许多人在主动记录分类账。如何你想发送或收到钱,你必须告诉桌上的每个人,那么记录的人就能更新分类账。因此每次交易你需要告知比特币网络几点内容:你的账号;你要发送比特币的人的帐号;以及你要发送多少比特币。所有记录区块链的人会将你的交易添加到目前的区块上。让许多人记录交易似乎是不错的安全措施。但是如何发送比特币只需要一些账号数字的话,这样似乎会存在安全问题。只是普通钱币的话,这会是一个大问题,不妨想想那些试图盗取他人信用卡信息的不法分子。比特币中不存在中央银行去发现有哪儿出了问题,从而阻止欺诈行为,比如突然你把毕生的存款都花在牛肉干上之类的。那么如何阻止Hank假装是我,把我的比特币都发送给他自己呢?多亏了密码学,比特币十分安全。这也是为什么比特币被认为是一种加密货币。密钥具体来说,比特币能保持安全是由于密钥。密钥含有大量信息从而能从数学上确保一些消息,比如”嘿,这真的是来自我本人”。当你在比特币网络上创建账号,也就是你听说的所谓"钱包”。这个账号连接了两个独特的密钥:私人密钥和公共密钥。在这种情况下,私人密钥对一些数据进行标记,也就是所谓的进行"签名”。那么其他人就可以在之后对签名进行验证。假设我想在网络中发送消息说,”Michael给Olivia发送了3比特币”。那么我用我的私人密钥对消息进行签名,私人密钥只有我有,其他人都无法仿制。接着我将签名后的消息发送到比特币网络中,每个人都能用我的公共密钥保证我的签名生效。这样每个记录所有的比特币交易的人,能够将我的交易添加到他们的区块链副本中。换而言之,如何公共密钥奏效的话,这就证明了消息是通过我的私人密钥签名的,同时这也是我想发送的内容。不同于手写签名或信用卡号,这种身份证明无法被骗子伪造。交易中的时间每笔交易的"谁"是非常重要的,用来确保正确的人在比特币交易;但”何时"同样重要。假设你在银行账号中有一千美元,你想买两个均为一千美元的物品。银行会接受第一次的购买,拒绝第二次的购买。如果银行不这么做你将可以多次使用同一笔钱,这听起来很棒 ,但也很糟糕。金融系统不能这样运行,因为没有人会获得报酬。如果我有一笔钱只够支付给Olivia或者Hank,但我想付给他们两个人。在比特币系统中内置了检查,比特币网络和你的钱包会自动检查你以前的交易,以确保你有足够的比特币可供发送。但围绕时间又存在一个问题,因为全世界有许多人在记录区块链的副本,网络延迟意味着你无法总是以同样的顺序收到交易请求。现在有许多人有稍微不同的区块可选,但每个人都不一定是错的。比特币要怎么解决这个问题呢?数学问题证明是通过真正解决问题,数学问题。要添加一个区块的交易,每个维护分类账的人必须解决一个由加密哈希函数创建特殊的数学问题。哈希函数是一个算法,当中输入的大小任意,但得出的输出大小固定。假设你有一些数字作为输入,哈希函数定义要把这些数字加起来,这种情况下输出为10。对于密码学来说哈希函数很棒的点在于,当你给出输入,很容易得出输出。但是给出输出很难弄清最初的输入是什么。即使是这个简单的例子,也有很多数字加起来为10。唯一得出输入为1 2 3 4 的方法就是不断猜直到答对。如今比特币使用的哈希函数称为SHA256,这表示安全的哈希算法256位,最初由美国国家安全局创建。专门用来解决SHA256哈希问题的计算机,平均需要10分钟来解决每个问题,意味着在答对前需要数以亿计次尝试。谁第一个解答了哈希问题能够在交易中添加下一个区块,从而生成新需要解决的数学问题。如果许多人几乎在同时添加了区块,网络选出其中一个 这就成为全长且最信任的链子。这些没被选择的链子上的交易将重新被放入池中,将被添加到之后的区块上。这些志愿者在专门的计算机上花费了数千美元,从而去解答SHA256问题,付高昂的电费保持机器的运转,但为什么呢?维护区块链他们能获得什么呢?只是社区服务吗?奖励系统比特币其实有内置的系统来奖励他们。如今每次当你率先添加区块到区块链中,就有12.5个比特币会凭空添加到你的账号中。实际上你可能通过比特币分类账维护者的另一个名字知道他们:矿工。因为更新区块链,就像在那些哈希问题上挥舞着镐头希望以此致富。当比特币在2009年首次被创建时,它没有太多价值,数十个比特币可能相当于一堆硬币。然而在2016年11月10日,一个比特币价值708美元,因此12.5比特币价值8850美元,这是很不错的改变。 每个比特币的存在都是为了奖励比特币矿工而创造的,除了在交易中添加新区块时获得的报酬,矿工在每笔交易中还能获得一小笔小费。同样值得注意的是,每到21万区块时,当添加新的区块时,产生的币数量会减少一半。因此开始奖励为50比特币,减少为25,之后是12.5。在之后几年会变为6,并且继续下降。最终一个区块中会有很多笔交易,矿工们主要通过从当中获得小费,这还是值得的。最新的预测是:最后的比特币,大约是第2100万个,会在2140年内被挖到。比特币数量的减少实际上在模拟地球上被开采金子的速度。目的是限制比特币提供数量能够随着时间提高其价值。那么投资比特币是一个好主意吗?在这里我们不进行深究。比特币仍然不稳定并且在实验阶段,很多人喜欢比特币,还有很多人认为它注定会失败。我们觉得这是个有趣的想法,让我们不禁思考密码学之后又能为我们做些什么。获取更多内容可移步:数据分析培训,12年全栈数据科学教育品牌-CDA数据分析师编辑于 2019-02-26 10:17区块链(Blockchain)​赞同 262​​14 条评论​分享​喜欢​收藏​申请转载​文章被以下专栏收录大数据分析·人工智能分享行业干货,分享实时热点,还有生活的点点

一文详解比特币原理 - 知乎

一文详解比特币原理 - 知乎首发于SCI | 科技与生活切换模式写文章登录/注册一文详解比特币原理熵远行不积跬步,无以至千里一、什么是比特币比特币是一种电子货币,是一种基于密码学的货币,在2008年11月1日由中本聪发表比特币白皮书,文中提出了一种去中心化的电子记账系统,我们平时的电子现金是银行来记账,因为银行的背后是国家信用。去中心化电子记账系统是参与者共同记账。比特币可以防止主权危机、信用风险。其好处不多做赘述,这一层面介绍的文章很多,本文主要从更深层的技术原理角度进行介绍。二、问题引入 假设现有4个人分别称之为ABCD,他们之间发起了3个交易,A转给B10个比特币,B转给C5个比特币,C转给D2个比特币。如果是传统的记账方式,这些交易会记录在银行的系统中,这些信息由银行来记录,我们相信银行不会随意添加、删除或修改一条交易记录,我们也不会关注到底有哪些交易,我们只关注自己的账户余额。而比特币的记账方式为ABCD每个人保存了这样一份账本,账本上记录了上述交易内容,如果每个人账本实时的一致,ABCD就不再需要银行。 比特币是这样做的,每当有人发起一笔交易,他就要将一笔交易广播至全网,由全网中的某一个人,把一段时间内的交易打包好记录到一个区块上,再按照顺序把这些区块,一个一个的链接在一起,进而形成了一个链条,这就是所谓的区块链。那么问题来了1、我凭什么要参与这个系统,我为什么要动用自己的计算机资源来存储这些信息呢?2、以谁的记录为准呢?比如上面的账单顺序,A用户可能是这个顺序,但是B可能顺序不一样,甚至可能B根本就没有接收到C给D转账的这个消息。3、比特币如果做到支付功能,保证该是谁的钱就是谁的钱,而且只有其所有者才能花。4、如何防伪、防篡改以及双重支付,防伪是验证每条交易的真的是某人发出的,比如B可能杜撰一条消息,说某某给我转了一笔钱,这就是一个假消息,或者B说我给某人转了多少钱,但是实际上他并没有这么多钱,又怎么办。防篡改指的是B可能想从区块链上把自己曾经转给某人钱的记录删掉,这样他的余额就会增加。双重支付是指,B只有10比特币,他同时向C和D转10个比特币,造成双重花费。三、为什么要记账?因为记账有奖励,记账有手续费的收益,而且打包区块的人有系统奖励,奖励方案是,每十分钟生成一个区块,每生成一个区块会奖励一定数量的比特币,最开始是50个BTC,过4年会奖励25个BTC,再过4年再减少一半,以此类推。这样比特币的产生会越来越少,越来越趋近于一个最大值,计算公式是:50×6×24×365×4×(1+1/2+1/4+1/8+…)≈2100万,其中最初奖励50个比特币,每小时有6个区块,每天24小时,每年365天,前四年是如此,之后每四年减半。此外,记账奖励还有每笔交易的小额手续费,每个交易发起都会附带一定的手续费,这些手续费是给记账的矿工的。四、以谁为准?各个节点通过工作量证明机制来争夺记账权,他们计算一个很复杂的数学题,第一个计算出来的节点就是下一个区块的产生者。这个数学题很难,难到没有一个人能同过脑子算出来,它是基于概率的方法,矿工必须通过遍历、猜测和尝试的办法才能解开这个未知数。那么这个数学难题到底是什么呢?下面详细介绍。4.1哈希函数哈希函数又称为数字摘要或散列函数,它的特点是输入一个字符串,可以生成另外一个字符串,但是如果输入不同,输出的字符串就一定不同,而且通过输出的字符串,不能反推出输入。举个简单的例子,对1-100内的数模10,可以认为是一种哈希方法,比如98%10=8,66%10=6,98和66是输入,模10是哈希函数,8和6是输出,在这个模型中,通过6和8无法推断输入是66和98,因为还可能是56和88等,当然因为这个例子比较简单,所以会出现哈希碰撞,即66和56的结果都是6,输出的结果相同。一个优秀的哈希函数,可以做到输出一定不同,哈希碰撞的概率几乎为0。常见的哈希函数有很多,比如MD系列和SHA系列等,比特币采用的SHA256算法,即输入一个字符串,输出一个256位的二进制数。下面是程序运行的结果。通过程序结果可以看出,输入的源信息不同,得到的结果也不同(为了方便,结果用64位16进制表示),即使是orange多了一个句号,也会产生截然不同的结果。同时,通过输出的十六进制字符串,也无法倒推出输入。对于比特币,只要了解SHA256的功能即可,如果感兴趣可以深入了解SHA256的具体算法。需要SHA256的C++源码留言邮箱或私信。4.2挖矿原理首先介绍一下比特币每个区块的数据结构,每个区块由区块头和区块体两部分组成。区块体中包含了矿工搜集的若干交易信息,图中假设有8个交易被收录在区块中,所有的交易生成一颗默克尔树,默克尔树是一种数据结构,它将叶子节点两两哈希,生成上一层节点,上层节点再哈希,生成上一层,直到最后生成一个树根,称之为默克尔树根,只有树根保留在区块头中,这样可以节省区块头的空间,也便于交易的验证。区块头中包含父区块的哈希,版本号,当前时间戳,难度值,随机数和上面提到的默克尔树根。假设区块链已经链接到了某个块,有ABCD四个节点已经搜集了前十分钟内全网中的一些交易信息,他们选出其中约4k条交易,打包好,生成默克尔树根,将区块头中的信息,即发区块哈希+版本号+时间戳+难度值+随机数+默克尔树根组成一个字符串str,通过两次哈希函数得出一个256的二进制数,即SHA256(SHA256(str)) = 10010011……共256位,比特币要求,生成的结果,前n位必须是0,n就是难度值,如果现在生成的二进制数不符合要求,就必须改变随机数的值,重新计算,只到算出满足条件的结果为止。假设现在n是5,则生成的二进制数必须是00000……(共256位)。一旦挖矿成功,矿工就可以广播这个消息到全网,其他的矿工就会基于该区块继续挖矿。下一个区块头中的父区块哈希值就是上一个区块生成的00000……这个数。解决这个数学难题要靠运气,理论上,运气最好的矿工可能1次哈希就能算出结果,运气差的可能永远都算不出来。但是总体来看,如果一个矿工的算力越大,单位时间内进行的哈希次数就越多,就越可能在短时间内挖矿成功。那么n是如何确定的呢?比特币设计者希望,总体上平均每十分钟产生一个区块,总体上来看,挖矿成功的概率为1/2^n。现假设世界上有1W台矿机,每台矿机的算力是14T次/s = 1.4×10^13次/s,单位次/s称之为哈希率,10分钟是600s,所以10分钟可以做8×10^19次哈希运算,从概率角度看,想要挖矿成功需要做2^n次运算,可以列出等式2^n = 8×10^19,可以解出n约为66。所以对于这种方法,我们没有办法使得自己的运气变的更好,只能提高自己的算力,尽快的算出结果。另外,需要模拟挖矿过程的C++代码可以回复邮箱,代码可以通过调整难度值,模拟比特币的挖矿算法,控制区块产生的速度。五、如何防伪、防篡改、防双重支付等问题这部分是理解比特币很重要的部分。5.1电子签名技术身份认证技术在生活中很常见,可以是人脸识别、签字、指纹等,但是这些方法在数字货币领域并不安全,因为它们一旦数字化,都可以通过复制的方法伪造。所以比特币采用了电子签名的方法。注册成为比特币用户时,系统会根据随机数生成一个私钥,私钥会生成一个公钥,公钥又会生成一个地址,其中私钥必须保密,可以保存到硬盘里或者记到脑子里,因为这个私钥是使用相应地址上的比特币的唯一标识,一旦丢失,所有的比特币将无法使用。下面介绍具体的转换过程,不感兴趣可以不看,只要知道随机数->私钥->公钥->钱包地址这个过程,其中私钥可以对一串字符进行加密,而公钥可以对其进行解密,这就是非对称加密,这类算法总体上的功能都是一样的,只是具体算法有区别,由于这些算法比较复杂,与SHA265算法一样不多做介绍,感兴趣可以深入了解具体算法,但是对于比特币系统,只要了解其功能即可。典型的算法是RSA,比特币采用椭圆曲线加密算法。转换过程(选读,不影响理解) 1、首先使用随机数发生器生成一个私钥,它是一个256位的二进制数。私钥是不能公开的,相当于银行卡的密码。 2、私钥经过SECP256K1算法生成公钥,SECP256K1是一种椭圆曲线加密算法,功能和RSA算法类似,通过一个已知的私钥,生成一个公钥,但是通过公钥不能反推出私钥。 3、同SHA256算法一样,RIPEMD160也是一种HASH算法,由公钥可以得到公钥的哈希值,而通过哈希值无法推出公钥。 4、将一个字节的版本号连接到公钥哈希头部,然后对其进行两次SHA256运算,将结果的前4字节作为公钥哈希的校验值,连接在其尾部。 5、将上一步的结果使用BASE58进行编码,就得到了钱包地址(相当于银行账户)。比如A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa所以,通过以上的过程我们可以总结出私钥、公钥、钱包之间的关系如下图。可以看到通过私钥可以推出所有的值,公钥哈希和钱包地址之间可以通过BASE58和BASE58解码算法相互转化。了解了公钥、私钥、地址的概念后,防伪验证的过程就很容易理解,当A发起一笔交易后,对消息进行哈希,生成数字摘要,对数字摘要,通过私钥加密,生成一个密码。之后A会广播这个条交易消息、公钥以及密码。收到消息的人首先对交易信息进行哈希生成摘要1,再通过公钥对密码进行解密,生成摘要2,这样,如果两个摘要相同,说明这个消息确实是A发出的。所谓的签名,就是密文。5.2余额检查余额的概念应该说根深蒂固,余额是伴随着称之为借贷记账法而产生的,也是目前银行普遍采用的方法,将一个人的交易记录统计好后算出一个余额,但是在比特币中没有余额这个概念,因为其采用的是UXTO模型的记账方法。比如A->B10个比特币,B->C5个比特币,对于第二笔交易来说,B在发起这笔交易时要注明第一笔交易的信息,这样就可以知道B曾经从A那里收到过10个比特币,说明满足第二笔交易发起的条件。所以比特币中余额的检查是通过追溯的方法。上图描述了两笔交易,交易10001中,B向C转了10个比特币,验证这笔交易的过程是:首先将B的签名通过B的公钥解密,然后再和交易的具体内容(B签名左侧)对比,如果相同,说明消息是B发出的,然后再检查10000这个交易是否真的存在以及它的内容的真实性。这两点都满足了,就说明交易10001是可以被接受的,否则拒绝接受。实际上,真实的交易比这个复杂的多,因为有可能是多笔交易构成了输入,比如B->C20个比特币,是由多笔交易A->B10,D->B10构成的,则前一笔交易ID就是两个ID,甚至可能更多。这里为了简单描述,只列举一笔交易。5.3双重支付A同时发了两条消息,同时给B和C转了10个比特币,实际上他只有10个会怎么样?假设D节点先收到了转给B10个BTC,然后收到了转给C10个比特币,通过上面的验证方法,自然会拒绝后面的一个,与此同时,E节点可能先收到了转给C10个BTC,然后收到了转给B10个比特币,他自然会拒绝后者。至于哪一笔交易最终会上链,就要看D和E哪个先解决难题,成功挖矿。5.4防止篡改假设A转给B10个比特币,但是他想把这个信息从区块链上删除,这样大家就都不知道这个事情存在,就可以赖账。 首先说一下最长链原则,假设某一个区块后面有两个矿工同时挖到了矿,或者由于网络延迟等原因产生了分歧,这时,各个节点先随意根据自己认为对的区块挖矿,只到下一个区块产生,这时会有两条链,但是有一条是长的,比特币规定,以最长的链为准。如果某个节点仍然的固执的以较短的链为准,他就是在和大多数算力作对,这样做的结果是,他挖的块不被大家认可,会浪费时间和算力。回到上面的场景,A想赖账,就只能从记录了A->B10个比特币这个消息的区块的前一个区块开始重新挖矿,造出一个支链来,但是实际上的区块已经前进了很多,他只能不停的追赶,而且在追赶的同时,主链也在前进,他必须以比主链快的速度前进,如果他的算力足够大,理论上通过较长的时间确实可以追赶成功,就实现了对交易信息的篡改。然而其实这几乎是不可能的,因为就算算力再大,平均出块速度也是10分钟,从非技术的角度讲,一个人如果掌握了全网一半以上的算力,他为什么不在主链上继续挖矿呢?一个富可敌国的人应该不会甘愿去做一个小偷吧。 六、总结区块链并不等同于比特币,比特币也不是区块链,区块链只是比特币应用的一种技术,这个技术能给我们带来启发,比特币的伟大之处在于应用了前所未有的区块链技术。区块链技术还能在哪些方面应用还需继续探索。比特币是区块链技术最成功的应用,但是比特币本身也有很多问题,它想通过发行货币来挑战主权货币,这个动机有待商榷。此外,由于比特币的匿名性,只需要一个公钥或地址就能进行交易,为黑色产业提供了很好的平台。另外,比特币并不是一个成熟的支付系统,它具有吞吐率低,可拓展性差等缺点。可能文字还是比较苍白,可以看看李永乐老师讲解的视频,虽然没有这个详细,但是通俗易懂。七、代码实现Blockchain.h这个没什么说的,创建一个区块链类#pragma once#include"Block.h"#include//向量库class Blockchain{public: Blockchain();//默认构造函数 void AddBlock(Block bNew);//增加区块函数 uint32_t _nDifficulty;//难度值 vector _vChain;//保存区块的变量 Block _GetLastBlock() const;//获取最新的区块,由const关键字,表示输出的内容不可更改}; Blockchain.cpp修改难度值在这里修改Blockchain的构造函数中的nDifficulty就可以了。#include"Blockchain.h"Blockchain::Blockchain(){ _vChain.emplace_back(Block(0, "Genesis Block")); _nDifficulty = 4;//难度值设置3基本上秒出结果,4可以看出差距,5大约要等2分钟左右。}void Blockchain::AddBlock(Block bNew){ bNew.sPrevHash = _GetLastBlock().GetHash(); bNew.MineBlock(_nDifficulty); _vChain.push_back(bNew); bNew.WriteBlcokToTXT();//调用区块类中的写文件方法} Block Blockchain::_GetLastBlock() const{ return _vChain.back();}Block.h这里是声明区块类#pragma once#include//包含了uint32_t等无符号整型#include//标准输入输出库#include using namespace std;static time_t first_time = 0;//这个地方是为了记录每个区块产生距离第一个区块的时间而设置的全局变量//创建区块类class Block{public: string sPrevHash;//前一个区块的哈希值 Block(uint32_t nIndexIn, const string& sDataIn);//构造函数 string GetHash();//返回哈希值 void MineBlock(uint32_t nDifficulty);//挖矿,其参数nDifficulty表示指定的难度值 void NoMineBlock();//不挖矿直接添加区块 uint32_t _nIndex;//区块索引值,第几个区块,从0开始计算 int64_t _nNonce;//区块随机数 string _sData;//区块描述字符 string _sHash;//区块Hash值 time_t _tTime;//区块生成时间 string _CalculateHash() const;//计算Hash值,const保证输出的函数值不能被改变。 void WriteBlcokToTXT();//将区块数据写入到TXT文件中};Block.cpp#include"Block.h"#include"sha256.h"#include"time.h"#includeBlock::Block(uint32_t nIndexIn, const string& sDataIn) :_nIndex(nIndexIn), _sData(sDataIn)//构造函数Block的两个参数为nIndexIn和sDataIn,分别赋值到Block中的_nIndex和_sData(构造函数初始化用法){ _nNonce = -1;//Nounce设置为-1 _tTime = time(nullptr);//设置时间 if (nIndexIn == 0)//此处整个时间记录下来是为了记录当前区块生成所需要的时间,而不是当前时间 first_time = _tTime;}string Block::GetHash()//返回哈希值函数的实现{ return _sHash;}void Block::MineBlock(uint32_t nDifficulty)//挖矿函数,参数为难度值。{ //char cstr[nDifficulty + 1]; char cstr[10 + 1];//这个数组实际上设置多大都可以,但是要大于nDifficulty的值 for (uint32_t i = 0; i < nDifficulty; ++i)//填充数组,使数组的前nDifficulty位都为0,作为难度。 { cstr[i] = '0'; } cstr[nDifficulty] = '\0'; string str(cstr);//创建一个string类的对象,初始化为cstr(将字符串数组转换为string类对象) do { _nNonce++; _sHash = _CalculateHash(); } while (_sHash.substr(0, nDifficulty) != str);//substr表示从下标0开始--->nDifficulty的内容 //要寻找一个Nounce使得总体哈希值的前n位的0(即0的个数)和难度值的个数相同,则挖矿成功。 cout << "Block mined:" << _sHash << endl;} inline string Block::_CalculateHash() const{ stringstream ss;//该对象可以通过<<接收多个数据,保存到ss对象中,并通过str方法,将内容赋给一个string对象 ss << _nIndex << _tTime << _sData << _nNonce << sPrevHash; //return sha256(ss.str()); return sha256(sha256(ss.str()));} void Block::WriteBlcokToTXT()//将生成的区块数据输出到一个txt文档中来保存路径自己改{ ofstream outfile("out.txt", ios::app);//此处修改保存区块数据的路径 outfile <<"Index:"<<_nIndex< class SHA256{protected: typedef unsigned char uint8; typedef unsigned int uint32; typedef unsigned long long uint64; const static uint32 sha256_k[]; static const unsigned int SHA224_256_BLOCK_SIZE = (512 / 8);public: void init(); void update(const unsigned char* message, unsigned int len); void final(unsigned char* digest); static const unsigned int DIGEST_SIZE = (256 / 8); protected: void transform(const unsigned char* message, unsigned int block_nb); unsigned int m_tot_len; unsigned int m_len; unsigned char m_block[2 * SHA224_256_BLOCK_SIZE]; uint32 m_h[8];}; std::string sha256(std::string input); #define SHA2_SHFR(x, n) (x >> n)#define SHA2_ROTR(x, n) ((x >> n) | (x << ((sizeof(x) << 3) - n)))#define SHA2_ROTL(x, n) ((x << n) | (x >> ((sizeof(x) << 3) - n)))#define SHA2_CH(x, y, z) ((x & y) ^ (~x & z))#define SHA2_MAJ(x, y, z) ((x & y) ^ (x & z) ^ (y & z))#define SHA256_F1(x) (SHA2_ROTR(x, 2) ^ SHA2_ROTR(x, 13) ^ SHA2_ROTR(x, 22))#define SHA256_F2(x) (SHA2_ROTR(x, 6) ^ SHA2_ROTR(x, 11) ^ SHA2_ROTR(x, 25))#define SHA256_F3(x) (SHA2_ROTR(x, 7) ^ SHA2_ROTR(x, 18) ^ SHA2_SHFR(x, 3))#define SHA256_F4(x) (SHA2_ROTR(x, 17) ^ SHA2_ROTR(x, 19) ^ SHA2_SHFR(x, 10))#define SHA2_UNPACK32(x, str) \{ \ *((str) + 3) = (uint8) ((x) ); \ *((str) + 2) = (uint8) ((x) >> 8); \ *((str) + 1) = (uint8) ((x) >> 16); \ *((str) + 0) = (uint8) ((x) >> 24); \}#define SHA2_PACK32(str, x) \{ \ *(x) = ((uint32) *((str) + 3) ) \ | ((uint32) *((str) + 2) << 8) \ | ((uint32) *((str) + 1) << 16) \ | ((uint32) *((str) + 0) << 24); \}#endifsha256.cpp#define _CRT_SECURE_NO_WARNINGS#include #include #include "sha256.h" const unsigned int SHA256::sha256_k[64] = //UL = uint32{ 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 }; void SHA256::transform(const unsigned char* message, unsigned int block_nb){ uint32 w[64]; uint32 wv[8]; uint32 t1, t2; const unsigned char* sub_block; int i; int j; for (i = 0; i < (int)block_nb; i++) { sub_block = message + (i << 6); for (j = 0; j < 16; j++) { SHA2_PACK32(&sub_block[j << 2], &w[j]); } for (j = 16; j < 64; j++) { w[j] = SHA256_F4(w[j - 2]) + w[j - 7] + SHA256_F3(w[j - 15]) + w[j - 16]; } for (j = 0; j < 8; j++) { wv[j] = m_h[j]; } for (j = 0; j < 64; j++) { t1 = wv[7] + SHA256_F2(wv[4]) + SHA2_CH(wv[4], wv[5], wv[6]) + sha256_k[j] + w[j]; t2 = SHA256_F1(wv[0]) + SHA2_MAJ(wv[0], wv[1], wv[2]); wv[7] = wv[6]; wv[6] = wv[5]; wv[5] = wv[4]; wv[4] = wv[3] + t1; wv[3] = wv[2]; wv[2] = wv[1]; wv[1] = wv[0]; wv[0] = t1 + t2; } for (j = 0; j < 8; j++) { m_h[j] += wv[j]; } }} void SHA256::init(){ m_h[0] = 0x6a09e667; m_h[1] = 0xbb67ae85; m_h[2] = 0x3c6ef372; m_h[3] = 0xa54ff53a; m_h[4] = 0x510e527f; m_h[5] = 0x9b05688c; m_h[6] = 0x1f83d9ab; m_h[7] = 0x5be0cd19; m_len = 0; m_tot_len = 0;} void SHA256::update(const unsigned char* message, unsigned int len){ unsigned int block_nb; unsigned int new_len, rem_len, tmp_len; const unsigned char* shifted_message; tmp_len = SHA224_256_BLOCK_SIZE - m_len; rem_len = len < tmp_len ? len : tmp_len; memcpy(&m_block[m_len], message, rem_len); if (m_len + len < SHA224_256_BLOCK_SIZE) { m_len += len; return; } new_len = len - rem_len; block_nb = new_len / SHA224_256_BLOCK_SIZE; shifted_message = message + rem_len; transform(m_block, 1); transform(shifted_message, block_nb); rem_len = new_len % SHA224_256_BLOCK_SIZE; memcpy(m_block, &shifted_message[block_nb << 6], rem_len); m_len = rem_len; m_tot_len += (block_nb + 1) << 6;} void SHA256::final(unsigned char* digest){ unsigned int block_nb; unsigned int pm_len; unsigned int len_b; int i; block_nb = (1 + ((SHA224_256_BLOCK_SIZE - 9) < (m_len % SHA224_256_BLOCK_SIZE))); len_b = (m_tot_len + m_len) << 3; pm_len = block_nb << 6; memset(m_block + m_len, 0, pm_len - m_len); m_block[m_len] = 0x80; SHA2_UNPACK32(len_b, m_block + pm_len - 4); transform(m_block, block_nb); for (i = 0; i < 8; i++) { SHA2_UNPACK32(m_h[i], &digest[i << 2]); }} std::string sha256(std::string input){ unsigned char digest[SHA256::DIGEST_SIZE]; memset(digest, 0, SHA256::DIGEST_SIZE); SHA256 ctx = SHA256(); ctx.init(); ctx.update((unsigned char*)input.c_str(), input.length()); ctx.final(digest); char buf[2 * SHA256::DIGEST_SIZE + 1]; buf[2 * SHA256::DIGEST_SIZE] = 0; for (int i = 0; i < SHA256::DIGEST_SIZE; i++) sprintf(buf + i * 2, "%02x", digest[i]); return std::string(buf);}user.h创建一个用户类#pragma once#include //标准输入输出库#include #include #include #include#include "BlockChain.h"#include "sha256.h"using namespace std;class User{public: Blockchain uBlockchain;//当前节点创建一个自己的区块链,因为每个用户都保存一条自己的区块链 string batchTX();//打包交易};user.cpp这里是实现用户的打包交易,通过默克尔树的方式将若干条交易打包。其中300TXdata.txt后面我会贴上,一定注意文件的路径问题,不然可能运行不了。(大神当我没说)。#include"user.h"string User::batchTX(){ ifstream myfile("300TXdata.txt");//读取txt文档中的300条交易数据 string temp[300]; int i = 0; if (!myfile.is_open()) { cout << "未成功打开文件" << endl; } while (getline(myfile, temp[i++]))//将取出来的第一行放在数组中i的位置然后i++ { //cout << temp[i++] << endl; getline(myfile, temp[i++]);//将取出来的下一行放在数组i后面的位置然后i++ //cout << temp[i] << endl; } for (int i = 0; i < 300; i++)//这是一个伪默克尔树生成过程,为了便于实现,就这样写了。 //实际上真的默克尔树生成也不难,暂时先这样吧。 { stringstream ss;//该对象可以通过<<接收多个数据,保存到ss对象中,并通过str方法,将内容赋给一个string对象 ss << temp[0] << temp[i]; temp[0] = sha256(ss.str()); //cout << temp[0] << endl; } myfile.close(); return temp[0];} TestforBitcoin.cpp这就是测试程序了,我是假设100个用户中某个用户挖矿成功了,然后来挖矿。实际上不是这样的过程,而是先挖矿才知道是哪个用户挖矿成功,不过对于一个用户来说,都无所谓了,只是为了模拟的逼真一点,加了个随机数。#include#include#include"Blockchain.h"#include"user.h"#include#include #include #include"time.h"#include"sha256.h"using namespace std;int main(){ srand((int)time(0));//随机数种子 Blockchain bChain = Blockchain();//首先创建一个区块链 User user[100];//创建100个用户 int miner_id; for (int i = 0; i < 100000; i++)//十万次出块,记录出块速度 { miner_id = rand() % 100; for (int j = 0; j < 100; j++) { user[j].uBlockchain = bChain;//把100个节点的区块链初始化。 } user[miner_id].uBlockchain = bChain;//对挖矿区块初始化 printf("Mining block %d...\n", i); user[miner_id].uBlockchain.AddBlock(Block(i, user[miner_id].batchTX())); bChain = user[miner_id].uBlockchain; printf("Miner ID is %d...\n", miner_id); } system("pause"); return 0;}300dataTX.txt这里包含了300条交易,用户A->用户B的转账,以及金额,这个东西我是用一个程序模拟生成的,如果需要这个这个程序我之后再发出来。 01100SUSPE 10111ZKHWI 7910010VQJGH 00100UXYMT 3400011YMAWT 10010XTPCF 4310101TZZMF 01110SHOLR 5101011WVQDR 11101VDFBV 5911001RRPTU 01011QZWRG 6811100TFFJG 10101TMVIS 7600010OBWAS 00001OIMYE 8510000ROVQD 11010RWCPI 9301111MKMHH 01100LSBFT 111011PGDXT 01010OOSVF 1001001KUCNF 10011JBRMR 1810110NQTEQ 00101MXICU 2600000IDKUU 10011HTZSG 3510100LZJKG 01000KHYJS 4301110GVABS 11100FDPZE 5211001JJQRD 00010IQGPH 6000101EFPHH 10000DMFGT 6810111GAGYT 00111GIVWF 7700000BOFOE 11011BWMNR 8511110EKWEQ 01001ESLDU 9301110ZYNVU 11110HNCTG 201001CUMLG 00000BBTKS 1010111XPDCR 10100EXSAD 1900101ADUSD 01111ZLJQH 2711001DZTIH 11001CHIHT 3501110YVJZT 01111XCZXF 4411100BJAPE 00111AQQNQ 2000010WFZFQ 10000VMOEU 2810111ZSQWU 00110YAFUG 3700101UOHMF 11110TWWLS 4511011WKGCR 01001WRVBD 5401101RYXTD 10111RFMRH 6210000UUWJH 00101UBDIT 7000010PHNSS 10000OXCYE 7910100SDEIE 01110RLTOQ 8701011NZCYQ 11100MGKFU 9511011QNTPU 01010PUJVG 411101LJKFF 10111KQALR 1200010OEJVR 00101NMYCD 2110000JSAMD 11011IAPSH 2901100MORCG 01100LWGIT 3711010HCQSS 11000GRFZE 4601001JYHJE 10010JFWPQ 5410111ETYZQ 00100MBNGU 6200011HHXQT 10011HPMWF 7110000CDNGF 01011JLDMR 7901110FZMWR 11101EGUDD 8811000ANDND 00010HUTTH 9600101DIUDG 10000CQJJS 410111GWTTS 00100FMAAE 1300001BSKKE 11011AAZQQ 2111111EOBAQ 01001DVQGU 2901110ZCAQT 11111YJPXF 3801000CXRHF 00011BFGNR 4610110WTIXR 10000WBXED 5500101ZHGNC 01110ZPWUG 6311001UDXEG 11000UKNKS 7101111XROUS 01101XYEBE 8011100SMNLE 00111RUCRQ 8800010VIEBP 10001UQTHT 9610110QWDRT 00110PEKYF 500100TSUIF 11110SZJOR 1311011OGLYR 01000NVAED 2201101RBKOC 10110QJRVG 3011001MXBFG 00101LFQLS 3800010PLRVS 10001OTHCE 4710100KHQLD 01111JOGKQ 5501000MDHCP 11100MKXAT 6311011HQYST 01010PYNRF 7211101KMXJF 10110KUMHR 8000011FAOZQ 00101MQDXC 8910011IWFPC 11011HDUOG 9700100DSEGG 01101KZTES 511010GFVWS 11001FNKUE 1401000JBUMD 10010IJBLP 2210101EXKDP 00100DFABT 3000011HLBTT 10010GSRRF 3910001CHAJE 01011BOIIR 4701111FVRAQ 11101ECGYC 5611010ZQIQC 00011ZYXPG 6401000CMHHG 10010CUWFS 7210110XAYXR 00100XHNVD 4900001AWPND 11010ADEMP 5711101VKOEP 01000UZDCT 6501111YFFUT 11101XNUSF 7401000TBVKE 00011SJLJQ 8210110WPUBQ 10001VWKZC 9100110RLLRC 01110QSBPG 9910000UHKHF 11010TORGS 701111PUBYR 01000OCQWD 1611101SQSOD 00110RYHNP 2400001NEREP 10001UUGDT 3210110PAIVS 00101PHXTE 4100100KWZLE 11111SDOKQ 4911010NJYCQ 01000NRNAC 5801111IFOSC 10110PNEQG 6611101LBFIF 00110KJVHR 7400011OPEZR 10001NWUXD 8310101JLVHD 01111ISKNP 9101000MYMXP 11101LOBET 9911010HULOS 01001GCAUE 811100KQCEE 10110JYRLQ 1600011FEBUQ 00100ELIBC 2510011IASLB 11010HHHRF 3300101CVJBF 01111CDYIR 4111010FJHSR 11101FRXYD 5001000AFYID 10011ANOOP 5810100DTPYO 00100CAFFS 6600010YPOPS 10000XWDVE 7510001BKFFE 01010ASULQ 8301111WYWVQ 11100VGLCC 9211011ZUVMB 00011YCKSF 001000UIMCF 10011TXBIR 810110XEDSR 00101WLSZD 1700000SZCJC 11010RHRPP 2511001VNSZO 01000UVIGS 3301111QJRQS 11100XRZWE 4211001SFIGE 00011SMYMQ 5010101NTZWP 10001VAODB 5900110QOYNB 00111QWNTF 6710000LCPDF 11011SSEJR 7501110OYGTR 01000NGVAD 8411111RUFKC 00110QBUQO 9200001MIWAO 10000LPLGS 010111PDNQS 00001OLCXE 900101KZLHD 11111JHBNQ 1711000NNCXP 01001MVSEB 2601110IJTNB 11111HQJUF 3411100LXSEF 00110KEHKR 4200011FTJUQ 10000FAYBC 5110111IOILC 01110IWPJO 5901101DCZBO 11111DKOZS 6711010GYQRS 01001FFFQE 7601100BMPID 10111ABEGP 8400000EIGYP 00100DPVWB 9310010ZDWOB 10000YLMNF 100101CRVFE 01110BZLDR 7711011XNMVQ 11100WUCUC 8601011AJDLC 10011ZQSKO 9410100VXCCO 00111UERAS 200010YSTSR 10101XAIRD 1110000SGKJD 01010AWZHP 1901101VCJZP 11100VKYXB 2811011QYAPB 01000YFPOF 3601001TMZGE 10011TTGEQ 4410111WHPWQ 00101VPFUC 5300010RDGMC 11011QLWLO 6111000URFDO 01011TZVBS 6901110PNWTR 11100OULRD 7811001SBNJD 00010RQCIP 8610001NWMAP 10000MEBYB 9500111QSDQA 00101PASPE 310000LGUHE 11011KOJFQ 1101110OCTXQ 01001NJIVC 2011110IYKNC 00110IFZMO 2800000LLAEN 10010LTQCR 3610111GHZUR 00000GPPSD 4500101JVQKD 11110IDGJP 5311001ERPBP 01001DYWZB 6201110HNGRA 11001GUVPE 7011100CAXHE 00111BIMGQ 7800010FWWYQ 10000EELWC 8710110AKNGB 01110ZACNO 9501101DGEWN 11110CNTDR 311011YCDNR 01001FJSTD 1201101BPTDD 10111AXJKP 2000100VLKUO 00101DTAAA 2910010YHJKA 10001YPZQE 3700100TVAAE 01110BCPHQ 4511001WRRRQ 11100WYGXC 5401011ZEQHB 10010YUFNN 6210101UAHXN 00111TIWER 7000011XWGOR 10101WENUD 7910010SKXEC 01011RRMLP 8701100VGOUO 11101UNDBA 9601001QMXMO 11010QCMLA 411001TIODA 01001TPDBE 6411110OEFTD 10101OLUSP 7300000RREKP 00011RZTIB 8110110MNVAB 11000LVKYN 9001110PJMQM 01110ORBPR 9811001KXLHQ 11010JEAFC 601111NTCXC 10000MARVO 1510101IGANO 00111HWIMA 2300000LCREZ 10001KKHCD 3110110GYIUD 01001FGXSP 4001100JMHKP 11110ITWJB 4811011EIYBB 00000DPNZN 5700111GDPRM 10110GLEQQ 6510101BROHQ 00111BZDGC 7300011ENFYC 11001EVUWO 8211100ZBWOO 01111YILNA 5801100CXVFZ 11101BEKDD 6611010XSLVD 00000WABTP 7510101AGCDP 10110ZOSKB 8300011VCBUA 01100CKQAN 9211011YQSKM 11011XFHQQ 001101TMRAQ 01111ATYHC 811010WHIRC 00101VPXXO 1700000RVZHN 10010YDONZ 2510100TRYXZ 00100TZNED 3300011WNPOD 11100WUEUP 4211001RBGEP 01010RIVLB 5001111UWEVA 10101TEUBM 5910010PKVLM 00011OALRQ 6700000SGMBQ 10011ROCIC 7510110NCLSB 01100MJAYO 8401010QQCIN 11010PXROZ 9211001LLTYZ 01000KTIFD 001111OHSPD 10100NPHVP 900001JVJFO 00011IDYLA 1710000MRIVA 11001LYPCM 2601110HFZMM 01111GMOSQ 3411000JBPCQ 11010JIFJC 4201111EWOTB 10000EEEZN 5110111HKFJN 00110HSVPZ 5900001CGWZZ 10001BNLGD 6710111FUVQC 01001EJKWP 7601100AQMGO 11111HXBMA 8411000DLDWA 00001CTSDM 9300110YZCNM 10000FHRTQ 110101BVTDP 00110ACIJB 900011WRKTB 11000DYZAN 1811111ZFIKN 01111YMYQZ 2601100CAZAZ 11111BIPHD 3411010WOYQC 00001WEGXO 4310100ZKPHO 10110ZSEFA 5100100UGGXA 01100UNVWM 6011011XUFOL 11000WBUMQ 6801101SPWEP 01110RXLCB 7611011VLNUB 00101UTCTN 8500010QZMLN 10011PHBJZ 9310100TVDBY 00111SCSZC 100010OJTRC 11100NYJQO 1011000RESIO 01010QMIGA 1801101MAJYA 10100LIZWM 2711011POAOL 00101OWPNP 3500001JKZFP 10011JRODB 4310110MGQVB 01101MNFUN 5201010HTPMN 11011HBWKZ 6011000KPGCY 01010KXVAC 6801111FDXSC 10100ELMRO 7700001IZWJO 00010HGLHA 8510001DVMZZ 11001KCCXL 9400111GIDPL 01101FQTOP 211000BECGP 11011IMSEB 1001010ESTWB 10001DIIUN 1910110ZOKMM 00110GVZLY 9500001CKJDY 10010BRYBC 310111FXATC 01000EFPSO 1201101ZTRKO 11111ZBGIA 2011000CPQAZ 00001CXFYL 2901110XDHQL 10001XKWPP 3710100AZFHP 00110ZGNFB 4500010VMWXA 11000UCMVN 5411111YINNM 01010XQDMY 6201101TEMEY 11110SMBCC 7011011WSDUC 00001VZSSO 7910110ROUCN 10111QVJJZ 8700100UJTTZ 01101TRIZL 9610010PXKJL 11000OFZQP 401101STBZP 01110RBQGB 1211101MHAQA 00100MOPWM 2100011PDQGM 10011PKGNY 2910101KZHXY 00111KGXDC 3700010NMGNB 11101NUWTO 4611010IIXDN 01011PQMKZ 5401100LWWUZ 10100KLDAL 6311011GSNKL 00100NZCQP 7100001JOEAO 10010IVTHA 7910101EBDRA 01101LJSXM 8801010HXUHM 11101GFJNY 9611000KTLXY 01011JAAEC 401110FHJOB 10100EOZUN 1300010IDAEN 00010HKQLZ 2110001CQRVZ 11010CGHBL 3000111FMQLK 01100FUFRP 3811001AIHBO 11011AQWIA 4601000DWGSA 10001CDNYM 5510110YSXIM 00101XZMOY 6300000BNOYX 10010AVDFB 7110110WBNPB 01000VJUVN 8001111ZXEFN 11110YFTLZ 8811001ULUVZ 00011TAKCL 9701111XHTMK 10001WOJSO 510100SCKCO 00111RKAJA 1300000VQBTA 11001UYQZM 2211110PMAJM 01000PUPPY 3001101SIRZX 11110SPGGB 3811011NWIQB 00000NDXWN 4710111QRHGN 10111PZWEZ 5500101LFYWY 00111SNNVK 6410010OBXNK 11001NJELO 7201100JXNDO 01111QEDBA 8011100MLETA 00100LSUSM 8900011HGDKL 10000OOLIX 9710101KUUAX 00110JKJZB 500111NQLQB 11101MYAPN 1411010IMKHN 01011HTZFZ 22发布于 2020-12-21 15:46比特币 (Bitcoin)btc挖矿42BTC​赞同 98​​7 条评论​分享​喜欢​收藏​申请转载​文章被以下专栏收录SCI | 科技与生活科学技术是第一

比特币的工作原理 - 比特币

比特币的工作原理 - 比特币

Bitcoin.org 是一个社区支持的社区,我们十分感谢任何捐助。这些捐助会用于改进网站。

捐助

Bitcoin.org 需要你的帮助!

×

捐助Bitcoin.org

使用下方二维码或地址

3E8ociqZa9mZUSwGdSmAEMAoAxBK3FNDcd

$5.00

(... BTC)

$25.00

(... BTC)

$50.00

(... BTC)

介绍

个人

商家

开发者

入门指南

工作原理

White paper

资源

资源

兑换

社区

词汇表

活动

比特币核心

创新

参与

支持比特币

购买比特币

开发

常见问题

简体中文

Bahasa Indonesia

Català

Dansk

Deutsch

English

Español

Français

Italiano

Magyar

Nederlands

Polski

Português Brasil

Română

Slovenščina

Srpski

Svenska

Türkçe

Ελληνικά

български

Русский

Українська

Հայերեն

العربية

فارسی

עברית

हिन्दी

한국어

ខ្មែរ

日本語

简体中文

繁體中文

Bahasa Indonesia

Català

Dansk

Deutsch

English

Español

Français

Italiano

Magyar

Nederlands

Polski

Português Brasil

Română

Slovenščina

Srpski

Svenska

Türkçe

Ελληνικά

български

Русский

Українська

Հայերեն

العربية

فارسی

עברית

हिन्दी

한국어

ខ្មែរ

日本語

简体中文

繁體中文

Language: zh_CN

比特币的工作原理

这是个经常引起混淆的问题,下面是个简明扼要的解释!

新用户所需了解的基本知识

作为新用户,你可以开始使用比特币,而不需要理解其中的技术细节。一旦你在电脑或手机上安装一个比特币钱包,它会生成你的第一个比特币地址,并且在你需要的任何时候都可以生成更多的地址。你可以将你的地址告诉你的朋友们,他们便能够通过这个地址向你支付比特币,反之亦然。事实上,这跟电子邮件的运作方式是非常相似的,除了一个比特币地址应该只被使用一次。

余额 - 区块链

比特币区块链是整个比特币网络所依赖的公共共享总帐。所有确认的交易均包含在区块链中。这样比特币钱包可以计算出可用余额,并核实新的交易中消费方花费的确实是自己的比特币。密码学确保了区块链的完整性和时间顺序。

交易 - 私钥

一笔交易是指包含在区块链里的比特币钱包之间的价值转移。 比特币钱包保存着一份称作私钥或种子的保密数据用来为交易签名,即提供数学证据证明这些交易来自钱包的拥有者。这个 签名也确保交易发生后不会被任何人修改。所有的交易在用户之间广播,通常在接下来的10-20分钟内通过一个称作 挖矿的处理过程开始被比特币网络所确认。

处理 - 挖矿

挖矿是个将待确认的交易数据包含到区块链中,从而完成对这些交易进行确认的分布式共识系统。通过挖矿,可以强制性保证块链中的数据按时间顺序存储,保持比特币网络的中立性,且允许比特币网络上不同的计算机对系统状态达成一致。交易要获得确认,必须要被打包到一个符合非常严格的密码学规则的区块中,并通过比特币网络进行验证。这些规则可以防止对已有块的修改,因为一旦有改动,之后所有的块都将失效。挖矿的难度和中彩票相当,没人可以轻易地、连续地将新块加入到块链中。因此,没有集体和个人可以控制块链中包含什么样的内容或者替换掉块链中的部分内容以达到撤销他们交易的目的。

深入探究

这只是一份比特币的概要。如果你需要更多的细节,你可以阅读描述了比特币设计的最初的论文,开发者文档,或者查看比特币百科。

支持Bitcoin.org:

捐助

3E8ociqZa9mZUSwGdSmAEMAoAxBK3FNDcd

介绍:

个人

商家

开发者

入门指南

工作原理

注意事项

White paper

资源:

资源

兑换

社区

词汇表

活动

比特币核心

参与:

支持比特币

开发

其他:

法律

Privacy Policy

新闻媒体

关于bitcoin.org

Blog

© Bitcoin Project 2009-2024 基于MIT协议授权发布

Network Status

简体中文

Bahasa Indonesia

Català

Dansk

Deutsch

English

Español

Français

Italiano

Magyar

Nederlands

Polski

Português Brasil

Română

Slovenščina

Srpski

Svenska

Türkçe

Ελληνικά

български

Русский

Українська

Հայերեն

العربية

فارسی

עברית

हिन्दी

한국어

ខ្មែរ

日本語

简体中文

繁體中文

Bahasa Indonesia

Català

Dansk

Deutsch

English

Español

Français

Italiano

Magyar

Nederlands

Polski

Português Brasil

Română

Slovenščina

Srpski

Svenska

Türkçe

Ελληνικά

български

Русский

Українська

Հայերեն

العربية

فارسی

עברית

हिन्दी

한국어

ខ្មែរ

日本語

简体中文

繁體中文

zh_CN

比特币挖矿算法详解 - 知乎

比特币挖矿算法详解 - 知乎首发于清源的区块链实验室切换模式写文章登录/注册比特币挖矿算法详解清源区块链工程师比特币网络中,源源不断的收到交易,需要节点不断的打包这些交易,而网络中的所有节点都是对等的,如何判断谁可以打包这些交易,如何避免重复打包这些交易呢?这个时候就需要用到工作量证明(PoW,Proof-of-Work)的方式决定记账权。网络中的任何全节点,都可以试图创建区块,但区块只有在至少满足下列条件时创建的区块才会被其他节点认可和接受。 区块中包含的交易都是合法的; 区块哈希要小于等于一个目标值;要满足第一个条件很简单,节点只要将每笔交易都验证一遍,丢弃掉不合法的交易即可。但要满足第二个条件就需要挖矿。挖矿比特币挖矿就是找到一个随机数(Nonce)参与哈希运算Hash(Block Header),使得最后得到的哈希值符合难度要求,用公式表示就是Hash(Block Header)<= target 比特币采用的哈希算法是 SHA-256 ,也就是说最后会产生256位的输出,一共2^256种可能的取值。 最后得到的哈希值小于target的意思是把哈希后得到的bytes转换成数字后小于target转换成的数字。举个例子,直观的感受一下挖矿的难度;SHA-256计算123的值

a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3

下面这段字符是比特币第1000个区块的哈希(2009年1月产生);

00000000c937983704a73af28acdec37b049d214adbda81d7e2a3dd146f6ed09

可以看到前面有8个0,虽然哈希值的生成是随机的,但是生成前面有8个0的值对计算机穷举来说也并不算太难。

再看一下这段字符,是比特币第560000个区块的哈希(2019年1月产生);

0000000000000000002c7b276daf6efb2b6aa68e2ce3be67ef925b3264ae7122

可以看到前面有18个0,要生成满足这个条件的哈希对于普通电脑来说几乎是不可能完成的任务了。简单来看挖矿难度的高低就是生成区块头的哈希值有多少0。挖矿难度在比特币系统中出块时间被设置为一个常数10分钟,但是挖出区块的速度并不是固定的,而是随着挖矿难度的变化在10分钟上下浮动, 挖矿难度越大,出块时间就越长,为了得到相对平均的出块时间,需要动态调整挖矿难度。 比特币每产生2016个区块调整一次挖矿难度,一个块10分钟,2016个块大概是两周的时间,而调整挖矿难度的这些逻辑都在代码中,当大多数诚实节点采用这个策略的时候整个网络就会自动遵循这个策略。挖矿难度的计算公式如下:diffculty = difficulty_1_target / target此处的 difficulty_1_target 为一个常数,非常大的一个数字( 2^(256-32)−1 )。表示挖矿的初始难度,目标值越小,区块生成难度越大。 2^(256-32)−1 是比特币的初始难度,是前2016个块的难度。 这个难度被存储在比特币的区块头nBits字段中,当有恶意节点篡改这个策略时,挖矿产生的区块头的哈希值就会和诚实节点产生冲突,不会被接收,白白浪费了算力。 因为策略不同,也就是nBits不同,恶意节点产生的区块哈希无法被诚实节点验证。 调整出块时间比特币系统中区块的生产速度是根据之前产生区块速度调整的,之前出块速度大于10分钟,则认为需要降低难度,则需要提高第一个公式中target的值,而target则通过如下公式计算;target = current_target * ( actual time / excepted time )current_target是当前系统中的难度值,target是调整后的难度值,actual time是实际产生区块的时间,excepted time是期望出块时间(2016块*10分钟),actual time有上下限,actual time最多8周,最小二分之一周。挖矿算法比特币中nBits标识了挖矿的难度,也就是说这个区块头进行SHA-256哈希算法后得到的bytes转换成数字后要小于这个难度,而SHA-256计算后的结果有256位,如果直接存储需要32个字节比较占用空间,所以采用了一种压缩算法。压缩算法nBits有4个字节32位,将SHA-256计算得到的值经过如下算法压缩到32位;将数字转换为 256 进制。如果第一位数字大于 127(0x7f),则前面添加 0。压缩结果中的第一位存放该256进制数的位数。后面三个数存放该256进制数的前三位,如果不足三位,从后补零。举个例子,将十进制1000压缩;1. 1000转换256进制数,1000 = 3 * 256 + 232 = 3*256^(2-1) + 232*256^(1-1)

2. 3小于127,不需要补0,跳过

3. 从第一部看到1000转换成256位数有2位,压缩结果第一位应该存放2

4. 因为只有两位,所以最后一位补0,得到存放的值为 [2, 3, 232, 0]十进制,转换十六进制 [0x02, 0x03, 0xe8, 0x00] 合并存储到nbits为 0x0203e800难度计算在第一个公式中difficulty_1_target的值为 2^(256-32)-1,转换成256进制为;FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF第一位大于0x7f,前面补0,变为00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF其长度等于 28+1=29 (0x1d),且长度超过三位,无需补零,则压缩结果为:0x1d00FFFF,因为压缩存储容量只有才4个字节,前两字节已经被长度和添加的 00 所占用,只剩下2个字节来存储数字,这样后面的26个 FF 值被丢弃。T=0x00FFFF * 256^(0x1b-3) = 0x00000000FFFF0000000000000000000000000000000000000000000000000000比特币中的difficulty就是0x1d00FFFF,如果区块中的nBits为0x1d00FFFF则说明这个区块挖矿难度为最小挖矿难度1.实际上专业的矿池程序会保留被截断的FF:00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF我们算一下比特币101799号区块的挖矿难度,通过区块链浏览器可以看到101799号区块的nBits为0x1b0404cbD = 0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF / 0x00000000000404CB000000000000000000000000000000000000000000000000 = 16307.669773817162 (pdiFF)pdiFF也被称为矿池难度。算力为了找到符合条件的值在挖矿的时候需要不断的调整区块头中Nonce的值,但是又会有一个问题,在比特币中Nonce的值是32位的,如果挖矿难度太大,就算穷尽Nonce的所有可能还是不能算出符合条件的值。铸币交易在一个区块产生的时候,会有一个铸币交易(coinbase),也就是矿工为自己铸币,产生新的比特币。铸币交易没有UTXO输入,只有输出指向自己的比特币地址,当挖矿成功,这个区块被网络接收的时候,新产生的币就转移到这个矿工地址了。看一下铸币交易包含的字段; transaction hash:“交易哈希”字段32个字节全部填充0(因为其没有UTXO输入);ouput index:“交易输出索引”字段全部填充0xFF(十进制的255); coinbase data:coinbase数据长度最小2字节,最大100字节。除了开始的几个字节外,矿工可以任意使用coinbase的其他部分,随意填充任何数据。以创世块为例,中本聪在coinbase中填入了这样的数据“The Times 03/Jan/ 2009 -Chancellor on brink of second bailout for banks“; - coinbase data size:coinbase数据大小; sequence number:现在未使用,设置为0xffffffff可以看到铸币交易的coinbase data字段是我们可以控制的,当Nonce不能满足挖矿难度的时候,我们可以通过调整coinbase data字段,从而影响区块头的默克尔树根的值,提供更多的可能来满足挖矿难度的要求。算力单位通过上面的流程,进行一次可能的挖矿尝试被称为H。 1 H/s = 每秒可执行一次哈希运算。 1 KH/s = 每秒1,000哈希(一千次)。 1 MH/s = 每秒1,000,000次哈希(百万次)。 1 GH/s = 每秒1,000,000,000次哈希(十亿次)。 1 TH/s = 每秒1,000,000,000,000次哈希(万亿次)。 1 PH/s = 每秒1,000,000,000,000,000次哈希。 1 EH/s = 每秒1,000,000,000,000,000,000次哈希。挖矿收益矿机挖矿的时候就会出现很长的时间找不到符合条件的哈希值,如果找不到哈希值不能打包区块就没有收益,显然对矿工十分不友好,但是如果挖到就像中彩票一样获得非常丰厚的回报。矿池为了避免单个矿工挖矿收益的不稳定性,就出现了矿池,矿池集合了大量的矿工,平均挖矿的收益,避免了挖矿收益的不稳定性。 矿池组织大量的矿工挖矿面临很重要的一个问题就是如何把高难度计算哈希的任务拆解成相对简单的任务,发送给单个矿工,回顾之前挖矿难度的计算,可以简单的认为前面0的多少表明了挖矿的难易。 0越多,挖矿难度越高,为了降低挖矿难度我们就要增加挖矿哈希0的数量,举个例子假设挖矿目标值 0x000abc,只要满足这个值就可以打包区块获得挖矿收益;

降低挖矿难度为 0x001abc,发送给矿工,矿工只要计算区块头满足这个相对低一点的难度就可以得到一个分片(shared),但是单个矿工挖到这个简单难度的块是无法发布到整个网络中的,但是矿池可以把这个分片记录下来,作为以后给这个矿工奖励的凭证。

0x001abc是0x000abc的子集,只要子集足够多总有一个会满足目标值。

当有一个矿工挖出一个满足目标值之后就可以获得挖矿收益,而挖矿就可以根据矿工分片多少来获得收益。

矿工收益 = 挖矿收益 / 挖到的分片数量但是现在还有一个问题没有解决,单个矿工挖到目标值以后如果私吞收益,私自广播区块怎么办?矿池有集中托管式的,也有分布式的。 集中托管式矿池,矿工可以把挖矿的机器托管给矿池,由矿池统一操作维护,只需要支付一些电费管理费即可,这样就避免了私自广播。 分布式矿池,矿工将机器自行管理,通过矿池协议从网络连接矿池即可,这样就会出现私自广播的可能。回顾一下铸币交易coinbase,可以看到有output字段,UTXO模型中币的来源都是上一个交易的output,所以可以把铸币交易的output字段设置为矿池的地址,然后随机生成一些coinbase data的填充后生成区块头的默克尔树,最后发由矿工去尝试目标值。通过这样的方式,即使矿工找到满足条件的哈希值,铸币交易的地址也是矿池的地址,私自广播区块没有任何收益,如果调整铸币交易的地址,这样又回到了独立挖矿的场景。全网算力如果要获知全网算力,可以通过出块时间,挖矿难度大致反推出全网算力。区块确认当一个区块产生之后,它不是立即可信的,网络上的节点总是相信最长的区块链,当一条交易记录被打包进一个区块之后,就有了一个确认,而这个区块所在的链后面被再加入一个区块,就是第二个确认,如此下去,一个交易有了6个确认,我们就认为这个交易已经确定了,会被永远记录在区块链中。 为什么是6个确认呢?因为每一个确认就是一个挖矿过程,需要大量的工作量证明,因此,这6个区块被同一个矿工创建的可能性微乎其微(可以说是不可能),因此矿工伪造交易也基本不可能。由于比特币的区块平均产生时间是10分钟,所以一个交易要1小时左右才能保证成功(最快),不过也不是所有的系统都这样认为,有些网站在接受比特币支付时,认为4个确认就可以给客户发货了,区块确认越多则越难被逆转。区块广播在区块链中,为了尽快收到其他节点的信息,节点间并不是直接传递区块信息的。 节点向附近节点发送一个Inv消息,Inv消息中包含已经被发送者(sender)接收并验证过的“交易记录的哈希”、以及“区块哈希”。接收者(receiver)收到Inv消息后,如果他还尚未从其他节点收到过相同的信息,他会发送一个getdata消息给发送者,要求得到交易记录及区块哈希包含的具体信息。此时,区块和交易记录的信息才会进行整体传递。 其中Inv消息结构如下;type MsgInv struct {

InvList []*InvVect

}

type InvVect struct {

Type InvType // Type of data

Hash chainhash.Hash // Hash of the data

}欢迎关注我的博客(qyuan.top),不定期分享一些区块链底层技术文章,博客排版要比知乎好一点(ㄟ( ▔, ▔ )ㄏ)。编辑于 2020-05-12 11:18挖矿区块链(Blockchain)比特币 (Bitcoin)​赞同 82​​11 条评论​分享​喜欢​收藏​申请转载​文章被以下专栏收录清源的区块链

挖矿原理 - 廖雪峰的官方网站

挖矿原理 - 廖雪峰的官方网站

Index

廖雪峰的官方网站

Blog

Java教程

手写Spring

手写Tomcat

Makefile教程

Python教程

JavaScript教程

区块链教程

SQL教程

Git教程

文章

问答

More

Java教程

手写Spring

手写Tomcat

Makefile教程

Python教程

JavaScript教程

区块链教程

SQL教程

Git教程

文章

问答

Java教程

手写Spring

手写Tomcat

Makefile教程

Python教程

JavaScript教程

区块链教程

SQL教程

Git教程

文章

问答

 

Profile

Passkey

Sign Out

Sign In

English

简体中文

Index

区块链教程

比特币

区块链原理

P2P交易原理

私钥

公钥和地址

签名

挖矿原理

可编程支付原理

多重签名

UTXO模型

Segwit地址

HD钱包

钱包层级

助记词

地址监控

以太坊

账户

区块结构

交易

智能合约

编写合约

部署合约

调用合约

编写Dapp

常用合约

ERC20

Wrapped Ether

关注公众号不定期领红包:

加入知识星球社群:

关注微博获取实时动态:

挖矿原理

Last updated: ...

/

Reads: 3275766

Edit

在比特币的P2P网络中,有一类节点,它们时刻不停地进行计算,试图把新的交易打包成新的区块并附加到区块链上,这类节点就是矿工。因为每打包一个新的区块,打包该区块的矿工就可以获得一笔比特币作为奖励。所以,打包新区块就被称为挖矿。

比特币的挖矿原理就是一种工作量证明机制。工作量证明POW是英文Proof of Work的缩写。

在讨论POW之前,我们先思考一个问题:在一个新区块中,凭什么是小明得到50个币的奖励,而不是小红或者小军?

当小明成功地打包了一个区块后,除了用户的交易,小明会在第一笔交易记录里写上一笔“挖矿”奖励的交易,从而给自己的地址添加50个比特币。为什么比特币的P2P网络会承认小明打包的区块,并且认可小明得到的区块奖励呢?

因为比特币的挖矿使用了工作量证明机制,小明的区块被认可,是因为他在打包区块的时候,做了一定的工作,而P2P网络的其他节点可以验证小明的工作量。

工作量证明

什么是工作量证明?工作量证明是指,证明自己做了一定的工作量。例如,在驾校学习了50个小时。而其他人可以简单地验证该工作量。例如,出示驾照,表示自己确实在驾校学习了一段时间:

比特币的工作量证明需要归结为计算机计算,也就是数学问题。如何构造一个数学问题来实现工作量证明?我们来看一个简单的例子。

假设某个学校的一个班里,只有一个女生叫小红,其他都是男生。每个男生都想约小红看电影,但是,能实现愿望的只能有一个男生。

到底选哪个男生呢?本着公平原则,小红需要考察每个男生的诚意,考察的方法是,出一道数学题,比如说解方程,谁第一个解出这个方程,谁就有资格陪小红看电影:

因为解高次方程没有固定的公式,需要进行大量的计算,才能算出正确的结果,这个计算过程就需要一定的工作量。假设小明率先计算出了结果x=2.5,小红可以简单地验证这个结果是否正确:

可以看出,解方程很困难,但是,验证结果却比较简单。所以,一个有效的工作量证明在于:计算过程非常复杂,需要消耗一定的时间,但是,验证过程相对简单,几乎可以瞬间完成。

现在出现了另一个问题:如果其他人偷看了小明的答案并且抢答了怎么办?

要解决这个问题也很容易,小红可以按照男生的编号,给不同的男生发送不同的方程,方程的第一项的系数就是编号。这样,每个人要解的方程都是不一样的。小明解出的x=2.5对于小军来说是无效的,因为小军的编号是3,用小明的结果验证小军的方程是无法通过验证的。

事实上如果某个方程被验证通过了,小红可以直接从方程的第一项系数得知是谁解出的方程。所以,窃取别人的工作量证明的结果是没有用的。

通过工作量证明,可以有效地验证每个人确实都必须花费一定时间做了计算。

在比特币网络中,矿工的挖矿也是一种工作量证明,但是,不能用解多项式方程来实现,因为解多项式方程对人来说很难计算,对计算机来说非常容易,可以在1秒钟以内完成。

要让计算机实现工作量证明,必须找到一种工作量算法,让计算机无法在短时间内算出来。这种算法就是哈希算法。

通过改变区块头部的一个nonce字段的值,计算机可以计算出不同的区块哈希值:

直到计算出某个特定的哈希值的时候,计算结束。这个哈希和其他的哈希相比,它的特点是前面有好几个0:

hash256(block data, nonce=0) = 291656f37cdcf493c4bb7b926e46fee5c14f9b76aff28f9d00f5cca0e54f376f

hash256(block data, nonce=1) = f7b2c15c4de7f482edee9e8db7287a6c5def1c99354108ef33947f34d891ea8d

hash256(block data, nonce=2) = b6eebc5faa4c44d9f5232631f39ddf4211443d819208da110229b644d2a99e12

hash256(block data, nonce=3) = 00aeaaf01166a93a2217fe01021395b066dd3a81daffcd16626c308c644c5246

hash256(block data, nonce=4) = 26d33671119c9180594a91a2f1f0eb08bdd0b595e3724050acb68703dc99f9b5

hash256(block data, nonce=5) = 4e8a3dcab619a7ce5c68e8f4abdc49f98de1a71e58f0ce9a0d95e024cce7c81a

hash256(block data, nonce=6) = 185f634d50b17eba93b260a911ba6dbe9427b72f74f8248774930c0d8588c193

hash256(block data, nonce=7) = 09b19f3d32e3e5771bddc5f0e1ee3c1bac1ba4a85e7b2cc30833a120e41272ed

...

hash256(block data, nonce=124709132) = 00000000fba7277ef31c8ecd1f3fef071cf993485fe5eab08e4f7647f47be95c

比特币挖矿的工作量证明原理就是,不断尝试计算区块的哈希,直到计算出一个特定的哈希值,它比难度值要小。

比特币使用的SHA-256算法可以看作对随机输入产生随机输出,例如,我们对字符串Hello再加上一个数字计算两次SHA-256,根据数字的不同,得到的哈希是完全无规律的256位随机数:

hash256("Hello?") = ????????????????????????????????????????????????????????????????

大约计算16次,我们可以在得到的哈希中找到首位是0的哈希值,因为首位是0出现的概率是1/16:

hash256("Hello1") = ffb7a43d629d363026b3309586233ab7ffc1054c4f56f43a92f0054870e7ddc9

hash256("Hello2") = e085bf19353eb3bd1021661a17cee97181b0b369d8e16c10ffb7b01287a77173

hash256("Hello3") = c5061965d37b8ed989529bf42eaf8a90c28fa00c3853c7eec586aa8b3922d404

hash256("Hello4") = 42c3104987afc18677179a4a1a984dbfc77e183b414bc6efb00c43b41b213537

hash256("Hello5") = 652dcd7b75d499bcdc61d0c4eda96012e3830557de01426da5b01e214b95cd7a

hash256("Hello6") = 4cc0fbe28abb820085f390d66880ece06297d74d13a6ddbbab3b664582a7a582

hash256("Hello7") = c3eef05b531b56e79ca38e5f46e6c04f21b0078212a1d8c3500aa38366d9786d

hash256("Hello8") = cf17d3f38036206cfce464cdcb44d9ccea3f005b7059cff1322c0dd8bf398830

hash256("Hello9") = 1f22981824c821d4e83246e71f207d0e49ad57755889874d43def42af693a077

hash256("Hello10") = 8a1e475d67cfbcea4bcf72d1eee65f15680515f65294c68b203725a9113fa6bf

hash256("Hello11") = 769987b3833f082e31476db0f645f60635fa774d2b92bf0bab00e0a539a2dede

hash256("Hello12") = c2acd1bb160b1d1e66d769a403e596b174ffab9a39aa7c44d1e670feaa67ab2d

hash256("Hello13") = dab8b9746f1c0bcf5750e0d878fc17940db446638a477070cf8dca8c3643618a

hash256("Hello14") = 51a575773fccbb5278929c08e788c1ce87e5f44ab356b8760776fd816357f6ff

hash256("Hello15") = 0442e1c38b810f5d3c022fc2820b1d7999149460b83dc680abdebc9c7bd65cae

如果我们要找出前两位是0的哈希值,理论上需要计算256次,因为00出现的概率是162=256,实际计算44次:

hash256("Hello44") = 00e477f95283a544ffac7a8efc7decb887f5c073e0f3b43b3797b5dafabb49b5

如果我们要找出前3位是0的哈希值,理论上需要计算163=4096次,实际计算6591次:

hash256("Hello6591") = 0008a883dacb7094d6da1a6cefc6e7cbc13635d024ac15152c4eadba7af8d11c

如果我们要找出前4位是0的哈希值,理论上需要计算164=6万5千多次,实际计算6万7千多次:

hash256("Hello67859") = 00002e4af0b80d706ae749d22247d91d9b1c2e91547d888e5e7a91bcc0982b87

如果我们要找出前5位是0的哈希值,理论上需要计算165=104万次,实际计算158万次:

hash256("Hello1580969") = 00000ca640d95329f965bde016b866e75a3e29e1971cf55ffd1344cdb457930e

如果我们要找出前6位是0的哈希值,理论上需要计算166=1677万次,实际计算1558万次:

hash256("Hello15583041") = 0000009becc5cf8c9e6ba81b1968575a1d15a93112d3bd67f4546f6172ef7e76

对于给定难度的SHA-256:假设我们用难度1表示必须算出首位1个0,难度2表示必须算出首位两个0,难度N表示必须算出首位N个0,那么,每增加一个难度,计算量将增加16倍。

对于比特币挖矿来说,就是先给定一个难度值,然后不断变换nonce,计算Block Hash,直到找到一个比给定难度值低的Block Hash,就算成功挖矿。

我们用简化的方法来说明难度,例如,必须计算出连续17个0开头的哈希值,矿工先确定Prev Hash,Merkle Hash,Timestamp,bits,然后,不断变化nonce来计算哈希,直到找出连续17个0开头的哈希值。我们可以大致推算一下,17个十六进制的0相当于计算了1617次,大约需要计算2.9万亿亿次。

17个0 = 1617 = 295147905179352825856 = 2.9万亿亿次

实际的难度是根据bits由一个公式计算出来,比特币协议要求计算出的区块的哈希值比难度值要小,这个区块才算有效:

Difficulty = 402937298

= 0x18 0455d2

= 0x0455d2 * 28 * (0x18 - 3)

= 106299667504289830835845558415962632664710558339861315584

= 0x00000000000000000455d2000000000000000000000000000000000000000000

注意,难度值的数值越小,说明哈希值前面的0越多,计算的难度越大。

比特币网络的难度是不断变化的,它的难度保证大约每10分钟产生一个区块,而难度值在每2015个区块调整一次:如果区块平均生成时间小于10分钟,说明全网算力增加,难度也会增加,如果区块平均生成时间大于10分钟,说明全网算力减少,难度也会减少。因此,难度随着全网算力的增减会动态调整。

比特币设计时本来打算每2016个区块调整一次难度,也就是两周一次,但是由于第一版代码的一个bug,实际调整周期是2015个区块。

根据比特币每个区块的难度值和产出时间,就可以推算出整个比特币网络的全网算力。

比特币网络的全网算力一直在迅速增加。目前,全网算力已经超过了100EH/每秒,也就是大约每秒钟计算1万亿亿次哈希:

所以比特币的工作量证明被通俗地称之为挖矿。在同一时间,所有矿工都在努力计算下一个区块的哈希。而挖矿难度取决于全网总算力的百分比。举个例子,假设小明拥有全网总算力的百分之一,那么他挖到下一个区块的可能性就是1%,或者说,每挖出100个区块,大约有1个就是小明挖的。

由于目前全网算力超过了100EH/s,而单机CPU算力不过几M,GPU算力也不过1G,所以,单机挖矿的成功率几乎等于0。比特币挖矿已经从早期的CPU、GPU发展到专用的ASIC芯片构建的矿池挖矿。

当某个矿工成功找到特定哈希的新区块后,他会立刻向全网广播该区块。其他矿工在收到新区块后,会对新区块进行验证,如果有效,就把它添加到区块链的尾部。同时说明,在本轮工作量证明的竞争中,这个矿工胜出,而其他矿工都失败了。失败的矿工会抛弃自己当前正在计算还没有算完的区块,转而开始计算下一个区块,进行下一轮工作量证明的竞争。

为什么区块可以安全广播?因为Merkle Hash锁定了该区块的所有交易,而该区块的第一个coinbase交易输出地址是该矿工地址。每个矿工在挖矿时产生的区块数据都是不同的,所以无法窃取别人的工作量。

比特币总量被限制为约2100万个比特币,初始挖矿奖励为每个区块50个比特币,以后每4年减半。

共识算法

如果两个矿工在同一时间各自找到了有效区块,注意,这两个区块是不同的,因为coinbase交易不同,所以Merkle Hash不同,区块哈希也不同。但它们只要符合难度值,就都是有效的。这个时候,网络上的其他矿工应该接收哪个区块并添加到区块链的末尾呢?答案是,都有可能。

通常,矿工接收先收到的有效区块,由于P2P网络广播的顺序是不确定的,不同的矿工先收到的区块是有可能的不同的。这个时候,我们说区块发生了分叉:

在分叉的情况下,有的矿工在绿色的分叉上继续挖矿,有的矿工在蓝色的分叉上继续挖矿:

但是最终,总有一个分叉首先挖到后续区块,这个时候,由于比特币网络采用最长分叉的共识算法,绿色分叉胜出,蓝色分叉被废弃,整个网络上的所有矿工又会继续在最长的链上继续挖矿。

由于区块链虽然最终会保持数据一致,但是,一个交易可能被打包到一个后续被孤立的区块中。所以,要确认一个交易被永久记录到区块链中,需要对交易进行确认。如果后续的区块被追加到区块链上,实际上就会对原有的交易进行确认,因为链越长,修改的难度越大。一般来说,经过6个区块确认的交易几乎是不可能被修改的。

小结

比特币挖矿是一种带经济激励的工作量证明机制;

工作量证明保证了修改区块链需要极高的成本,从而使得区块链的不可篡改特性得到保护;

比特币的网络安全实际上就是依靠强大的算力保障的。

Comments

Make a comment

Sign in to

make a comment

Index

区块链教程

比特币

区块链原理

P2P交易原理

私钥

公钥和地址

签名

挖矿原理

可编程支付原理

多重签名

UTXO模型

Segwit地址

HD钱包

钱包层级

助记词

地址监控

以太坊

账户

区块结构

交易

智能合约

编写合约

部署合约

调用合约

编写Dapp

常用合约

ERC20

Wrapped Ether

廖雪峰的官方网站

©Copyright 2019-2021

Powered by iTranswarp

Feedback

License

比特币终极指南:深入了解比特币的工作原理 | by The Smart Ape | Cointime

比特币终极指南:深入了解比特币的工作原理 | by The Smart Ape | Cointime

快讯

头条

行情

专题

专栏

活动

搜索

快讯

头条

行情

专栏

活动

Timestamp

扫码下载App

iOS & Android

比特币

¥498,302.39

+1.58%

以太坊

¥28,093.85

-0.10%

币安币

¥3,787.02

+8.51%

Optimism

¥32.77

+0.61%

Arbitrum

¥14.79

-3.71%

Solana

¥1,036.66

-1.17%

Polygon

¥8.87

+8.51%

Cosmos

¥94.86

-4.21%

Avalanche

¥304.06

-1.75%

比特币

¥498,302.39

+1.58%

以太坊

¥28,093.85

-0.10%

币安币

¥3,787.02

+8.51%

Optimism

¥32.77

+0.61%

Arbitrum

¥14.79

-3.71%

Solana

¥1,036.66

-1.17%

Polygon

¥8.87

+8.51%

Cosmos

¥94.86

-4.21%

Avalanche

¥304.06

-1.75%

USD

比特币终极指南:深入了解比特币的工作原理

许多人身处加密货币生态系统中,却对比特币的运作方式一知半解。不幸的是,比特币正是这个生态系统的核心。编写这份指南的目的在于全面阐述比特币的概念。通过了解比特币的运作原理,您将更容易理解在去中心化金融(DeFi)中开发的所有内容(如 BRC20、STAMPS、SRC20、Ordinals 等),这将为您日后的学习和应用提供便利。比特币是加密货币生态系统的开创者,它的出现引领了一系列创新。1. 地址与密钥在比特币中,一切都始于密钥。密钥共有三种类型:私钥公钥地址私钥首先生成,随机选取。私钥是通过数学过程生成的,每次生成都有一个不同的私钥。生成两个相同的私钥的概率极低,就像从所有已经存在的人群中挑出两个基因组完全相同的人一样。公钥是通过椭圆曲线乘法从私钥生成的。这个函数是单向的,可以根据私钥 x 计算出函数值 f(x),但无法从 f(x) 推导出 x。公共地址是通过哈希函数从公钥生成的,该函数同样是单向的。公共地址用于接收比特币($BTC),而私钥用于解锁相应的公共地址中存储的比特币。如何生成私钥?正如前文所述,私钥是在无限大的集合中随机生成的,以避免两次生成相同的私钥,因此需要大量的熵源。SHA256 算法引入了一个 256 位(10^77)的数字。以下是一个 Python 脚本,它可以:创建一个唯一的私钥从私钥生成公钥从公钥生成地址如果您希望存储仅自己知道的私钥,这个脚本将非常有用。比如说,最早的比特币钱包是实体卡片,一面印有私钥(用于消费),另一面印有地址(用于接收),使用非常简单。然而,这种方式并不安全。2. 钱包钱包是一个必须了解的重要概念。它只是一个应用程序,让您可以:- 管理密钥和地址- 监控余额- 创建交易- 签署交易钱包并不存储比特币(BTC)!它包含私钥,可以签署交易,从区块链中解锁比特币。钱包有两种类型:- 非确定性钱包- 确定性钱包非确定性钱包生成一组无关的随机私钥。这种类型的钱包并不常用,因为管理起来相对较难,私钥之间没有关联,需要一个高效的备份系统。确定性钱包从种子生成私钥,因此所有私钥都是相互关联的,并且可以从种子重新生成。这些钱包(也称为 HD 钱包)便于使用和备份。如果你有一个钱包,99% 的可能性是确定性钱包。对于 HD 钱包,种子通常使用 BIP-39 标准转换为助记词(你可能已经有了一个)。助记词易于抄写、记录在纸上和阅读。是的,我指的就是那些 12 或 24 个单词。Ledger 钱包就是一个 HD 钱包的例子。首次使用时,您需要记录助记词,以便在必要时恢复所有私钥。而 Ledger 钱包更为安全:- 未连接到互联网(冷钱包)- 需要实体确认冷钱包将私钥离线存储,远离任何互联网连接。这意味着即使黑客获得了您的计算机或智能手机的访问权限,他们也无法访问您的冷钱包并窃取您的私钥。这种方式更为安全。热钱包通过与互联网连接的存储方式来存储私钥。热钱包通常用于日常交易,因为它们易于访问,可用于快速发送或接收比特币。尽管不太安全,但有时它们具有一定的实用性。3. 交易交易是理解比特币的核心部分。每笔交易都会创建未花费交易输出 (UTXO),以作为未来交易的输入。在比特币中,您不直接花费比特币,而是消费未花费的交易 (UTXO)。比特币网络中的交易与您在区块浏览器中看到的并不完全相同。假设 Alice 向 Bob 发送 0.015 比特币,并支付 0.0005 比特币的手续费。这笔交易在比特币区块链中的展示如下可以看到什么呢?正如我所说,在比特币中我们花费 UTXO,因此 Alice 花费了她的“vin”UTXO,并在“vout”中创建了两个新的 UTXO。Alice 有一个价值 0.1 比特币的 UTXO,为了支付给 Bob,她必须创建两个 UTXO,一个给 Bob(0.015 比特币),一个给她自己(找零)。“scriptPubKey”中的文本定义了新 UTXO 的花费条件。用人类的语言来说,这意味着:要花费 UTXO,用于签署交易的私钥必须对应于“scriptPubKey”中给出的地址。第一个“vin”部分是 Alice 从之前的交易中收到并现在要花费的 UTXO。下面是这个列表中每个参数的含义:Txid:交易 ID,引用包含要花费的 UTXO 的交易vout:一个索引,标识引用了该交易中的哪个 UTXO(第一个为零)scriptSig:满足 UTXO 上设置的条件,解锁它以进行消费sequence:用于时间锁定解锁脚本由 Alice 的钱包构建,首先检索引用的 UTXO,检查其锁定脚本,然后用它来构建满足该条件的解锁脚本。交易费用并未在交易中明确标明。它们是通过计算输入总和与输出总和之间的差额来确定的。如果 Alice 没有将输出返回给自己(找零),她将支付 0.085 比特币的交易费用。通过将交易中包含的所有信息记录在区块链中,区块浏览器能够以更易读的方式显示交易。注意,在每笔交易中,一个 UTXO 被分成两个或多个 UTXO。随着时间的推移,包含越来越少比特币的 UTXO 会越来越多。节点需要更多的内存空间来存储这些 UTXO,这可能在未来导致问题。4. 区块链区块链数据结构是一个有序的、按反向链接的方式排列的交易块列表。自比特币诞生以来,所有的交易,无论大小,都被记录在区块链中。现在我们来仔细分析一个区块的结构。每个区块由四部分组成:区块大小区块头交易计数器交易区块头包含以下元素:区块头主要负责与前一个区块链接,并给出与区块上下文相关的全局信息摘要(如 Merkle 树交易、难度、时间戳等)。因此,每个区块都链接到前一个区块,每个区块头中都包含前一个区块的哈希值。这就是形成连接所有区块的链的关键所在。那么第一个区块呢?创世区块已被直接编码,所以每个节点都始终“知道”创世区块的哈希值、结构、固定的创建时间,甚至其中的单个交易。第一个区块的标识符:000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f通过在区块浏览器中查看这个区块的内容,我们可以看到中本聪留下的消息。这条消息既可以帮助我们确定区块链的年代,也可以让我们理解比特币的创建初衷。« The Times 03/Jan/2009 Chancellor 即将对银行进行第二次救助 »。6. 挖矿挖矿是在创造新比特币的同时,确保比特币保持去中心化的过程。矿工的主要任务包括:- 验证交易- 将交易整合到区块中- 将区块添加到区块链中总共有 2100 万枚比特币将被挖掘出来,大约每 4 年(减半周期),分配给矿工的比特币数量减少一半。最终,矿工将只能通过交易费来获得奖励,总有一天所有的比特币都会被挖掘完。节点(包括矿工节点和普通节点)负责验证交易(如语法、供应、双重支付等问题)。一旦交易获得验证,它们就会被放入一个“内存池”,在那里它们等待被矿工节点(具备挖矿能力的节点)整合到候选区块中。平均每 10 分钟就会出现一个新的区块。为了将这些区块整合到一起,矿工需要提供证据,证明他们已经付出了一定的时间和努力来验证这个区块(即“工作证明”)。从概率角度看,提供更多工作量的矿工更容易完成区块的验证。矿工所进行的工作基于 SHA256 算法,需要注意的是,对于给定的输出,无法直接确定对应的输入。因此,工作证明包括找到一个输入,该输入能产生一个开头具有一定数量“0”的哈希值(输出)。所以,矿工需要尝试数万亿种可能性,以找到满足设定标准的哈希值。“0”的数量越多,难度越大。这就是比特币网络根据网络算力调整挖矿难度的方式。如果网络中有很多矿工,他们都拥有大量的计算能力,那么网络将要求输入产生更多开头的“0”的输出。网络难度会不断调整,以确保每隔 10 分钟产生一个新区块。7. 安全性比特币的安全性源于其去中心化特性,只要保持去中心化,比特币就能确保其安全性。要攻击比特币,就需要整合虚假交易(如双重支付等)或拒绝执行某些来自区块链的交易。然而,要将一个区块添加到区块链中,必须通过与其他矿工竞争的工作证明。只要存在这种竞争,就很难将错误区块整合到链中。攻击者必须投入大量工作才能成功。即便攻击者投入巨大能量,成功的可能性也并非100%,因为他们并不能确保一定能赢得竞争(除非投入了100%的工作量)。特别是因为节点还会验证交易并可以拒绝执行它们。总的来说,攻击比特币所需的投资巨大,而成功的机会微乎其微(接近于0)。因此,没有人会有兴趣攻击比特币。这得益于比特币的去中心化特性,其能量来自世界各地。如果工作量集中在少数群体或个人手中,比特币将变得中心化,这个中心化实体就可以通过尝试双重支付或拒绝交易来影响区块链。去中心化是比特币的基石。8. 我对比特币的看法比特币是我进入这个生态系统的主要原因,在那时山寨币并不多,所以我有时间深入研究比特币。除了它的价值之外,我对比特币所承载的思想也感兴趣。我们生活在一个中心化的世界里,我们并不真正拥有任何东西。甚至你在银行里的钱,你为之付出努力的钱,也不完全属于你。比特币拥有我所追求的自由和独立的价值观。我认为比特币能让我重新掌握控制权。比特币为任何人提供了成为自己银行的能力,其资产价值通过通缩属性得以保值。这是一种与黄金等价的资产,但可以在全球范围内轻松兑换,这是黄金无法做到的。对我来说,它不仅仅是一种货币,它还代表:- 价值观- 一种心态- 原则- 一个理念- 一个概念我们常常忘记,正是比特币为今天我们所知道的所有其他区块链和加密货币铺平了道路。没有比特币,我们今天就不会在以太坊上拥有智能合约。我希望这篇指南能帮助您更好地了解比特币的技术运作。了解比特币非常重要,尤其是在 STAMPS、Ordinals、BRC-20 等重要发展阶段。这份指南所包含的信息仅占 @aantonop《精通比特币》一书中的0.1%。如今,当我想回顾技术细节时,我仍然会使用这本书。如果您已经理解了我所讲的内容并希望了解更多细节,那么这本书将是您的下一个阅读选择。

Bitcoin

$69,665.36

+1.58%

比特币

加密货币

BTC

首页

/

行业洞察

分享

评论

发布评论

所有评论

Load More Comments

推荐阅读

Cointime 3月10日要闻速递

1.Kevin Rose疑似正抛售其持仓NFT,并已销毁krovault.eth等ENS域名2.游戏板块概念币普涨,PIXEL 24小时涨超40%3.AI板块代币普涨,WLD、ARKM、RNDR和FET均创历史新高4.Tether Treasury约四小时前通过2笔交易新增铸造20亿枚USDT5.加密出入金解决方案Onramp Money完成战略种子轮融资,FunFair Ventures参投6.Vitalik:以太坊可以通过“恢复性分叉”来抵御突发的量子攻击7.对冲基金大鳄Ackman表示考虑买入比特币8.zkLink启动2000万美元ZKL资助计划以支持Layer 3生态应用开发9.育碧Ubisoft宣布成为XPLA生态节点验证者10.超5300万枚USDC在USDC Treasury被铸造

Cointime 3月9日要闻速递

1. Uniswap V3 Fees:Factory Owner修正案未获通过,反对票比例达59.89%

Uniswap V3 Fees:Factory Owner修正案未获通过,反对票比例达59.89%

由 Michigan Blockchain、404 DAO 和 GFX Labs 联合发起的 Uniswap V3 Fees:Factory Owner 修正案未获通过,共 30M UNI(占比59.89%)的反对票被投出,teemulaumhonkasalo.eth 和 Wintermute(wintermutegovernance.eth)等代表均投出反对票。

一巨鲸从ether.fi中取出质押的2917 枚ETH 后全部充值进币安

据链上分析师@ai_9684xtpa监测,五分钟前,某巨鲸从ether.fi中取出质押的 2917 枚 ETH 后全部充值进 Binance,价值 1150 万美元。 这笔资金是三周前(2024.02.19)以均价 2883 美元从币安转出的,若全部卖出将获利 305 万美金。

WLD短时突破11美元,续创历史新高

行情数据,WLD 短时突破 11 美元,现报价 10.99 美元,24 小时涨幅 52.6%,续创历史新高。

英国《经济学人》:比特币不会消失,ETF的设立或使其未来价格走势更加缓慢、稳定

英国《经济学人》周刊撰文《比特币飙升后将会发生什么》,文章指出,比特币并非在孤立上涨:每一种资产都在上涨,世界各地的股市都在接近纪录高点,金价也是如此,比特币的表现好于多数资产。监管机构美国证券交易委员会批准设立比特币交易所交易基金(ETF) 使得普通投资者更容易购买这种加密货币,比特币已存在了14年,其自我认证以及验证供应增长的简洁机制从未受到黑客破坏,意味着这种代币将不会消失。随着ETF的设立,现在显而易见的是比特币成为一种投资资产。比特币ETF的设立或许已经引发了疯狂的惊人上涨,但它所预示的未来价格走势可能会更加缓慢、稳定。

贝莱德IBIT比特币持仓量已超越MicroStrategy

据HODL15Capital统计,贝莱德的比特币ETF(IBIT)40个交易日后持有的比特币数量超过了MicroStrategy。IBIT目前持有196089枚BTC,MicroStrategy目前持有193000枚BTC。

WLD突破10美元,日内涨幅达到40.72%

行情显示,WLD突破10美元,现报10.123美元,创历史新高,日内涨幅达到40.72%。

某巨鲸四小时前从Binance转出25万枚RNDR

据链上分析师@ai_9684xtpa监测,四小时前,RNDR巨鲸0x551...46225从Binance转出25万枚RNDR,价值254万美元。该地址共持有75万枚RNDR(价值809万美元),平均成本为7.94美元,目前已浮盈24.5万美元。

比特币8-10万美元看涨期权未平仓合约数量过去24小时增长12%

周五比特币价格史上首次上破70000美元的整数关口,连涨7周,累计涨幅超过70%。根据Amberdata汇编的数据,在期权市场上,执行价格为8万美元和10万美元的比特币看涨期权的未平仓合约数量,在过去24小时内均跃升了12%左右。

每日必读

BlockBeats·

2月NFT交易市场回顾:以太坊夺回领先地位,Solana销售额超50亿

BlockBeats·

代币奖励都去哪儿了?

Joyce·

Sam Altman回归OpenAI董事会,AI板块再现普涨行情

Odaily星球日报·

“啥人值100亿美元?”一文看懂币安vs.尼日利亚乌龙事件

PANews·

11张图解读2月加密市场:市场保持增长态势,多项链上指标续涨

Cointime精选·

Pantera要花2.5亿美元买SOL,但Solana还差一个“ChatGPT时刻”?

热门标签

比特币

Base

Galxe

Optimism

JPEX

CoinEx

Connext

TipCoin

TOKEN2049

ZK

以太坊

Memecoin

Layer2

即时新闻

比特币

以太坊

全球监管

Web3

DeFi

NFT

安全事件

Layer2

内容

即时快讯

头条精选

行业洞察

Crypto故事

项目报道

科普教程

专栏

专题

行情

RSS

即时新闻

头条

OpenAPI

公司

关于我们

广告合作

免责声明

© 2023 CoinTime. 版权所有

隐私政策

服务条款

挖矿是如何产生比特币的? - 知乎

挖矿是如何产生比特币的? - 知乎首页知乎知学堂发现等你来答​切换模式登录/注册虚拟货币货币比特币 (Bitcoin)挖矿是如何产生比特币的?最近翻译了中本聪先生发明比特币的论文,在这篇论文中他说比特币的产生由挖矿者计算最优散列值计算得到,第一个计算得到这一散列值的也就是block的第一人将…显示全部 ​关注者4,101被浏览5,796,321关注问题​写回答​邀请回答​好问题 40​10 条评论​分享​270 个回答默认排序aibifu区块链扫地僧​ 关注在这篇文章中我会给出一个虚拟的村庄叫“比特村”,整个文章会以讲故事的方式,逐步告诉大家比特币提出的动机、解决了什么问题以及一些关键组件的目标和设计方案。问题的提出我们先从比特币产生的动机开始。以物易物的比特村话说在这个世界上,有一个叫比特村的小村庄,村庄共有几百户人家。这个村庄几乎与世隔绝,过着自给自足的生活。由于没有大规模贸易,比特村村民一直 过着以物易物的生活,也就是说村民之间并没有使用统一的货币,互相间的贸易基本上就是老张家拿一袋面粉换老李家一只羊,王大嫂拿一筐野果换刘大婶两尺布。 村民们一直就这么纯朴的生活着。实物货币终于有一天,村民觉得一直这样以物易物实在太不方便了,于是村子全员开会,讨论如何解决这个问题。有人提议,以便于分割且稀有的东西,例如黄金,作 为一般等价物,把其它物品和黄金的对应关系编成一张表格,例如一克黄金对应一只羊,一克黄金对应一袋面粉等等,此时老张再也不用扛着一袋面粉气喘吁吁的去 老李家换羊了,他只要从家里摸出一克金子,就可以去老李家牵回一只羊,而老李拿着这一克黄金可以从任何愿意出让面粉的人那里换回一袋面粉,当然也可以换取 任何和一克黄金等值的物品。此时比特村进入了实物货币时代。符号货币好景不长,过了一段时间,实物货币的弊端也出现了。因为比特村附近金矿并不多,开采和冶炼金子太费时费力了。而随着使用,金子总是不断会因为磨损、 丢失或有人故意囤积而发生损耗。全村人又一次坐在了一起,开始商讨对策。此时有人说,其实大家也不必一定要真的用黄金啊,随便找张纸,写上“一克黄金”, 只要全村人都认同这张纸就等于一克黄金,问题不就解决了。其他人纷纷表示认同,但同时也有了新的问题:真实的黄金是需要开采和冶炼的,金矿有限,开采和冶 炼也需要成本,所以没有人可以短期凭空制造大量的黄金,可写字就不同了,只要我纸够笔够,随便像写多少写多少,那这就变成拼谁家里纸多了,搞不好到时一万 张纸才能换一只羊(实际上这就发生了经济学上的通货膨胀)。大家一想也是啊。不过此时又有人提出了解决方案:这个纸不是谁写都有效,我们只认村里德高望重的老村长写得,大家都认识老村长的字。老村长写一些 纸,同时按照各家黄金存量发给大家等量的纸,例如老张家有二百克黄金,老村长就发给老张二百张写着“一克黄金”的纸,同时将老张家的黄金拿走作为抵押。就 这样,老村长将村里所有黄金收归到自己的家里,并按各家上交的黄金数量发给等值的写有字的纸。此时村民就可以拿着这些纸当黄金进行贸易了,而且大家都认得 老村长的字,其他人伪造不出来。另外,如果谁的纸磨损太严重,也可拿到老村长那里兑换新的等值的纸,另外老村长承诺任何人如果想要换成真黄金,只要拿纸回 来,老村长就会把等值的黄金还给那人。因为老村长写得纸的黄金量和真实放在家里的黄金量是一样的,所以只要严格按照销毁多少纸新写多少纸的原则,每一张有 效的纸总能换回相应的真黄金。此时,比特村进入了符号货币(纸币)时代。而老村长就承担了政府和银行的角色。中央系统虚拟货币又过了几年,老村长由于每天都要核对大量的旧纸币,写新的纸币,还要把各种账目仔细做好记录。一来二去,老村长操劳过度不幸驾鹤西去了。比特村再次召开全体大会,讨论应该怎么办。此时老村长的儿子二狗子自告奋勇接过了父亲的笔,承担起货币发行的责任。这个年轻的村长二狗子很聪明,他 做了几天,发现好像也不用真的写那么多纸。完全可以这样:村民把纸币都交上来,销毁,但是二狗子会记录下每户上交的纸币数量。以后如果要进行付钱,例如老 张要拿一克金子向老李换一只羊,就一起给二狗子打个电话,说明要将老张名下的一克金子划归老李名下,二狗子拿出账本,看看老张名下是否有一克金子,如果有 就在老账的名下减掉一克,在老李的名下加上一克,这样就完成了支付,此时老李在电话中听到二狗子确认转账完成,就可以放心让老张把羊牵走了。此时比特村进入了中央系统虚拟货币时代。每个村民都不需要用实物支付,支付过程变成了二狗子那边维护的账本上数字的变更。分布式虚拟货币这新上任的二狗子是聪明,不过这人有时候是聪明反被聪明误。有一天二狗子盯着这账本,心想这全村各户谁有多少钱就是我说的算,那我岂不是……。于是他头脑一热,私自从老张帐下划了十克金子到自己名下。本以为天衣无缝,但没想到老张也有记账的习惯,有一天他正要付钱却被二狗子告知账户没钱了。老账核对了一下自己的账本,命名还有十克啊,于是拿着账本去找二狗子理论,这一核对发现了那笔未经老张同意的转账。东窗事发!比特村炸开锅了。二狗子被弹劾是不可避免了,不过通过这件事,大家发现了账本集中在一个人手里的弊端:这个体系完全依赖于账本持有人的个人信用,如果这个人不守规矩,随意篡改账本,那么整个货币系统就会崩溃如果这个人家里失火或者账本失窃,同样也会为整个体系带来毁灭性的打击正当人们不知所措时,村里一个叫中本聪的宅男科学家走上了台,告诉大家他已经设计了一套不依赖任何中央处理人的叫比特币的虚拟货币系统,可以解决上述问题。然后他缓缓讲述了自己的方案。下面我们就来看看中本聪同学是如何设计这套系统的。基础设施搭建账簿公开机制中本聪首先说明,要对现有账簿进行如下改造:账簿上不再记载每户村民的余额,而只记载每一笔交易。即记载每一笔交易的付款人、收款人和付款金额。只要账簿的初始状态确定,每一笔交易记录可靠并有时序,当前每个人持有多少钱是可以推算出来的。账簿由私有改为公开,只要任何村民需要,都可以获得当前完整的账簿,账簿上记录了从账簿创建开始到当前所有的交易记录。此言一出,下面立刻炸锅了。第一条还无所谓,但是第二条简直无法接受,因为账簿可是记录了所有村民的交易,这样大家的隐私不全暴露了吗。中本聪倒是不慌不忙,拿出了一对奇怪的东西。身份与签名机制(公钥加密系统)中本聪说,大家不要慌。在他的这套机制下,任何人都不使用真实身份交易,而是使用一个唯一的代号交易。他展示了手里神奇的东西,说这两件东西分别叫保密印章和印章扫描器。后面他会给村里每一户发一个保密印章和一个印章扫描器。两者的作用如下:保密印章可以在纸上盖一个章,每个印章盖出的章都隐含了一个全村唯一的一串字符,但是凭肉眼是看不出来的。也无法通过观察来制造出相应的印章印章扫描器可以扫描某个已经盖好的章,读出隐含的信息,并在液晶屏上显示出一串字符有了这两个神奇的东西,大家就可以在不暴露真实身份的情况下进行交易了,而印章隐含的那一串字符就是这户人家的代号。具体如何巧妙利用保密印章和印章扫描器进行交易,会在下文详述。成立虚拟矿工组织(挖矿群体)下一步,中本聪面向全村招募虚拟矿工,招募要求如下:矿工以组为单位,一组可以是单独的一户,也可以是几户联合为一组成为矿工不影响正常使用货币矿工每天要花费一定时间从事比特币“挖矿”活动,但是不同于挖金矿,虚拟矿工不需要拿着工具去野外作业,在家里就可以完成工作矿工有一定可能性获得报酬,在挖矿活动中付出的努力越多,获得报酬的可能性越大矿工可以随时退出,也可以随时有新的矿工加进来很快,大约有五分之一的村民加入比特币矿工组织,共分成了7个组。建立初始账簿(创世块)下面,中本聪宣布,先根据二狗子手里的账簿,把抵押的所有黄金按账簿记录的余额退还给每位村民,然后彻底销毁这本账簿。然后,中本聪拿出一本新账簿,在账簿的第一页上记录了一些交易记录,特别的是,这些记录的付款人一栏全都是“系统”,而收款人分别是每个印章对应的 隐含字符,代表初始时刻,系统为每一户默认分配了一定数量比特币,但是数量非常少,都只有几枚,甚至有些不幸的村户没有获得比特币。接着中本聪说,由于目前市面上比特币非常少,大家可以先回到用黄金做货币的时代,由于我不是村长,我也没有权利强迫大家一定要承认比特币,大家可以自行决定要不要接受比特币。不过随着比特币的流动和矿工的活动,比特币会慢慢多起来。支付与交易做了这么多铺垫,终于说到重点了,下面说一下在这样一个体系下如何完成支付。以老张付给老李10个比特币为例。付款人签署交易单为了支付10个比特币,老张首先要询问老李的标识字符串,例如是“ABCDEFG”,同时老张也有一个标识字符串例如是“HIJKLMN”,然后老 张写一张单子,内容为“HILKLMN支付10比特币给ABCDEFG”,然后用自己的保密印章改一个章,将这张单子交给老李。另外为了便于追溯这笔钱的 来源,还要在单子里注明这笔钱的来源记在哪一页,例如这个单子里,老张的10比特币来自建立账簿时系统的赠送,记录在账簿第一页。收款人确认单据签署人老李拿到这个单子后,需要确认这个单子确实是来自“HIJKLMN”这个人(也就是老张)签署的,这个并不困难。因为单子上必须有保密章,老李拿出 印章扫描器,扫一下章,如果液晶屏显示出的字符和付款人字符是一致的(这里是“HIJKLMN”),就可以确认单子确实是付款人签署的。这是因为根据保密 印章的机制,没有其他人可以伪造印章,任何一个人只要扫描一下印章,都可以确认单子的付款人和盖章人是否一致。收款人确认付款人余额这个系统到目前还是很有问题。通过保密印章,收款人虽然可以确认付款人确实签署了这份单子,但是无法自行确认付款人是否有足够的余额支付。之前的中 央虚拟货币系统中,二狗子负责检查付款人的余额,并通知收款人交易是否有效,现在把二狗子开了,谁来负责记账和确认每笔交易的有效性呢?之前说过,中本聪设计的这个系统是分布式货币系统,不依赖任何中央人物,所以不会有一个或少数几个人负责这件事,最终承担这份工作的是之前所提到的矿工组织。老张、老李和全村其他任何使用比特币进行交易的村民都依赖矿工组织的工作才能完成交易。矿工的工作矿工的工作是整个系统的核心,也是最复杂性最高的地方。下面逐步介绍矿工的工作内容和目的。矿工的工具俗话说,工欲善其事,必先利其器。比特币矿工虽然不用铁撅、铁锨和探照灯等工具,不过也要有一些必备的东西。初始账簿。每个组首先自己复制一份初始账簿,初始账簿只有一页,记录了系统的第一次赠送 空账簿纸。每个小组有若干账簿纸,每一页纸上仅有账簿结构,没有填内容,具体内容的书写规则后面讲述。下面是一张空账簿纸的样子,各个字段的意义后面会说到。编码生成器(哈希函数)。中本聪又向矿工组织的每个组分发了若干编码生成器,这个东西很神奇,将一页账簿填好内容的账簿纸放入这个机器,机器会在账簿纸的“本账单编号”一栏自动打印一串由“0”和“1”组成的编号,共256个。最神奇的是,编号生成器有如下功能:生成的编号仅与账簿纸上填入的内容有关,与填写人、字体、填写时间等因素均无关内容相同的账簿纸生成的编号总是相同,但是如果内容哪怕只改一个字符,编号就会面目全非编码生成器在打印编码时还需要将所有填入账簿纸的交易单放入,机器会扫描交易单和填入交易单的一致性,尤其是保密印章,如果发现保密印章和付款人不一致,会拒绝打印编码将一张已打印的账簿纸放入,机器会判定编号是否是有效的机器打印,并且判定编号和内容是否一致,这个编号无法伪造交易单收件箱。每个矿工小组需要在门口挂一个箱子用于收集交易单。 公告板。每个矿工小组同样需要一个公告板公示一些信息。有了上面的工具,矿工组织就可以开工了!收集交易单中本聪规定,每笔交易的发起人,不但要将交易单给到收款人,还要同时复制若干份一模一样的交易单投递到每个矿工小组的收件箱里。矿工小组的人定期到自己的收件箱里把收集到的交易单一并取出来。填写账簿此时小组的人拿出一张空的账簿纸,把这些交易填写到“交易清单”一栏,同时找到当前账簿最后一页,将最后一页的编号抄写到“上一张账单编号一栏”。 注意还有个“幸运数字”,可以随便填上一个数字,如12345。然后,将这样账簿纸放入编号生成器,打印好编号,一张账簿就算完成了。如果你以为矿工的工作就这么简单,那就大错特错了,中本聪有个变态的规定:只有编号的前10个数均为0,这页账簿纸才算有效。根据之前对编号生成器的描述,要修改编号,只能修改账簿纸的内容,而“交易清单”和“上一张账簿纸编号”是不能随便改的,那么只能改幸运数字了。于 是为了生成有效的账簿纸,小组里的矿工就不断抄写账簿纸,但每张纸的幸运数字都不同,然后不断的重复将纸放入编码器,如果生成的编号不符合规定,这张纸就 算废了,重复这个过程直到生成一串有效的编号。我们知道,如果编号的每一个数字都是随机的,那么平均写1000多张幸运数字不同的纸才能获得一个有效的编号。这就奇怪了,这些矿工为什么要拼命干这看似无意义的事情呢?还记得之前说过矿工有报酬吧,这就是矿工的动力了。中本聪规定:每一张账簿纸的交易清单 第一条交易为“系统给这个小组支付50个比特币”。也就是说,如果你生成了一张有意义的账簿纸,并且被所有挖矿小组接受了,那么就意味着这条交易也被接受 了,你的挖矿小组获得了50个比特币。这就是矿工被叫做矿工的原因,也是为什么之前说随着交易和矿工的活动,比特币的数量会不断增多。例如下面是一个挖矿过程,这个小组的公共比特币帐号为“UVWXYZ”。在幸运数字尝试到“533”时,系统生成了一页有效账簿。确认账簿当某挖矿小组幸运的生成了一张有意义的账簿,为了得到奖励,必须立刻请其它小组确认自己的工作。前面说过,当前村里有7个挖矿组,所以这个小组必须将有效账簿纸誊抄6份快马加鞭送到其他6个小组请求确认。中本聪规定,当某个小组接到其他小组送来的账簿纸时,必须立即停下手里的挖矿工作进行账簿确认。需要确认的信息有三个:账簿的编号有效账簿的前一页账簿有效交易清单有效首先看第一个,这个确认比较简单。只要将送来的账簿纸放入编码生成器进行验证,如果验证通过,则编号有效。第二部分需要将账簿页上的“上一页账簿纸编号”和这个小组目前保存的有效账簿最后一页编号比对,如果相同则确认,如果不同,需要顺着已有账簿向前比对,直到找到这个编号的页。如果没有找到指定的“上一页账簿纸编号”对应的页,这个小组会将此页丢掉。不予确认。注意,由上面的机制可以保证,如果各个小组手里的账簿纸是相同的,那么他们都能按同样的顺序装订成相同的账簿。因为后面一张纸的编号总是依赖前面的 纸的编号,编码生成器的机制保证了所有合法账簿纸的相对先后顺序在每个小组那里都是相同的(可能会有分支,但不会出现环,后面细讲)。最后是如何确认交易清单有效,其实也就是要确认当前每笔交易的付款人有足够的余额支付这笔钱。由于交易信息里包含这笔钱是如何来的,还包含了记录来 源交易的账单编号。例如,HIJKLMN要给ABCDEFG10个比特币,并注明了这10个比特币来自之前OPQRST支付给HIJKLMN的一笔交易, 确认时首先要确认之前这笔交易是否存在,同时还要检查HIJKLMN在这之前没有将这10个比特币支付给别人。这一切确认后,这笔交易有效性就被确认了。其中第一笔是系统奖励给生成这页账簿的小组的50个,这笔交易大家都默认承认,后面的只要按照上述方法追溯,就可以确认HIJKLMN是否当前真有10个比特币支付给ABCDEFG。如果完成了所有了上述验证并全部通过,这个小组就认可了上述账簿纸有效,然后将这张账簿纸并入小组的主账簿,舍弃目前正在进行的工作,后面的挖矿工作会基于这本更新后的主账本进行。账簿确认反馈对于挖矿小组来说,当账簿纸送出去后,如果后面有收到其他小组送来的账簿纸,其“上一页账簿纸编号”为自己之前送出去的账簿纸,那么就表示他们的工作成功被其他小组认可了,因为已经有小组基于他们的账簿纸继续工作了。此时,可以粗略的说可以认为已经得到了50个比特币。另外,任何一个小组当新生成有效账簿纸或确认了别的小组的账簿纸时,就将最新被这个小组承认的交易写到公告牌上,那么收款人只要发现相关交易被各个小组认可了,基本就可以认为这笔钱已经到了自己的账上,后面他就可以在付款时将钱的来源指向这笔交易了。以上就是整个比特币的支付体系。下面我们来分析一下,这个体系为什么可以工作下去,以及这个体系可能面临的风险。工作机制分析虽然上面阐述了比特币的基本运作规则,但是村民们还是有不少疑问。所以中本聪同学专门开了个答疑会,解答常见问题。下面总结一下村民最集中关心的问题。核心问题答疑如果同时收到两份合法的账簿页怎么办?注意在上面的运行机制中,各个挖矿小组是并行工作的,因此完全可能出现这样的情况:某小组收到两份不一样的账簿页,它们都基于当前这个小组的主账簿的最后一页,并且内容也都完全合法,怎么办?关于这个问题,中本聪同学说,小组不应该以线性方式组织账簿,而应该以树状组织账簿,任何时刻,都以当前最长分支作为主账簿,但是保留其它分支。举个例子,某小组同时收到A、B两份账簿页,经核算都是合法的,此时小组应该将两页以分叉的形式组织起来,如下图所示:黑色表示当前账簿主干。此时,可以随便选择一个页作为当前主分支,例如选择A:此时如果有一个新的账簿页是基于A的,那么这个主干就延续下去:如果这个主干一直这么延续下去,表示大家基本都以A为主干,B就会被遗忘。但是也有可能忽然B变成更长了:那么我们就需要将B分支作为当前主干,基于这个分支进行后续工作。从局部来看,虽然在某一时刻各个小组的账簿主干可能存在不一致,但大方向是一致的,那些偶尔由于不同步产生的小分支,会很快被淹没在历史中。如果挖矿小组有人伪造账簿怎么办关于这个问题,中本聪同学说,只要挖矿组织中大多数人是诚实的,这个系统就可靠,具体分几个方面给予答复。首先,基于保密印章机制,没有人能伪造他人身份进行付款,因为编码生成器在打印编码时会核对所有交易单的保密印章,印章和付款人不一致会拒绝打印。而且诚实的矿工也不会承认不合法的交易(如某笔交易付款方余额不够)。所以只有一种可能的攻击行为,即在收款人确认收款后,从另一条分支上建立另外的交易单,取消之前的付款,而将同一笔钱再次付款给另一个人(即所谓的double-spending问题)。下面同样用一个例子说明这个问题。先假设有一个攻击者拥有10个比特币,他准备将这笔钱同时支付给两名受害者A和B,并都得到承认。第一步,攻击者准备从受害者A手里买10比特币的黄金,他签署交易单给受害者A,转10个比特币给受害者A。第二步,这笔交易在最新的账簿页中被确认,并被各个挖矿小组公告出来。受害人A看到公告,确认比特币到账,给了攻击者10个比特币等值的黄金。第三步,攻击者找到账簿,从包含刚才交易的账簿页的前一页做出一个分支,生成更多的账单页,超过刚才的分支。由于此时刚才攻击者制造的分支变成了主干分支,而包含受害者A得到钱的分支变成了旁支,因此挖矿组织不再承认刚才的转账,受害者A得到的10比特币被取消了。第四步,攻击者可以再次签署交易单,将同一笔钱支付给受害者B。受害者B确认钱到账后,支付给攻击者等值黄金。至此,攻击者将10个比特币花了两次,从两名受害者那里各购得等值黄金。攻击者还可以如法炮制,取消与受害者B的转账,将同一笔钱再支付给其他人。。。。。。关于这种攻击,中本聪给出的解决方案是,建议收款人不要在公告挂出时立即确认交易完成,而是应该再看一段时间,等待各个挖矿小组再挂出6张确认账簿,并且之前的账簿没有被取消,才确认钱已到账。中本聪解释道,之前设定变态的编号规则,正是为了防御这一点。根据前面所述,生成有效账簿页不是那么简单的,要花费大量的人力反复试不同的幸运数 字,而且过程完全是碰运气。如果某账簿页包含你收到钱的确认,并且在后面又延续了6个,那么攻击者想要在落后6页的情况下从另一个分支赶超当前主分支是非 常困难的,除非攻击者拥有非常多的人力,超过其他所有诚实矿工的人力之和。而且,如果攻击者有如此多人力,与其花这么大力气搞这种攻击,还不如做良民挖矿来的收益大。这就从动机上杜绝了攻击的形成。比特币会一直增加下去,岂不是会严重通货膨胀中本聪说,这一点我也想到了。前面忘了说了,我给矿工组织的操作细则手册会说明,刚开始我们协议每生成一页账簿,奖励小组50个比特币,后面,每当 账簿增加21,000页,奖励就减半,例如当达到210,000页后,每生成一页账簿奖励25个比特币,420,000页后,每生成一页奖励12.5个, 依次类推,等账簿达到6,930,000页后,新生成账簿页就没有奖励了。此时比特币全量约为21,000,000个,这就是比特币的总量,所以不会无限 增加下去。没有奖励后,就没人做矿工了,岂不是没人帮忙确认交易了到时,矿工的收益会由挖矿所得变为收取手续费。例如,你在转账时可以指定其中1%作为手续费支付给生成账簿页的小组,各个小组会挑选手续费高的交易单优先确认。矿工如果越来越多,比特币生成速度会变快吗不会。中本聪解释,虽然可以任意加入和退出矿工组织,导致矿工人数变化,每个矿工也会拿到一个编码生成器,不过我已经在编码生成器中加入了调控机制,当前工作的编码生成器越多,每个机器的效率就越低,保证新账簿页生成速率不变。虽然每个人的代号是匿名的,但如果泄露了某个人的代号,账簿又是公开的,岂不是他的所有账目都查出来了确实是这样的。例如你要和某人交易,必然要要到他的代号才能填写交易单。因为收款人一栏要填入那人的代号。不过中本聪说可以提供无限制的保密印章,建议每一次交易用不同的保密印章,这样查账簿就追查不到同一个人的所有账目了。答疑完毕。说明本文用通俗比喻的方式讲解了比特币的运行机制。有几点需要说明:为了便于理解,我做了很多简化,因此有些机制细节和实际的比特币可能不完全相同。但总体思想和关键原理是一致的。由于很多计算机世界的东西(如公钥体系、网络传输)在现实世界中并没有特别好的对等物,所以故事里难免有一些生硬和不合常理的细节。本文描述的是比特币网络本身的技术原理和运作机制,当在如Mtgox这种买卖市场中进行比特币交易时,市场做了中间代理,并不遵从上述机制。编辑于 2018-01-22 19:01​赞同 2597​​157 条评论​分享​收藏​喜欢收起​Leaf​ 关注秒懂比特币挖矿: 1.我手上现在有一张面值100元的人名币。(比特币)2.谁关注公众号我就给谁。3.但是需要在评论里面猜出这张钱的编号才行。(挖矿,随机填充数值求解)自己想尽办法猜,猜中得100元全款——个人挖矿出钱召集一些人来一起猜——矿场召集认识不认识的人一起来猜,通过猜测的次数,按比例分配这100元——矿池以上是一个简单的类比例子,当然,你们关注并猜出了我兜里100块钱的编号,我保证给你。那么,比特币挖矿到底是怎么回事呢?回顾张三李四转账过程 找出问题在之前,我们用在一个偏僻的小村张三和李四转账的例子简单解释了什么是比特币。没看过的可以看下:【白话币圈】什么是比特币?这可能是最通俗易懂的答案了我们来简单回顾一下:当张三想要通过A账号转账1000元给李四的B账号时:① 张三大吼一声:大家注意啦,我用A账号给李四的B账号转1000块钱。② 张三附近的村民听了确实是张三的声音,并且检查张三的A账号是否有足够余额。③ 检查通过后,村民往自己的账本上写:A账号向B账号转账1000元,并修改余额:A账号余额=3000-1000=2000元,B账号余额=2000+1000=3000元。④ 张三附近的村民把转账告诉较远村民,一传十十传百,直到所有人都知道这笔转账,以此保证所有人账本的一致性。聪明如你一定发现了,在步骤② 如果张三吼了一声,附近村民假装没听到,都不去核实记账,那么这个系统不就停止工作了吗?为解决这个问题,村里商讨后决定,谁第一个确认是张三的声音的会获得500元。于是大家都竖起耳朵,时刻监听村里的每一个动静,真可谓草木皆兵。评论区有人问,这500元是哪儿来的?我这里也简答讲一下。1.比特币平均差不多每10分钟产生一个区块,这个区块能打包的交易数量是有限的,我们就算800笔吧。但是呢,旷工不会平白无故给你打包交易到并广播,所以需要收取手续费。而且,由于交易的人很多,先打包谁的交易也取决于手续费的高低。所以你可以看到,现在比特币火热了,手续费水涨船高。2.我们都知道比特币总量2100万个,发币机制是逐年递减。当旷工第一个成功打包这个区块并广播,并且是最长的链的话,那么他还会获得奖励,目前只有12.5个比特币。最开始是50个,已经衰减2次了。这里当然还有小问题,比如为什么要最长链,怎么确定是最长链,哪些链会被抛弃?如果大家有兴趣再深入说说。以上就是旷工的奖励。2017/12/8更新。在比特币的世界里,大约平均每10分钟会产生一个区块。所有的挖矿计算机都在尝试打包这个区块并提交,而第一个成功生成这个数据块的人,就可以得到一笔比特币报酬。最初,大约每10分钟就可以产生50个比特币的比特币报酬。但是该报酬每4年减半,现在每10分钟比特币网络就可以产生25个比特币。好了,接着上面的故事讲,张三这一吼,惊动了全村的人,大家都纷纷表示自己是第一个听到张三声音的人。这500块钱该给谁呢?于是村里又商讨出新的规定,需要有证据证明这是张三的声音。张三在喊的这一声里带有特定的声波数据,谁先破解出来就给谁。在比特币世界里,这是就是一个新的概念,共识机制。比特币是通过工作量证明的共识机制来决定记账权的,通俗来讲,谁证明了自己的工作量最大,谁就负责记账。工作量大小是通过计算符合某一个标准的比特币区块头的哈希散列值来体现的。区块头通常包含前一个区块的哈希散列值、Merkle根、时间戳、难度目标、以及一个填充的随机值。试图争夺记账权的节点称为挖矿节点,挖矿过程就是求出一个能够填充本区块头的随机值,让区块头的哈希散列值符合某一个标准。咱们接着故事讲,海归村民王二麻子凭借高超的计算能力,成功第一个匹配了张三的声波数据,然后他笑嘻嘻地向全村人广播自己破解成功。村民验证后,王二麻子如愿拿到了500元奖励金,李四也成功收到了张三的转账。网络上的每一个矿机接收并验证了一批交易,然后就开始进行挖矿,矿机需要反复的试验随机填充值来进行求解,一般采用产生随机数,尝试把产生的随机数填充到区块头,然后计算哈希。如果计算成功,则挖矿成功,向全网广播挖矿所得,全网节点验证后,把这个区块连接到区块的最上端,并且在全网达成一致。故事还在继续,王二麻子拿到这500元后就想:一个人的计算能力有限,我下次也非常可能不是第一个计算出来。若我改进算法,制造专门匹配这种声波数据的机器,然后卖机器岂不是能大赚一笔?于是就哼哧哼哧的专研去了,并在不久后面世。(专业矿机)村民蜡笔小明买了一台专业机器,觉得不错。于是大量采购,并找到一个电费低廉的场地,也请了专人人员来维护。于是,蜡笔小明便每天便看着一笔笔的500元进账。(矿场)村民张小凡也采购了一些机器,可是机器不多,能破解并拿到这500奖励的几率并不大。于是他创建了一个平台,所有有计算能力的人都可以参与进来。若得到奖励,则按每个人的计算力高低分配奖金。(矿池)好了,村民的故事差不多就到这里结束了,现在回过头来看文章开始的例子是不是特别形象?你们可以猜猜谁可能挖矿的最大算力。风险与受益其实,最初的时候,我们用电脑CPU就可以挖到比特币,比特币的创始人中本聪就是用他的电脑CPU挖出了世界上第一个创世区块。当然,现在也可以用家用电脑的CPU、GPU挖矿,只是收益非常低了。CPU挖矿的时代早已过去,GPU挖矿也早已不是主流,现在的比特币挖矿是ASIC挖矿和大规模集群挖矿的时代。回顾挖矿历史,比特币挖矿总共经历了以下五个时代:CPU挖矿→GPU挖矿→FPGA挖矿→ASIC挖矿→大规模集群挖矿 挖矿芯片更新换代的同时,带来的挖矿速度的变化是:CPU(20MHash/s)→GPU(400MHash/s)→FPGA(25GHash/s)→ASIC(3.5THash/s)→大规模集群挖矿(3.5THash/s*X)算力就是计算机每秒产生哈希碰撞的能力,算力越高,挖到比特币的概率越大,挖得比特币也就越多,回报越高。然而挖矿的受益并不是稳定且有保障的,电费将成为持续挖矿最大的成本之一,所以,有廉价电力的地方便成了旷工的最爱。挖矿的风险不仅于此,16年7月开始,比特币网络发行比特币数量就减半了,即每10分钟,每个区块只包含12.5个比特币,意味着相同算力挖出的比特币也会相应减少。但另一方面,币价也有上升可能。同时还伴随着断电、机器维护折旧等风险。最后,给大加介绍一种0风险赚钱的方法:猜出我兜里100元人民币的编号。哈哈。/逃跑...简单回答评论中 @诺pro 的一些疑问,估计也是很多人的疑问:1.目前比特币全部账本信息能很好的保存在一台普通的电脑上,这也是Core他们坚持不扩容的原因之一。另外根据摩尔定律,就算小扩容其实影响不大。2.仅仅降低交易费那么旷工没有动力,交易将更拥堵。当然这里有目前比较认可的取代方案POS。上面说的是挖矿是工作量证明即POW(Proof of Work),而POS的全称Proof of Stake,即股权证明。简单来说,就是一个根据你持有货币的量和时间,给你发利息的一个制度,有利于刺激全部用户参与,更去中心化。3.比特币等加密货币是匿名的,虽然你能看到纪录,但是你不知道是谁,同样你可以有多个匿名账户,中心化的你确定你能保密部分信息?4.不知道你这数据哪里来的,确实现在交易量少,原因很多,有支付场景弱,币价太高,大多数人持币待涨等多种因素。突然想到另一个因素,目前大量的币集中在交易所,很多交易所实际上是虚拟交易,当你要提币的时候才是真实交易,这样也大幅降低了真实交易量。2017/12/20更新公众号“对韭当割”,欢迎关注和交流。部分资料参考至@徐晓聪 @小龟 在本问题中的回答编辑于 2018-06-26 10:59​赞同 1195​​378 条评论​分享​收藏​喜欢

比特币入门教程 - 阮一峰的网络日志

比特币入门教程 - 阮一峰的网络日志

阮一峰的网络日志 » 首页 » 档案

上一篇:区块链入门教程    

下一篇:加密货币的本质    

分类:

理解计算机

⇐ 

 ⇒

比特币入门教程

作者: 阮一峰

日期: 2018年1月 4日

比特币(bitcoin)诞生于2008年的一篇论文。

一个署名为中本聪的人,提出了革命性的构想:让我们创造一种不受政府或其他任何人控制的货币!这个想法堪称疯狂:一串数字,背后没有任何资产支持,也没有任何人负责,你把它当作钱付给对方,怎么会有人愿意接受?

但是,狂想居然变成了现实。随后的几年,在全世界无数爱好者的支持下,比特币网络运行起来了,越来越多的人和资本参与,星星之火,终成燎原。刚刚过去的2017年,比特币迎来了爆发式的增长,从年初的1000美元,最高涨到了2万美元,全世界都为之震动,上到政府,下到普通百姓都在关注。事实就是比特币已经并将继续改变世界。

新闻媒体往往只关注它的火爆表现,忽视或者无法回答一些基本的问题。

比特币的原理是什么?

为什么这个无人管理的体系可以成功运作?

比特币交易的流程是怎么回事?

它与区块链又是什么关系?

下面,我尝试回答这些问题,希望帮助大家理解比特币。抛开技术细节,还是很容易解释的。

有一点说明,本文只讨论技术问题,不涉及如何投资比特币,更不会预测价格走势。事实上,我也不知道,如果我知道怎么发财,可能就不会在这里写博客了。

一、非对称加密

首先,理解比特币,必须理解非对称加密。

你可能听说过这个词,所谓非对称加密,其实很简单,就是加密和解密需要两把钥匙:一把公钥和一把私钥。

公钥是公开的,任何人都可以获取。私钥是保密的,只有拥有者才能使用。他人使用你的公钥加密信息,然后发送给你,你用私钥解密,取出信息。反过来,你也可以用私钥加密信息,别人用你的公钥解开,从而证明这个信息确实是你发出的,且未被篡改,这叫做数字签名(更详细的介绍请看《什么是数字签名》)。

现在请设想,如果公钥加密的不是普通的信息,而是加密了一笔钱,发送给你,这会怎样?

首先,你能解开加密包,取出里面的钱,因为私钥在你手里。其次,别人偷不走这笔钱,因为他们没有你的私钥。因此,支付可以成功。

这就是比特币(以及其他数字货币)的原理:非对称加密保证了支付的可靠性。

由于支付的钱必须通过私钥取出,所以你是谁并不重要,重要的是谁拥有私钥。只有拥有了私钥,才能取出支付给你的钱。(事实上,真实的交易流程稍有不同,私钥保证的不是取出支付给你的钱,而是保证只有你能把这些属于你的钱支付出去,详见后文。)

二、比特币钱包

对于比特币来说,钱不是支付给个人的,而是支付给某一把私钥。这就是交易匿名性的根本原因,因为没有人知道,那些私钥背后的主人是谁。

所以,比特币交易的第一件事,就是你必须拥有自己的公钥和私钥。

你去网上那些比特币交易所开户,它们会让你首先生成一个比特币钱包(wallet)。这个钱包不是用来存放比特币,而是存放你的公钥和私钥。软件会帮你生成这两把钥匙,然后放在钱包里面。

根据协议,公钥的长度是512位。这个长度不太方便传播,因此协议又规定,要为公钥生成一个160位的指纹。所谓指纹,就是一个比较短的、易于传播的哈希值。160位是二进制,写成十六进制,大约是26到35个字符,比如 1BvBMSEYstWetqTFn5Au4m4GFg7xJaNVN2。这个字符串就叫做钱包的地址,它是唯一的,即每个钱包的地址肯定都是不一样的。

你向别人收钱时,只要告诉对方你的钱包地址即可,对方向这个地址付款。由于你是这个地址的拥有者,所以你会收到这笔钱。

由于你是否拥有某个钱包地址,是由私钥证明的(具体的证明方法稍后介绍),所以一定要保护好私钥。这是极其重要的,如果你的私钥被偷了,你的比特币也就等于没了,因为他人可以冒用你的身份了,把钱包里面的钱都转走。

同样的,你向他人支付比特币,千万不能写错他人的钱包地址,否则你的比特币就支付到了另一个不同的人了。

三、交易过程

下面,我把整个流程串起来,看看比特币如何完成一笔交易。

一笔交易就是一个地址的比特币,转移到另一个地址。由于比特币的交易记录全部都是公开的,哪个地址拥有多少比特币,都是可以查到的。因此,支付方是否拥有足够的比特币,完成这笔交易,这是可以轻易验证的。

问题出在怎么防止其他人,冒用你的名义申报交易。举例来说,有人申报了一笔交易:地址 A 向地址 B 支付10个比特币。我怎么知道这个申报是真的,申报人就是地址 A 的主人?

比特币协议规定,申报交易的时候,除了交易金额,转出比特币的一方还必须提供以下数据。

上一笔交易的 Hash(你从哪里得到这些比特币)

本次交易双方的地址

支付方的公钥

支付方的私钥生成的数字签名

验证这笔交易是否属实,需要三步。

第一步,找到上一笔交易,确认支付方的比特币来源。

第二步,算出支付方公钥的指纹,确认与支付方的地址一致,从而保证公钥属实。

第三步,使用公钥去解开数字签名,保证私钥属实。

经过上面三步,就可以认定这笔交易是真实的。

四、交易确认与区块链

确认交易的真实性以后,交易还不算完成。交易数据必须写入数据库,才算成立,对方才能真正收到钱。

比特币使用的是一种特殊的数据库,叫做区块链(blockchain),详细的介绍请看《区块链入门教程》。本文只讨论交易如何写入区块链。

首先,所有的交易数据都会传送到矿工那里。矿工负责把这些交易写入区块链。

根据比特币协议,一个区块的大小最大是 1MB,而一笔交易大概是500字节左右,因此一个区块最多可以包含2000多笔交易。矿工负责把这2000多笔交易打包在一起,组成一个区块,然后计算这个区块的哈希。

计算哈希的过程叫做采矿,这需要大量的计算。矿工之间也在竞争,谁先算出哈希,谁就能第一个添加新区块进入区块链,从而享受这个区块的全部收益,而其他矿工将一无所获。

一笔交易一旦写入了区块链,就无法反悔了。这里需要建立一个观念:比特币不存放在钱包或其他别的地方,而是只存在于区块链上面。区块链记载了你参与的每一笔交易,你得到过多少比特币,你又支付了多少比特币,因此可以算出来你拥有多少资产。

五、矿工的收益

交易的确认离不开矿工。为什么有人愿意做矿工呢?

比特币协议规定,挖到新区块的矿工将获得奖励,一开始(2008年)是50个比特币,然后每4年减半,目前(2018年)是12.5个比特币。这也是比特币的供给增加机制,流通中新增的比特币都是这样诞生的。

你可能看出来了,每4年奖励减半,由于比特币可以分割到小数点后八位,那么到了2140年,矿工将得不到任何奖励,比特币的数量也将停止增加。这时,矿工的收益就完全依靠交易手续费了。

所谓交易手续费,就是矿工可以从每笔交易抽成,具体的金额由支付方自愿决定。你完全可以一毛不拔,一分钱也不给矿工,但是那样的话,你的交易就会没人处理,迟迟无法写入区块链,得到确认。矿工们总是优先处理手续费最高的交易。

目前由于交易数量猛增,手续费已经水涨船高,一个区块2000多笔交易的手续费总额可以达到3~10个比特币。如果你的手续费给低了,很可能过了一个星期,交易还没确认。

一个区块的奖励金12.5个比特币,再加上手续费,收益是相当可观的。按照目前的价格,可以达到100万~200万人民币。想想看,运气好的话,几分钟就能挖到一个区块,拿到这样一大笔钱,怪不得人们对挖矿趋之若鹜。

六、区块的扩容

《区块链入门教程》说过,比特币协议规定,平均10分钟诞生一个区块。区块的大小只有 1MB,最多只能包含2000多笔交易。也就是说,比特币网络每10分钟,最多只能处理2000多笔交易,换算一下,就是处理速度为3~5笔/秒。

全世界的比特币交易这么多,可是区块链每秒最多只能处理5笔,这已经成为制约比特币发展的一个瓶颈。

很早就有人呼吁,改革比特币协议,提升处理速度。这件事在2017年8月有了一点眉目,当时区块链发生了一次分叉,诞生了一个新协议,称为 Bitcoin Cash(简称 BCH)。这种新货币其他方面都与比特币一致,就是每个区块的大小从 1MB 增加到了 8MB,因此处理速度提升了8倍,手续费也低得多。该协议是对原有区块链的分叉,因此当时持有比特币的人,等于一人获赠了一份同样数量的 BCH。

BCH 等于创造了一种新货币,还有人提议,原始比特币的区块大小提升到 2MB,这称为 SegWit2x 。这个建议原定于2017年11月实施,但是最后一刻由于缺乏共识,就被取消了,目前还在讨论中。

七、点对点网络

比特币是一个全世界的开放网络,只要你有服务器,就能加入这个网络,成为一个节点。每个节点都包含了整个区块链(目前大概 100多 GB),并且节点之间时刻不停地在同步信息。

当你发生了一笔支付,你所在的节点就会把这笔交易告诉另一个节点,直至传遍整个网络。矿工从网上收集各种新发生的交易,将它们打包写入区块链。一旦写入成功,

矿工所在节点的区块链,就成为最新版本,其他节点都会来复制新增的区块,保证全网的区块链都是一致的。

最后,你所在的节点也拿到了最新的区块链,从而得知你早先的那笔交易,已经写在里面了,至此交易确认成功。

八、还有一个问题

写到这里,我就介绍完了比特币的基本知识,希望你已经明白了比特币是怎么回事。但是还有一个根本的问题,我没有回答:比特币的本质到底是什么?

说到底,比特币只是区块链的一条记录,是凭空生成的,为什么可以当钱用?举例来说,矿工获得12.5个比特币的奖励,其实就是区块链有一个记录:"xxx地址获得12.5个比特币"。正是这行记录,导致该矿工获得了大笔金钱。如果区块链突然增加了一条记录,记载你的地址获得了1000个比特币,你就真的会有1000个比特币。这到底是为什么?

这篇文章已经够长了,这个问题就留到下次再谈,欢迎关注本系列的最后一篇文章《加密货币的本质》。

九、参考链接

How Bitcoin works , by Timothy B. Lee

Bitcoins the hard way: Using the raw Bitcoin protocol, by Ken Shirriff

(完)

文档信息

版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)

发表日期: 2018年1月 4日

相关文章

2022.08.02: DNS 查询原理详解

通过 DNS 查询,得到域名的 IP 地址,才能访问网站。

2022.06.03: 字节序探析:大端与小端的比较

今天谈谈一个重要的计算机概念,大家可能都听说过它,但是很少深究,那就是字节序(Endianness)。

2022.02.04: 万兆家庭网络的时代

最近,我想将家里的网络设备,都升级到千兆。

2021.12.07: 为什么 Web3 与区块链有关

互联网迄今有两个阶段:Web 1.0 和 Web 2.0。

留言(162条)

Jaxure

说:

哈哈 最近阮老师集中研究这一块

2018年1月 4日 08:59

| #

| 引用

L.Rain

说:

引用Jaxure的发言:

哈哈 最近阮老师集中研究这一块

阮老师要出手了,哈哈

2018年1月 4日 09:25

| #

| 引用

binary

说:

"这个钱包不是用来存放比特币,而是存放你的公钥和私钥。软件会帮你生成这两把私钥,然后放在钱包里面。"

应该是生成这两把密钥

2018年1月 4日 09:34

| #

| 引用

zyg

说:

传说的去中心化呢~ 到头来还是矿工中心化~ 算力决定一切 哈哈~

2018年1月 4日 10:01

| #

| 引用

温国兵

说:

纠正一个错误

“你可能看出来了,每 4 年奖励减半,那么到了 2140 年,矿工将得不到任何奖励,比特币的数量也将停止增加。这时,矿工的收益就完全依靠交易手续费了。”

这里应该是 2040 年。

2018年1月 4日 10:07

| #

| 引用

机器猫电路改造

说:

关于第八个问题,不知道阮老师后续文章会不会谈到"比特币的伦理"问题;

比如比特币的出现对现阶段资源分配方式的影响?

如何面对和传统货币一样会带来犯罪问题? 对资源分配方式的处理问题?

另外,不知道阮老师,有没有机会谈一谈 World Community Grid,BOIN 等等这些分布计算? 很好奇,数字货币有没有可能和这些分布计算实现更科学的结合? 而不是像矿工们那样浪费资源.

2018年1月 4日 10:21

| #

| 引用

HiTimor

说:

好好好,入门篇。

2018年1月 4日 10:27

| #

| 引用

Mike

说:

比特币技术复杂、普通人不能很好的理解。比特币没有金融监管、容易产生金融犯罪。前段时间的黑客勒索无不采用比特币技术。所以个人并不看好这一块的技术。

2018年1月 4日 10:29

| #

| 引用

bravist

说:

写的真是通俗易懂,读了好多比特币的文章,这个原理解释地道

2018年1月 4日 10:35

| #

| 引用

小白

说:

有点疑惑,交易平台肯定需要维护 哪个比特币钱包是哪个用户的吧,而比特币钱包里包含公钥私钥,这样交易平台不就可以知道比特币是哪个用户的么

2018年1月 4日 11:37

| #

| 引用

TONYHEAD

说:

有若干疑问:

一个100GB的数据库就可以记录到比特币创立至今的所有交易往来?

"2000笔交易的区块手续费是3-10个比特币",这个交易成本太高了,2000笔流水,大一点的小卖部都不止这个数,难不成按目前的交易成本, 比特币只适合做大额资金的交易?

2018年1月 4日 11:59

| #

| 引用

问天玄铁

说:

比特币目前的很多问题(交易慢,账本大,算力集中)导致比特币一定不是数字货币的最终形态。我们不妨来想想更接近未来形态的数字货币协议和算法,就能让比特币变得不值钱,而且能让自己再次站在财富大门口。

2018年1月 4日 14:13

| #

| 引用

tc

说:

感谢科普了,通俗易懂。

不过有个疑问,“当矿工将得不到任何奖励,比特币的数量也将停止增加。这时,矿工的收益就完全依靠交易手续费了。”

这样感觉货币流通会很受影响啊,不知道在后面当数字货币的文章中会不会说明

2018年1月 4日 14:47

| #

| 引用

张庆华

说:

最近也在看这块,感觉非常有前途

2018年1月 4日 14:56

| #

| 引用

陈辉

说:

还是阮老师写的通俗易懂,能否一直同步到微信公众号里面。

2018年1月 4日 15:27

| #

| 引用

杨高超

说:

@TONYHEAD:

这个应该这么理解,比特币的交易不是以一个比特币为最小单位的,他可以无穷分割下去,例如一次交易交易了0.000001个比特币。

2018年1月 4日 15:31

| #

| 引用

leter

说:

如果我知道怎么发财,可能就不会在这里写博客了。说的很接地气。。哈哈

2018年1月 4日 15:39

| #

| 引用

没事扯扯蛋

说:

谁能说明比特币怎样和实际金钱或实物挂钩的???

如果不能挂钩,比特币就是个数字游戏,没有价值。

如果挂钩了,那说明比特币背后还是有势力(中心)支持的,否则怎么可能风生水起?

2018年1月 4日 16:08

| #

| 引用

BitcoinFan

说:

您最近有关注币圈么?感觉遗漏了很重要的东西:

1.挖矿赚币只是为了激励矿工,这个不是关键。挖矿的本质是达到分布式共识的手段,或者说,就是随机选一个人来记账,防止作弊,这个才是关键。

比特币安全的一个假设就是没有单个的人/组织能掌控50%以上的算力。

比特币的共识规则规定,大家都认最长链,更准确地说,是积累工作量最多的链。

矿工必须积极地接收别人挖到的新区块、在上面追加自己挖出的区块,并把自己挖出的区块积极广播出去,否则,他的链会被孤立,他就白干了。(可想而知,超过50%的算力,就不用鸟这些了)

2.扩容之争吵了几年了,现在BTC的开发者不愿意提高这个1MB的限制,是因为区块扩大后,会加剧比特币的中心化,这样的话,最后我们还不如直接用支付宝、VISA这样的中心化服务。

有人甚至认为比特币已经失去去中心化的本质,因为中国的大矿池已经垄断了算力,也就垄断了记账权。

有了SegWit之后,支撑交易量堪比VISA的闪电网络,还有其他技术能减少区块占用。而且,还有RSK等侧链技术可以期待。

Bitcoin Cash主要是中国矿工群体支持的,虽说未来扩大区块大小是不可避免的,但是Bitcoin Cash除了扩大区块大小,技术上并没有什么优势,它的宣传者还四处混淆视听,宣称只有自己才是真正的比特币。

闪电网络比较复杂,软件开发了几年,最近才基本成型,还在测试中。不过,也确实不能指望它能解决所有问题,因为闪电网络是为微支付设计的,支付通道的容量是有限的,大额交易可能还是直接走主链交易比较方便。

2018年1月 4日 16:37

| #

| 引用

BitcoinFan

说:

引用tc的发言:

感谢科普了,通俗易懂。

不过有个疑问,“当矿工将得不到任何奖励,比特币的数量也将停止增加。这时,矿工的收益就完全依靠交易手续费了。”

这样感觉货币流通会很受影响啊,不知道在后面当数字货币的文章中会不会说明

有人说最后手续费会占到交易额的5%,也有人认为用户花钱养矿工是不值得的,既浪费电,又不能消除被矿工攻击的风险。不如直接换共识机制,把工作证明(PoW)换掉,换成权益证明(PoS),大体上是谁持币多谁更有记账权,相信持币人不会做伤害体系利益的事情,否则他自己的利益会大大受损。

Peercoin算PoS的始祖,不过有学者指出它有漏洞,受到nothing at stake攻击的威胁;以太坊已经在测试PoS机制;还有Cardano,使用的是Ouroboros这个经过学术界同行评议的PoS机制。

2018年1月 4日 16:46

| #

| 引用

BitcoinFan

说:

引用TONYHEAD的发言:

有若干疑问:

一个100GB的数据库就可以记录到比特币创立至今的所有交易往来?

"2000笔交易的区块手续费是3-10个比特币",这个交易成本太高了,2000笔流水,大一点的小卖部都不止这个数,难不成按目前的交易成本, 比特币只适合做大额资金的交易?

现在已经有170GB了。

您怀疑比特币的交易量极为有限——确实是这样!比特币的交易容量小到“可笑”的程度。按照10分钟1MB来算,其实只相当于每秒7笔交易。

虽说可以把多笔交易拼成一个来节省空间,但这么做的效果是有限的。

对于交易所从1个地址提币给N个人这种情况,把多笔交易拼起来确实可以显著地节省空间,但是,这些币最终还是要再被它们的主人花出去,这个时候仍然需要消耗主链空间。

要理解具体情况,您可以去查一查比特币的交易格式,包括UTXO是什么。

我也可以大概给您描述一下:比特币的交易,由“输入”和“输出”两部分组成。

每一笔交易,都相当于把“输入”的币熔毁,重新铸造成“输出”中指定的金额。(其中输出金额需要小于等于输入,少的那部分作为付给矿工的手续费,计入coinbase交易)

所以,每个比特币地址上的余额都可以看作是通过从2009年“创世”开始的所有交易记录推算出来的。

“输入”部分包括数字签名(也就是“见证”部分),数据量一般比较大。

虽然扩大区块大小就可以提高交易量,但这样只是线性扩容,不能指数级地提升容量。

中国矿工群体和少数开发者认为,扩大区块容量并不会让比特币中心化,但是多数人(尤其是国外的社区)都不认同这种说法,目前排前几名的矿池已经把全网算力差不多都垄断了:https://btc.com/stats/pool。

多数开发者认为小额交易不能用宝贵的主链空间完成,需要放在主链之外,比如闪电网络,还有RSK等侧链。

还可以看看Bitcoin Core官方写的FAQ:https://bitcoincore.org/zh_CN/2015/12/21/%E7%B3%BB%E7%BB%9F%E6%89%A9%E5%B1%95%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98%E8%A7%A3%E7%AD%94/

2018年1月 4日 17:04

| #

| 引用

ixx

说:

引用小白的发言:

有点疑惑,交易平台肯定需要维护 哪个比特币钱包是哪个用户的吧,而比特币钱包里包含公钥私钥,这样交易平台不就可以知道比特币是哪个用户的么

交易平台提供一个钱包地址 你往里充钱并提供交易记录就可以了 跟你用银行转账类似

平台不会要所有人的钱包(要你也不会给的。。。)需要提币的时候 提供给平台你的钱包地址 就可以转到你的钱包里了

2018年1月 4日 18:01

| #

| 引用

ixx

说:

引用没事扯扯蛋的发言:

谁能说明比特币怎样和实际金钱或实物挂钩的???

如果不能挂钩,比特币就是个数字游戏,没有价值。

如果挂钩了,那说明比特币背后还是有势力(中心)支持的,否则怎么可能风生水起?

最开始有一部分人出于各种目的(收藏,或是炒作),允许你买他们的东西使用比特币支付(最开始买个比萨要50比特币。。。。现在想想。。。)慢慢的,越来越多的人接受了他,才发展到现在,这东西不可做假且数量固定,就像限量版的乐高一样,越多的人支持,“收藏”越值钱

2018年1月 4日 18:10

| #

| 引用

林海草原

说:

关于比特币,之前我还真没有了解过。前两天,一位博友的博客被挂马,被挂的是一个在线挖矿代码,每次打开博客都会被执行。我当时简单了解了一下,但是网上的文章晦涩。当今天看到阮老师的博文,我才真正知道挖矿是什么。挖矿能拿到如此高的奖励,难怪有些人会通过程序漏洞给别人的网站挂马来挖矿。

2018年1月 4日 18:12

| #

| 引用

jg

说:

引用小白的发言:

有点疑惑,交易平台肯定需要维护 哪个比特币钱包是哪个用户的吧,而比特币钱包里包含公钥私钥,这样交易平台不就可以知道比特币是哪个用户的么

交易平台是知道的,有的平台还实名认证的。

不放心,可以把从平台转移到自己的钱包就好了

2018年1月 4日 18:50

| #

| 引用

BitcoinFan

说:

引用小白的发言:

有点疑惑,交易平台肯定需要维护 哪个比特币钱包是哪个用户的吧,而比特币钱包里包含公钥私钥,这样交易平台不就可以知道比特币是哪个用户的么

交易平台相当于你把比特币转给他们,然后他们给你一个欠条。

可以说中心化的交易所和比特币的理念是完全背道而驰的。

交易所也确实是各种不靠谱,宣称“被盗”之类事情发生过好多次了,还有结合期货杠杆交易操纵价格、虚发假币之类黑历史。

2018年1月 4日 19:21

| #

| 引用

BitcoinFan

说:

引用林海草原的发言:

关于比特币,之前我还真没有了解过。前两天,一位博友的博客被挂马,被挂的是一个在线挖矿代码,每次打开博客都会被执行。我当时简单了解了一下,但是网上的文章晦涩。当今天看到阮老师的博文,我才真正知道挖矿是什么。挖矿能拿到如此高的奖励,难怪有些人会通过程序漏洞给别人的网站挂马来挖矿。

比特币早就不能用电脑(CPU或GPU)挖了,连FPGA都不行了,现在都是ASIC专用芯片挖矿。详细数据可以看这个:

https://en.bitcoin.it/wiki/Mining_Hardware_Comparison

2018年1月 4日 19:23

| #

| 引用

BitcoinFan

说:

引用jg的发言:

交易平台是知道的,有的平台还实名认证的。

不放心,可以把从平台转移到自己的钱包就好了

比特币的交易记录是一环扣一环,可以追溯的,而且完全公开(随便找个区块浏览器就可以方便地查,开一个比特币全节点也可以直接下载区块链数据)。如果不用混币之类的手段来切断追踪,从实名制交易所转出去还是可以被跟踪的。

2018年1月 4日 19:26

| #

| 引用

BitcoinFan

说:

引用林海草原的发言:

关于比特币,之前我还真没有了解过。前两天,一位博友的博客被挂马,被挂的是一个在线挖矿代码,每次打开博客都会被执行。我当时简单了解了一下,但是网上的文章晦涩。当今天看到阮老师的博文,我才真正知道挖矿是什么。挖矿能拿到如此高的奖励,难怪有些人会通过程序漏洞给别人的网站挂马来挖矿。

现在这些“挖矿木马”挖的都是Monero之类山寨币,它们换掉了比特币的双SHA256工作证明算法,换成对ASIC极不友好的CryptoNight等,这样CPU或GPU挖矿才有可能,否则就被ASIC的能效虐翻了,直接亏本出局。

山寨币一般也都在技术上有创新和改进,比如Monero,已经全网启用RingCT,交易都是机密的,不像比特币那样全部公开透明、可追踪。

2018年1月 4日 19:29

| #

| 引用

ljt2k

说:

对于比特币来说,钱不是支付给个人的,而是支付给某一把私钥。

这里应该是支付给某一把公钥

2018年1月 5日 14:07

| #

| 引用

两只羊

说:

货币的由来是人民生产出来充当流通的东西。

这个是怎么来的,炒作来的。为什么能存在,值得思量的事情。

2018年1月 5日 14:55

| #

| 引用

麻三

说:

老师,下一篇啥时候来啊

2018年1月 5日 15:45

| #

| 引用

区块链小白

说:

如果因为战争,切断了所有出口网络,是不是就变成两条比特链了?

2018年1月 5日 17:54

| #

| 引用

H-u-a-n

说:

写的确实简单易懂,阮老师,受教了,Thanks♪(・ω・)ノ

2018年1月 6日 11:38

| #

| 引用

Dong

说:

有个疑问求解答:

一块区块链只能存2000笔交易,2040年就挖不到新的区块链,但交易是继续增加的,那么区块链用完了怎么办呢?

2018年1月 6日 11:47

| #

| 引用

Ellie Ren

说:

赞 以后可以follow 看你的博客了

2018年1月 6日 11:55

| #

| 引用

xunzhang

说:

如果10分钟内写不满1MB记录,如何处理

2018年1月 6日 15:12

| #

| 引用

Asid

说:

有那个比特币钱包能用的?搜了几个网让,还有ANDORID/IOS的APP,不敢用啊。怕有后门。

2018年1月 6日 17:09

| #

| 引用

方减

说:

浅显易懂,非常好的科普入门文章!期待下一篇

2018年1月 6日 20:30

| #

| 引用

zero

说:

引用小白的发言:

有点疑惑,交易平台肯定需要维护 哪个比特币钱包是哪个用户的吧,而比特币钱包里包含公钥私钥,这样交易平台不就可以知道比特币是哪个用户的么

交易所才是真正密钥的掌控者,用户实际上是不掌控密钥的。

2018年1月 7日 02:09

| #

| 引用

哈哈

说:

引用jg的发言:

交易平台是知道的,有的平台还实名认证的。

不放心,可以把从平台转移到自己的钱包就好了

这点倒是真的,哈哈哈,我做个这样的平台

2018年1月 8日 09:58

| #

| 引用

max210

说:

期待下一篇

2018年1月 8日 11:16

| #

| 引用

吕海超

说:

连着看完区块链和比特币,特别期待你写《数字货币的本质》,这几天每天都会登上来看一下有没有更新。。。

2018年1月 8日 14:20

| #

| 引用

杨峰

说:

很好奇,比特币是怎么开始的?有这个想法是因为,采矿是产生比特币的“造血系统”,而造血的过程是写入交易记录,而最初是没有交易记录给人来写的。

2018年1月 8日 15:50

| #

| 引用

BitcoinFan

说:

引用Dong的发言:

有个疑问求解答:

一块区块链只能存2000笔交易,2040年就挖不到新的区块链,但交易是继续增加的,那么区块链用完了怎么办呢?

你混淆了比特币发行和挖矿机制。

比特币发行是以区块补贴的形式发放,四年一减半,2140年区块补贴才会归零,但十几年后区块补贴就接近归零了。

但是,矿工还能收到手续费收入。只要矿工有收入,他们就会继续挖。

而且,比特币的难度调整机制让它保持大约10分钟挖出一个区块,无论挖矿的算力是多还是少都是这样。挖矿的算力多了,难度就上升、出块(先加快再)放缓,反之难度下降、出块(先放缓再)加快。

2018年1月 8日 19:05

| #

| 引用

BitcoinFan

说:

引用xunzhang的发言:

如果10分钟内写不满1MB记录,如何处理

以前一直是写不满的,写满了才有拥堵问题。

2018年1月 8日 19:06

| #

| 引用

BitcoinFan

说:

引用杨峰的发言:

很好奇,比特币是怎么开始的?有这个想法是因为,采矿是产生比特币的“造血系统”,而造血的过程是写入交易记录,而最初是没有交易记录给人来写的。

没人用,矿工可以打空块。

比特币最初就是中本聪一个人在那里挖。

2018年1月 8日 21:15

| #

| 引用

BitcoinFan

说:

引用Asid的发言:

有那个比特币钱包能用的?搜了几个网让,还有ANDORID/IOS的APP,不敢用啊。怕有后门。

比特币官网:https://bitcoin.org/zh_CN/

按照去中心化的精神,比特币是没有官网的,这个网站的管理员是Cobra。

一般用户推荐Electrum,最好结合硬件钱包,防止木马偷币。

比太钱包也不错,有方便的冷热钱包选择。

想折腾技术就装Bitcoin Core,不过这个是全节点,要下载一百多GB的区块链数据。

顺便说一下,现在1M区块空间已经满了,手续费比较高,转账时最好启用RBF(勾选Replacable),这样万一转账卡着了,可以直接加手续费加速确认。

2018年1月 8日 21:18

| #

| 引用

BitcoinFan

说:

SegWit2x的目的其实是把Core踢出去,而不是扩容。但实际上支持Core的人还是不少的,Core不愿意被“打脸”,这个2x还能有多少支持率呢……

而且,实际上2x这个项目搞出来的btc1软件(从Core fork出来的)很挫,最后还爆出off-by-one这种低级bug,参与者大概本来就是同床异梦吧。

2018年1月 9日 07:30

| #

| 引用

Mark

说:

引用BitcoinFan的发言:

您最近有关注币圈么?感觉遗漏了很重要的东西:

1.挖矿赚币只是为了激励矿工,这个不是关键。挖矿的本质是达到分布式共识的手段,或者说,就是随机选一个人来记账,防止作弊,这个才是关键。

比特币安全的一个假设就是没有单个的人/组织能掌控50%以上的算力。

比特币的共识规则规定,大家都认最长链,更准确地说,是积累工作量最多的链。

矿工必须积极地接收别人挖到的新区块、在上面追加自己挖出的区块,并把自己挖出的区块积极广播出去,否则,他的链会被孤立,他就白干了。(可想而知,超过50%的算力,就不用鸟这些了)

2.扩容之争吵了几年了,现在BTC的开发者不愿意提高这个1MB的限制,是因为区块扩大后,会加剧比特币的中心化,这样的话,最后我们还不如直接用支付宝、VISA这样的中心化服务。

有人甚至认为比特币已经失去去中心化的本质,因为中国的大矿池已经垄断了算力,也就垄断了记账权。

有了SegWit之后,支撑交易量堪比VISA的闪电网络,还有其他技术能减少区块占用。而且,还有RSK等侧链技术可以期待。

Bitcoin Cash主要是中国矿工群体支持的,虽说未来扩大区块大小是不可避免的,但是Bitcoin Cash除了扩大区块大小,技术上并没有什么优势,它的宣传者还四处混淆视听,宣称只有自己才是真正的比特币。

闪电网络比较复杂,软件开发了几年,最近才基本成型,还在测试中。不过,也确实不能指望它能解决所有问题,因为闪电网络是为微支付设计的,支付通道的容量是有限的,大额交易可能还是直接走主链交易比较方便。

想问 BitcoinFan 一个问题,挖矿的成功与否是不是取决于计算机计算力的大小,假设有人的或者某个组织的计算机计算力非常强,那不代表每次的挖矿都是他们成功了?这不就有可能超过50%以上的算力了吗

2018年1月 9日 11:35

| #

| 引用

henry

说:

交易所才是中心化的东西!我猜你在交易所买卖比特币,真正的比特币有可能是交易所帮你代持!就像互联网彩票一样!

2018年1月 9日 11:42

| #

| 引用

重本聪

说:

看了一片文章 都是深入浅出的讲这个技术 能看懂一半吧 可是作为货币 货币啊 它的基础在哪 目前看就是谁的矿机多谁厉害啊 比特币个数是定的 所谓涨跌 都是炒出来的 这不是货币的基本价值啊 还有 这玩意不唯一 现在有起码数十种 加密货币 这肯定不算那些传销用货币 这些货币号称都是更牛逼的 更合理的 发明的人更吊的 说道发明人 这些中本聪就是因为聪明发明了这么一套理论? 他定的各种协议 规矩大家就 必须遵守 就是因为互联网精神就是公平公正?这是不是太乌托邦了 那以后有没有大本聪 巨本聪 利用这些干坏事呢

2018年1月 9日 11:48

| #

| 引用

重本聪

说:

引用Mark的发言:

想问 BitcoinFan一个问题,挖矿的成功与否是不是取决于计算机计算力的大小,假设有人的或者某个组织的计算机计算力非常强,那不代表每次的挖矿都是他们成功了?这不就有可能超过50%以上的算力了吗

有个机制 算出来的时间并不固定 如果一段时间内太多了 就会增加难度 太少了 就会减小 大概这么个意思 算力是基础 但不是一定就最先算出来 但矿机多 肯定没错 你看看网上那些一片矿机的照片

2018年1月 9日 11:52

| #

| 引用

sms

说:

所以说,下个钱包app就分了一对key和一个地址?没有交易的话这个地址有效么?不怎么懂

2018年1月 9日 14:47

| #

| 引用

凡浩浩

说:

关注的博客很久了,看了你很多文章,佩服您的才华,敬佩您的坚持,感谢您的分享,很想问您一个问题,您最初热爱文学,后来获得经济学博士学历,成为大学教授,现在又是计算机工程师,在每一次选择的时候,您迷茫过吗?什么才您的热爱,您未来还会选择做别的吗?

2018年1月 9日 15:35

| #

| 引用

小米

说:

有一个地方不明白,需要请教博主。

如果我是矿工,挖矿时在当前交易记录中擅自增加一条“我获得1000比特币”的记录,然后很幸运这块矿被我挖到,交易记录被记录和通报全网了。

那是不是就能作弊了?

2018年1月 9日 16:30

| #

| 引用

王挺

说:

引用BitcoinFan的发言:

你混淆了比特币发行和挖矿机制。

比特币发行是以区块补贴的形式发放,四年一减半,2140年区块补贴才会归零,但十几年后区块补贴就接近归零了。

但是,矿工还能收到手续费收入。只要矿工有收入,他们就会继续挖。

而且,比特币的难度调整机制让它保持大约10分钟挖出一个区块,无论挖矿的算力是多还是少都是这样。挖矿的算力多了,难度就上升、出块(先加快再)放缓,反之难度下降、出块(先放缓再)加快。

我也有此疑问,但感觉这个回答没答到点上。

交易记录是必须要附在新的区块里,再写入主区块链才能生效的。而2040年之后,已经没机会“算出”新的区块了,还怎么附加交易记录呢?

2018年1月 9日 20:00

| #

| 引用

小米

说:

引用王挺的发言:

我也有此疑问,但感觉这个回答没答到点上。

交易记录是必须要附在新的区块里,再写入主区块链才能生效的。而2040年之后,已经没机会“算出”新的区块了,还怎么附加交易记录呢?

你没有分清楚生成区块与取得比特币之间的区别。区块是永远可以生成的,只要对上一区块的头文件进行hash运算并符合难度要求即可。但生成区块后,能否得到比特币奖励,是不一定的,固定收益是逐年递减的。

2018年1月10日 14:24

| #

| 引用

davino

说:

有几个疑问:

1. 交易平台是不是本身自己就是矿工?

2. 如果交易平台是矿工,在上面平台上用户的交易是实时的,但交易平台如果成功把记录放到链上,是不是等于你和用户没有进行任何操作?

3. 火币现在能进行P2P的交易。如果火币没有挖到矿,不是等于买方白给钱了?

2018年1月10日 16:10

| #

| 引用

齐宁

说:

我在想,中本聪拥有多少比特币,现在财富有多少了...

2018年1月10日 16:54

| #

| 引用

YANG

说:

如果我说这东西是骗人的,会不会有人来教育我?

区块链本质不谈,就说普通用户层面。

1. 普通人使用比特币的最大理由是什么?

2. 为什么要去挖矿?货币不是拿来用的么,为啥大部分人不去使用它。

3. 根据文中所写,在极端情况下一笔交易可能不会被确认,或者很长时间才能被记录下来。人们使用这种东西图了个啥?

4. 为什么要相信比特币组织,而不相信现有的货币发行组织?

2018年1月11日 10:47

| #

| 引用

FTY

说:

个人认知太浅,无非是浪费世界资源。与权贵争,成王败寇而已。

2018年1月11日 11:16

| #

| 引用

张鹏

说:

1,打包是谁做的? 旷工如何判断打包没有造假?

2,一个打包要2000条交易记录,如果当前一直不足2000条,打包会一直等待?

3,全网同步区矿链,这个效率会不会很低? 这很容易发生不一致问题。新的区块如何保证链到了最新的区块后面?

2018年1月11日 15:44

| #

| 引用

fogin

说:

引用TONYHEAD的发言:

有若干疑问:

一个100GB的数据库就可以记录到比特币创立至今的所有交易往来?

"2000笔交易的区块手续费是3-10个比特币",这个交易成本太高了,2000笔流水,大一点的小卖部都不止这个数,难不成按目前的交易成本, 比特币只适合做大额资金的交易?

连大额资金交易这个场景也做不了, 你知道这个世界上每秒发生着多少笔大额交易么。。。

2018年1月11日 16:59

| #

| 引用

forget

说:

引用小白的发言:

有点疑惑,交易平台肯定需要维护 哪个比特币钱包是哪个用户的吧,而比特币钱包里包含公钥私钥,这样交易平台不就可以知道比特币是哪个用户的么

可以这样理解:比特币是在全世界网络中交易的,而公钥和私钥是用比特币底层了一组加密算法产生的。我们想要参与其中就需要得到这组秘钥。这个交易平台(比如:比特币中国)就是帮我们来用这个加密算法产生这组秘钥的。谁都可以去要,然后平台就给你生成这对秘钥。中间应该不会记录你的任何信息。就好比:我是大街上的一个小贩,你是路人,你想买了东西了,我卖给你就是了,不需要你的任何信息。

2018年1月12日 11:22

| #

| 引用

BitcoinFan

说:

引用王挺的发言:

我也有此疑问,但感觉这个回答没答到点上。

交易记录是必须要附在新的区块里,再写入主区块链才能生效的。而2040年之后,已经没机会“算出”新的区块了,还怎么附加交易记录呢?

新的比特币目前是通过每区块12.5BTC、四年一减半的区块补贴形式发放的(也就是从coinbase交易里“凭空生成”)。

但是,挖新区块在技术上并不需要生成新的比特币。

实际上,就在现在,矿工就可以选择不拿区块补贴(目前是每区块12.5BTC)——最近就有矿池出了Bug,涉事矿工不慎“弄丢”了12.5BTC:

http://8btc.com/thread-121250-1-1.html

对于矿工来说,有利益驱动,他们才会去挖矿。没了区块奖励,他们还可以收交易手续费,这个可以成为驱动他们挖矿的激励。

但是,其实很多人都觉得这个设计不好,他们认为手续费必须占交易额的一个比例才能维持系统安全,这个比例低了,矿工作为“保安”就可能反过来“监守自盗”。而且,维持这个体系运转还要白白烧电。

所以,现在还有人在研究PoS等新共识机制,比如以太坊的Casper、Cardano的Ouroboros,试图取代目前被比特币和以太坊使用的PoW共识机制(这个我也是拾人牙慧,各位感兴趣可以去知乎关注maxdeath这位大神)

引用davino的发言:

有几个疑问:

1. 交易平台是不是本身自己就是矿工?

2. 如果交易平台是矿工,在上面平台上用户的交易是实时的,但交易平台如果成功把记录放到链上,是不是等于你和用户没有进行任何操作?

3. 火币现在能进行P2P的交易。如果火币没有挖到矿,不是等于买方白给钱了?

1.交易平台相当于一个比特币用户。平台不需要是矿工,但也有矿业兼职开交易平台,比如ViaBTC,是个矿池,他们就开过交易所。

2.没太理解你的意思。你想问交易所能不能赖账么?

现在的交易所一般都是中心化的,而且好像大多没有第三方存管,这不就坑爹了——相当于你把比特币和人民币、美元等法币转给他,他给你一个欠条,他们赖账跑路你就GG了。然后,平台上的各种交易都和比特币区块链无关,直到你提币或充币。哪怕是ViaBTC这样的也不例外。

3.P2P?你说的是OTC场外交易么?场外是把原来的集中竞价撮合去掉,大家手动发布交易信息、进行交易,平台只做信息交流和中间人担保。币一般是其他用户充的,不是平台挖的。而且这种场外交易确实不能完全保证货银对付,可能发生一方伪造法币支付凭据、忽悠对方放币等欺诈。

2018年1月13日 00:53

| #

| 引用

BitcoinFan

说:

引用张鹏的发言:

1,打包是谁做的? 旷工如何判断打包没有造假?

2,一个打包要2000条交易记录,如果当前一直不足2000条,打包会一直等待?

3,全网同步区矿链,这个效率会不会很低? 这很容易发生不一致问题。新的区块如何保证链到了最新的区块后面?

1.只有矿工有记账权:因为只有矿工有算力、能挖出满足全网的难度需求的新区块,所以只有他们能挖出合法的区块。

2.不会,矿工可以打空块(只有一条给自己发奖励的coinbase交易)。区块满了反而会有问题——拥堵、手续费高涨。

现在的区块大小上限是1MB,或者说是浮动的(因为SegWit已经激活,交易信息被分为两部分,其中“见证”这个部分字节数按照乘0.25计算)

3.效率确实很低。不一致问题,挖矿就是解决这个问题的,挖矿是一种分布式共识机制,叫工作证明。大家只认最长链有效(准确地说是积累工作量最大的链)。

2018年1月13日 00:57

| #

| 引用

BitcoinFan

说:

引用张鹏的发言:

1,打包是谁做的? 旷工如何判断打包没有造假?

2,一个打包要2000条交易记录,如果当前一直不足2000条,打包会一直等待?

3,全网同步区矿链,这个效率会不会很低? 这很容易发生不一致问题。新的区块如何保证链到了最新的区块后面?

比特币的交易记录是一环扣一环的。如果一个新节点要严格验证的话,需要从2009年的创世区块开始验证(不断地更新UTXO集合,也就是删掉“已经被原主人花掉的币”,加入“有了新主人的币”)。但是,这样跑一遍验证,只能防止抢劫比特币、无端凭空生成比特币,不能阻止双重支付。

每条交易都会被广播到整个网络。交易包含数字签名,节点也会维持一个UTXO集合,可以验证交易是否有效,强制花别人的币、花无中生有的币都是无效交易,会被丢弃。矿工会把验证过的交易加到要挖的区块里,如果hash值碰出来了,挖到了有效的区块,他们就会立刻把这个新区块广播出去,让大家检查、承认。

2018年1月13日 01:10

| #

| 引用

BitcoinFan

说:

引用forget的发言:

可以这样理解:比特币是在全世界网络中交易的,而公钥和私钥是用比特币底层了一组加密算法产生的。我们想要参与其中就需要得到这组秘钥。这个交易平台(比如:比特币中国)就是帮我们来用这个加密算法产生这组秘钥的。谁都可以去要,然后平台就给你生成这对秘钥。中间应该不会记录你的任何信息。就好比:我是大街上的一个小贩,你是路人,你想买了东西了,我卖给你就是了,不需要你的任何信息。

你的描述是错的。

密钥是任何人都可以生成的。比特币用了ECDSA这个非对称加密算法,它被用来确定一个币的控制权/所有权——只有掌握私钥的人才能花对应地址上的币。

这个和交易平台完全没关系,交易平台只是为了方便比特币法币(如人民币/美元)或比特币山寨币的交易而存在的,只有集中竞价撮合的交易所才能产生足够的流动性和市场深度——有了交易所,一秒钟你就可以卖掉/买入1.5BTC,币很多的话还能挂冰山委托慢慢买/卖,如果没有交易所,你就需要自己去场外交易平台甚至是微信群等地方,手动挂单、喊单、吃单,一大意还会被骗。

可以说交易所在比特币系统里也只是个用户而已。

2018年1月13日 01:18

| #

| 引用

BitcoinFan

说:

引用张鹏的发言:

1,打包是谁做的? 旷工如何判断打包没有造假?

2,一个打包要2000条交易记录,如果当前一直不足2000条,打包会一直等待?

3,全网同步区矿链,这个效率会不会很低? 这很容易发生不一致问题。新的区块如何保证链到了最新的区块后面?

补充一下,花“已经花掉的币”也是无效交易。

至于双重支付,需要有很大的算力(51%攻击)才能做到,原理是用大算力挖一条更长的链,在这条链里,原先转给A的币被转给了B。有了超过50%的算力,只要坚持时间够长就一定能成功;如果没有那么多算力,也有一定概率能成功,但确认数越多,成功概率越低。

51%攻击能产生的实质威胁主要就是双重支付,除此之外还有审查交易(换句话说就是冻结指定的地址)等手段。

2018年1月13日 01:22

| #

| 引用

BitcoinFan

说:

@YANG:

这个就是信仰问题了,是信政府这个中央权威,还是信比特币这套分布式共识机制呢?没法说得通啦。

有人就认为比特币最后会像“世界语”一样半死不活。

要说骗局的话,拉高出货就可以看作是欺诈,无论是股市还是币市,这种现象都存在。

2018年1月13日 01:28

| #

| 引用

BitcoinFan

说:

引用小米的发言:

有一个地方不明白,需要请教博主。

如果我是矿工,挖矿时在当前交易记录中擅自增加一条“我获得1000比特币”的记录,然后很幸运这块矿被我挖到,交易记录被记录和通报全网了。

那是不是就能作弊了?

你这么做,挖出的区块就是非法的。

只要别的节点(无论是矿工的全节点,还是不挖矿的全节点)接收到区块进行检查就会发现新生成的币量超过共识规则规定的区块奖励,然后就会拒绝承认这个区块。

2018年1月13日 01:30

| #

| 引用

BitcoinFan

说:

引用Mark的发言:

想问 BitcoinFan一个问题,挖矿的成功与否是不是取决于计算机计算力的大小,假设有人的或者某个组织的计算机计算力非常强,那不代表每次的挖矿都是他们成功了?这不就有可能超过50%以上的算力了吗

没有人掌握超过50%的算力是比特币安全的前提。

如果有人掌握的算力超过50%,他就可以不用鸟别的节点挖出的区块,然后就可以进行51%攻击——比如回滚交易记录,或者审查交易(冻结任意比特币地址)。但即使是这样,他也可能会顾忌攻击行为是否会让比特币失去价值(然后他的矿机和币就都作废了),所以即使有人手里有超过50%的算力也未必会实行51%攻击。

2018年1月13日 01:35

| #

| 引用

BitcoinFan

说:

引用温国兵的发言:

纠正一个错误

“你可能看出来了,每 4 年奖励减半,那么到了 2140 年,矿工将得不到任何奖励,比特币的数量也将停止增加。这时,矿工的收益就完全依靠交易手续费了。”

这里应该是 2040 年。

博主没错,就是2140年。

但是,四年一减半还是很快的,再减半几次,区块补贴就已经接近归零了。

2018年1月13日 01:40

| #

| 引用

BitcoinFan

说:

引用davino的发言:

有几个疑问:

1. 交易平台是不是本身自己就是矿工?

2. 如果交易平台是矿工,在上面平台上用户的交易是实时的,但交易平台如果成功把记录放到链上,是不是等于你和用户没有进行任何操作?

3. 火币现在能进行P2P的交易。如果火币没有挖到矿,不是等于买方白给钱了?

前面的回帖好像没显示出来,不知道是不是博主要审核……

交易平台只相当于一个比特币用户,往难听了说,就是你把币转给他们,他们给你一个欠条。

也有ViaBTC这样矿业兼职开交易所的,即使是这样,性质仍然不变。

2018年1月13日 01:43

| #

| 引用

BitcoinFan

说:

引用sms的发言:

所以说,下个钱包app就分了一对key和一个地址?没有交易的话这个地址有效么?不怎么懂

密钥是任何人都可以生成的,必须随机生成,否则别人就可以猜出来,这样就不安全了。

比特币用了ECDSA这个非对称加密算法,打个比方,就是认章不认人,章(密钥)其实有机器就能刻(任何人都可以用电脑生成,甚至可以用骰子来生成),只有你手里有章(私钥),能给账单盖章(数字签名),其他人手里都有完整账本,如果你想花无中生有的钱、花之前已经被花掉的钱、花别人的钱,都是无效的。

私钥可以推算出公钥,公钥经过两次哈希运算,再加上校验值、经过Base58编码就得到地址。反推在目前是不可能的,除非ECDSA、RIMEPD160、SHA256算法被破解(哈希算法本来就是不可逆的,即使“破解”,也不能由哈希值“恢复原状”,只是能找到碰撞值而已,不过目前找到碰撞也足够花别人地址上的钱了)。

现在的钱包一般都是HD的,也就是分层确定性钱包,由一个随机种子就可以推算出几乎无穷无尽的私钥,种子还可以表示为一串单词(密语),这样备份/恢复钱包就方便了,而且可以每次使用比特币都换一个地址。

2018年1月13日 01:58

| #

| 引用

BitcoinFan

说:

引用sms的发言:

所以说,下个钱包app就分了一对key和一个地址?没有交易的话这个地址有效么?不怎么懂

没用过的地址也是有效的。

博主对比特币地址的描述有误:比特币地址不是用十六进制表示公钥的哈希,而是用Base58编码表示公钥的哈希+一段校验值。用那段校验值就可以知道地址有没有错。

甚至还有找不到对应私钥的“烧币地址”(Proof of Burn),转进去的币就无法被转出来,等于被销毁了,这种地址同样是有效的。比如:合约币CounterParty提出的1CounterpartyXXXXXXXXXXXXXXXUWLpVr。生成这种地址也不难,先写出Base58地址,内容可以任意,然后算出对应的二进制数据(Base58解码),再计算对应的校验值,加到后面,然后重新Base58编码,就可以得到这种“烧币地址”。

2018年1月13日 02:17

| #

| 引用

BitcoinFan

说:

@YANG:

比特币的优点在于无国界、(伪)匿名、快速(相对电汇等传统服务)、安全等。价格波动大也确实是个问题,不过也不是完全没办法,比如用期货交易对冲(不过目前期货交易平台也是中心化的,甚至有平台亲自下海操纵市场等黑历史,而且,平台肯定要收交易手续费)。

挖矿是达成分布式共识的手段,这样才能防止双重支付。也有人觉得挖矿不好,达成共识慢、吞吐量有限、浪费能源、可能“监守自盗”,就开始想办法改进,所以现在也有其他共识机制,比如以太坊的Casper、Cardano的Ouroboros,都是PoS共识机制;还有比特股的DPoS等。

2018年1月13日 02:47

| #

| 引用

walker

说:

问两个问题啊:

1, 目前每个节点大小约为100G, 也就是说选择加入这个网络的话, 初始是要"同步"100G 的内容到硬盘上对吧?

2, 没有确认的交易, 是以什么形式传遍全网的? 从文中的描述, 好像是"纯请求, 不持久化", 那么文中又描述了有的交易因为手续费低, 可能几周都没有确认, 那么可以推断出任何交易其实都是持久化了的(并且严格遵循区域链的原因, 保证了不可篡改), 并不是单纯靠

"即时"的网络请求, 所以一个比特币节点严格意义上是有确认的和多如牛毛未确认的"数据库"构成? 这样的话, 目前总量100G 的大小, 其实饱含了即时全网所有未确认的交易数据, 这个理解对么?

2018年1月15日 01:51

| #

| 引用

Leo

说:

引用小白的发言:

有点疑惑,交易平台肯定需要维护 哪个比特币钱包是哪个用户的吧,而比特币钱包里包含公钥私钥,这样交易平台不就可以知道比特币是哪个用户的么

有道理啊

2018年1月15日 11:09

| #

| 引用

rstevens

说:

首先赞一下阮老师的文章!

不过还是有很多细节的地方有疑惑,例如

"首先,所有的交易数据都会传送到矿工那里。矿工负责把这些交易写入区块链。

根据比特币协议,一个区块的大小最大是 1MB,而一笔交易大概是500字节左右,因此一个区块最多可以包含2000多笔交易。矿工负责把这2000多笔交易打包在一起,组成一个区块,然后计算这个区块的 Hash。"

1、 交易数据是怎么传到矿工那的? 是发给所有矿工么?

2、 矿工自己来决定把多少个交易合并到一个区块中么?

这些细节,如果有实现代码可以看到就好了。阮老师知道有哪些开源的代码可以学习么?

2018年1月15日 16:41

| #

| 引用

ty

说:

所有的交易数据都会传送到矿工那里。矿工负责把这些交易写入区块链。

根据比特币协议,一个区块的大小最大是 1MB,而一笔交易大概是500字节左右,因此一个区块最多可以包含2000多笔交易。

相请教第一个块区是怎么来的?没有交易矿工就没办法写入块区,不写入块区就得不到比特币。

实在想不通,求指教。

2018年1月15日 21:34

| #

| 引用

Alex

说:

其实,任何东西想成为货币,就是一个信心,当然还有方便性。

要是人们都认为这东西能当钱使,那它就值钱了。

就像一般等价物的诞生一样,只不过现在的技术让这个过程简化快捷了很多。

这发行起来岂不就是通货膨胀啊!!!首先就让这显卡贵到姥姥家去了。

2018年1月16日 17:14

| #

| 引用

yaro

说:

每个区块的容量随着时间的增长会越来越大么,不会爆掉么?

2018年1月17日 17:03

| #

| 引用

BitcoinFan

说:

@walker:

1.现在已经冲着200GB去了。如果要完整从头验证一遍,需要把这么多区块链数据全部下载一遍。全节点也支持修剪模式(prune),但就我自己的经验,修剪模式会带来一些不便,比如不能rescan(导入私钥的时候就需要rescan来显示出正确的转账记录和余额)。以后可能有backward syncing,也就是从最近的区块倒着往回同步,而且还要同步UTXO集合(相当于余额数据)。

2.不对。

一百多GB是2009年比特币诞生至今的所有已确认交易。中间有不少孤块/分叉都被丢弃了,还有很多零确认因为被双花/手续费太低等原因也被丢弃了。

每个比特币节点都会连接到附近的节点(不过连接数默认是受限的),一个人广播一笔交易后,会一传十十传百,直到传遍整个网络。

零确认交易是保存在内存池里的,这些交易只是等待着矿工把它打包进链,是不算数的(比如,已有一笔零确认交易,但是矿池在新挖出的区块中,把另一笔与之冲突的“双重支付”交易打包进去了,那么大家都承认区块链里的那个交易有效,零确认交易无效)。

不过,现在大矿池基本垄断了算力,而且都遵守Opt-in RBF的规则,所以一般的零确认交易在几天之内还是不能双花的(也就是“卡着确认不了”),因为RBF现在还不是默认启用,但未来会改成默认启用。

2018年1月19日 16:03

| #

| 引用

BitcoinFan

说:

引用ty的发言:

所有的交易数据都会传送到矿工那里。矿工负责把这些交易写入区块链。

根据比特币协议,一个区块的大小最大是 1MB,而一笔交易大概是500字节左右,因此一个区块最多可以包含2000多笔交易。

相请教第一个块区是怎么来的?没有交易矿工就没办法写入块区,不写入块区就得不到比特币。

实在想不通,求指教。

第一个区块就是创世区块(genesis block),只有一笔“凭空”生成50BTC的coinbase交易(也就是区块补贴),内容算是中本聪随便写的。

就是这个:

https://btc.com/000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f

点开coinbase交易,就可以看到著名的The Times 03/Jan/2009 Chancellor on brink of second bailout for banks了:

https://btc.com/4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b

2018年1月19日 16:07

| #

| 引用

BitcoinFan

说:

引用yaro的发言:

每个区块的容量随着时间的增长会越来越大么,不会爆掉么?

原来是一个区块最大1MB(矿工还可以自己设置更低的上限),但是直到最近这个上限才被填满,然后,矿工优先打包手续费高的交易,手续费不够高的,就在内存池里排队等着。

即使是鼓吹超大区块的Bitcoin Cash,矿工们现在也没敢把这个限制完全拿掉,目前的上限是8MB,前一阵子BCH发生了粉尘攻击(有人发帖说是“压力测试”),可以看到有些矿池甚至还保留着1MB的限制。

去年软分叉SegWit已经激活了,引入了一种新的交易格式(和老格式并存),这种格式把交易数据分成两块,一块是资金往来和数额,另一块是用数字签名证明交易有效的“见证”;对见证部分,计算字节数时要少算四分之三(给了折扣),这样就等于允许区块大小超过1MB。

SegWit格式的交易使用率越高,区块就可以扩到越大。目前SW使用率只有10%。

根据估计,这样扩容最大可以达到2MB左右。(4MB是不可能达到的,因为非见证部分字节数不会是零)

未来BTC应该还会有硬分叉,可能要扩大区块,不过近期是不会有了。

目前还有一些方法能减少交易字节数,比如压缩公钥、batching等。以后还会有Schnorr签名等技术。

2018年1月19日 16:22

| #

| 引用

BitcoinFan

说:

@Alex:

现在比特币的概念还被很多人抵触,多数人还是宁愿相信国家政权,而不是分布式共识。

政府也是,不少都对比特币不友好,像我国不就是这样,只是把比特币定位为合法的虚拟商品,不承认它是货币,而且把交易所都关了,连矿场都要赶出去……

而且比特币-法币“汇率”波动很大,市场投机性很强,这也是个本质上的问题。

比特币还面临着扩容问题,区块大了就趋向于中心化,闪电网络现在还没准备好。

还有,就是比特币不存在账户密码、密码忘记找回、资金冻结这种概念,算是“认密钥不认人”的,丢失被盗都是责任自负的。

比特币早就不能用显卡挖了,连莱特币都不行了,只能用ASIC矿机挖,否则是纯浪费电、耗费显卡寿命。

现在用显卡挖的是其他加密货币,比如以太币(ETH,以太坊Ethereum平台上用的代币,其实人人都可以轻易在以太坊上发行自己的ERC20代币)、门罗币(XMR,Monero)、零币(ZEC,Zcash)等等。

2018年1月19日 16:32

| #

| 引用

BitcoinFan

说:

引用没事扯扯蛋的发言:

谁能说明比特币怎样和实际金钱或实物挂钩的???

如果不能挂钩,比特币就是个数字游戏,没有价值。

如果挂钩了,那说明比特币背后还是有势力(中心)支持的,否则怎么可能风生水起?

这个都是老生常谈的问题了。

有价值的东西未必是“实物”,比如大数据,或者……玩游戏氪金;黄金就是没有人担保背书的,但它仍然有价值。

所以,现在有人想让比特币成为“数字黄金”……

2018年1月19日 16:46

| #

| 引用

nonehat

说:

纠正小错误:每笔交易的大小约为250B左右,也就是说1个区块可以包含 1 * 1024 * 1024 / 250 笔交易,而挖出一个区块约10分钟。所以每秒的交易量: 1*1024*1024 / 600 = 6.9。 也就是人们常说的不超过7笔。

2018年1月19日 22:25

| #

| 引用

lies

说:

假如算力能垄断比特币的交易权,那这个就是集权中心化了,因为假如算力越分散,那么想要垄断的成本就越低,51%对政府来说,想要达到并不难,什么时候政府管不住了,自己这么一折腾,是不是比特币就该没了

2018年1月21日 10:04

| #

| 引用

anor

说:

引用Dong的发言:

一块区块链只能存2000笔交易,2040年就挖不到新的区块链,但交易是继续增加的,那么区块链用完了怎么办呢?

区块链不会用完吧?只是用来奖励的比特币可能就没有了,到那时矿工只能靠手续费获得奖励了。

2018年1月25日 16:37

| #

| 引用

风君子-神游

说:

关于交易,按照文章里面所说,没交易一次是不是相当于生成了一个新的区块,因为会生成一个新的hash,那这个交易所产生的区块,和矿工新挖出来的区块有什么区别,其次,交易是通过矿工去填写数据的,那矿工会不会恶意的去写数据,例如,把新交易的比特币写自己钱包里面

2018年1月26日 14:24

| #

| 引用

ade

说:

引用Mike的发言:

比特币技术复杂、普通人不能很好的理解。比特币没有金融监管、容易产生金融犯罪。前段时间的黑客勒索无不采用比特币技术。所以个人并不看好这一块的技术。

比特币只是一种货币形式,RMB也是一种货币形式,如果敲诈勒索犯罪用RMB,那我们不是??

2018年1月26日 16:46

| #

| 引用

ALLEN

说:

区块链 和 比特币交易大概理解了。 但是作为交易者怎么获利。这一点是不是类似股票说,在比特币网上用现金(真实货币)交易购买虚拟比特币,然后等着升值再出售。

2018年1月29日 16:05

| #

| 引用

wjzsuperman

说:

是不是新增一个区块,就代表新增一个比特币?

2018年1月30日 10:08

| #

| 引用

胡吃喝

说:

引用wjzsuperman的发言:

是不是新增一个区块,就代表新增一个比特币?

最开始,新增一个区块,增加50个比特币,后来新增一个区块,增加25个,再后来就是12.5个

2018年2月 2日 20:32

| #

| 引用

胡吃喝

说:

引用anor的发言:

区块链不会用完吧?只是用来奖励的比特币可能就没有了,到那时矿工只能靠手续费获得奖励了。

区块链用不完,比特币倒是会用完,也就是再也挖不出来了。

2018年2月 2日 20:33

| #

| 引用

郭海峰

说:

原文:目前由于交易数量猛增,手续费已经水涨船高,一个区块2000多笔交易的手续费总额可以达到3~10个比特币。如果你的手续费给低了,很可能过了一个星期,交易还没确认。

请教:如果一个区块的2000比交易中有没有确认的,那这个区块怎么确认呢?不是一个小时就可以确认了吗?另外,如果一笔交易在确认过程中但还没没有支付成功,这些比特币是否可能再次支付给其它方,而因为第二次交易所在的区块被确认导致第二次交易成功,第一次交易失败呢?

2018年2月 3日 21:11

| #

| 引用

夜上

说:

引用Dong的发言:

有个疑问求解答:

一块区块链只能存2000笔交易,2040年就挖不到新的区块链,但交易是继续增加的,那么区块链用完了怎么办呢?

新开区块没有奖励了而已,并不是不开新的

2018年2月 5日 11:47

| #

| 引用

cqcmdwym

说:

你也可以用私钥加密信息,别人用你的公钥解开,从而证明这个信息确实是你发出的

你好,阮老师,这样是不是不安全,人家有公钥就能解开?

2018年2月 7日 07:45

| #

| 引用

airomyas

说:

引用王挺的发言:

我也有此疑问,但感觉这个回答没答到点上。

交易记录是必须要附在新的区块里,再写入主区块链才能生效的。而2040年之后,已经没机会“算出”新的区块了,还怎么附加交易记录呢?

区块永远可以增加,区块链的长度并没有限制。只是矿工取得记账权的时候,系统没有给矿工比特币来奖励了。

2018年2月12日 09:53

| #

| 引用

airomyas

说:

引用cqcmdwym的发言:

你也可以用私钥加密信息,别人用你的公钥解开,从而证明这个信息确实是你发出的

你好,阮老师,这样是不是不安全,人家有公钥就能解开?

这个叫数字签名,目的是为了证明这条用私钥签名的消息的确是你发出的(因为别人没有你的私钥),那么怎么证明呢?就是这条消息能够用你发布的公钥解开,这就说明消息是你发的,因为用别人的公钥不可能揭开你的私钥签名的消息。

这种情况下,不是为了保密,而是为了验证身份。

2018年2月12日 10:28

| #

| 引用

天空

说:

一开始错了,是欧美各大银行以及金融机构的一个需求,最后是一个中本聪的人或者组织造出一个比特比的产品来,本身不是中本聪的想法,它是需求的实现者

2018年2月13日 14:52

| #

| 引用

路人甲

说:

怎么全是小白?

2018年2月14日 01:10

| #

| 引用

老宽

说:

区块链记录着完整的账本,而比特币本质是希望解决去中心化的问题。1M的块大小引起交易堵塞的问题我能理解,通过扩容等技术手段肯定能解决的,只是扩多少的问题了。但是这个只是解决交易速度的问题啊?

但是,将来积累的账本数据肯定越来越多啊,那岂不是意味着每个安装了比特币钱包的客户端软件都得同步这些账本信息呢,比如现在账本数据如果几百G能理解不是问题,但是将来账本数据累积了总会很大啊,这个问题怎么能搞定啊?

2018年2月17日 00:22

| #

| 引用

谦修

说:

引用binary的发言:

"这个钱包不是用来存放比特币,而是存放你的公钥和私钥。软件会帮你生成这两把私钥,然后放在钱包里面。"

应该是生成这两把密钥

可以理解为,一个是银行卡号,一个是密码吗。。前者对应公钥,后者是私钥!

2018年2月23日 15:28

| #

| 引用

纪钟磊

说:

您好,我想问一个问题。就是张三有10个比特币,同时向另外两个他自己的私钥(s1,s2)分别支付10个比特币。把支付给s1的交易让旷工1处理。支付给s2的交易让旷工2处理。恰巧旷工1和旷工2出处理的达到的分支数也都是大于6并且相同的。那不是这个时候张三就把10个比特币分别成功支付给了自己的两个私钥,他本身拥有的10个bitcoin就变成了20个?解答一下我的疑惑吧,谢谢!

2018年2月24日 14:42

| #

| 引用

zcqshine

说:

引用TONYHEAD的发言:

有若干疑问:

一个100GB的数据库就可以记录到比特币创立至今的所有交易往来?

"2000笔交易的区块手续费是3-10个比特币",这个交易成本太高了,2000笔流水,大一点的小卖部都不止这个数,难不成按目前的交易成本, 比特币只适合做大额资金的交易?

比特币的价格现在已经够大额了...哈哈

2018年2月24日 16:30

| #

| 引用

btcoin小白

说:

区块是不是可以是0-2000条交易记录(包含是0条交易记录),我在想比特币诞生时应该是还没有交易的吧,这个时候区块里面应该是没有交易记录的吧?

2018年2月26日 23:22

| #

| 引用

xmokdjs

说:

引用温国兵的发言:

纠正一个错误

“你可能看出来了,每 4 年奖励减半,那么到了 2140 年,矿工将得不到任何奖励,比特币的数量也将停止增加。这时,矿工的收益就完全依靠交易手续费了。”

这里应该是 2040 年。

一尺之棰,日取其半,万世不竭。——《庄子·天下》

2018年2月27日 11:50

| #

| 引用

戴祎程

说:

我想问一下阮老师,如果矿工没有收集全交易记录,或者故意写错了交易记录,从而生成了最新的区块,后续的矿工怎么发现他记录的有问题?

2018年2月28日 16:42

| #

| 引用

DannyPei

说:

我想问个问题,矿工们从网络上收集各种交易请求,组包并计算hash,当计算出的hash不满足要求时,是会更换或重新收集网络上的各种交易请求然后重新打包计算hash,直到所计算出的hash满足要求吗?(因为如果不更换组包的交易内容的话,计算出的hash还是会和原来的一样)这样的话作为一个交易请求的提出方,所提出的交易请求能否被认可、何时被认可都是完全未知的,这样将难以满足货币日常流通的基本需求。不知道是否是这样,求阮老师和各位老师解答。

2018年3月 1日 15:22

| #

| 引用

DannyPei

说:

引用纪钟磊的发言:

您好,我想问一个问题。就是张三有10个比特币,同时向另外两个他自己的私钥(s1,s2)分别支付10个比特币。把支付给s1的交易让旷工1处理。支付给s2的交易让旷工2处理。恰巧旷工1和旷工2出处理的达到的分支数也都是大于6并且相同的。那不是这个时候张三就把10个比特币分别成功支付给了自己的两个私钥,他本身拥有的10个bitcoin就变成了20个?解答一下我的疑惑吧,谢谢!

不会,矿工1和矿工2同时计算出符合要求区块链,并且两个分支又同时达到6个链的长度,这是不可能发生的

2018年3月 1日 15:23

| #

| 引用

alex

说:

有个地方没明白。

假如说矿工A抢到了这块区块。然后广播出去。大家承认了以后。这块区块的HASH值就定了。

然后再在这块区块中输入"A挖到了这块区块 获得12.5个比特币"。那这个输入信息不是会导致这块区块的HASH值变了么?

2018年3月 2日 17:13

| #

| 引用

Aspi1in

说:

“事实上,我也不知道,如果我知道怎么发财,可能就不会在这里写博客了。”

扎心了老铁~

2018年3月 2日 19:17

| #

| 引用

gelvshige

说:

引用Aspi1in的发言:

“事实上,我也不知道,如果我知道怎么发财,可能就不会在这里写博客了。”

扎心了老铁~

坦白的很可爱!

2018年3月 2日 19:22

| #

| 引用

peakandyuri

说:

我其实有一个疑问,比特币是没有中心节点的,如果我要加入矿工的行列,我怎么才能知道其它节点并和它们交换数据。

2018年3月 5日 14:31

| #

| 引用

xuewuchen

说:

其实我觉得这里最大的问题就是,所有的资源都浪费在无意义的计算上面了。如果这些算力真的可以一起计算,是不是能够解决很多计算上面的难题呢

2018年3月 7日 09:14

| #

| 引用

zbw

说:

引用没事扯扯蛋的发言:

谁能说明比特币怎样和实际金钱或实物挂钩的???

如果不能挂钩,比特币就是个数字游戏,没有价值。

如果挂钩了,那说明比特币背后还是有势力(中心)支持的,否则怎么可能风生水起?

你可以把它当做一件物品,一个东西,这个东西只要有人愿意花钱去买,那就能与真实货币挂钩

2018年3月 9日 15:01

| #

| 引用

csha

说:

引用zyg的发言:

传说的去中心化呢~到头来还是矿工中心化~ 算力决定一切 哈哈~

你把去中心化这个概念理解错了

2018年3月13日 19:05

| #

| 引用

中本葱

说:

引用王挺的发言:

我也有此疑问,但感觉这个回答没答到点上。

交易记录是必须要附在新的区块里,再写入主区块链才能生效的。而2040年之后,已经没机会“算出”新的区块了,还怎么附加交易记录呢?

有区块啊,只是这些区块不会新生成比特币而已

2018年3月18日 11:27

| #

| 引用

沈小扬

说:

请教,矿工记录交易记录生成新的区块,从而得到奖励的比特币。这个奖励本身的交易又是谁来记录呐?有没有区块链来保存?

2018年3月19日 13:10

| #

| 引用

Satan

说:

160位是二进制,写成十六进制,大约是26到35个字符

这个是怎么算的?

2018年3月19日 13:13

| #

| 引用

Bicong Wang

说:

引用杨峰的发言:

很好奇,比特币是怎么开始的?有这个想法是因为,采矿是产生比特币的“造血系统”,而造血的过程是写入交易记录,而最初是没有交易记录给人来写的。

阮老师没有细讲挖矿,实际上挖矿的要求是造出一个哈希值小于xx的区块,这个跟交易是否存在没有必然关系。而随着区块的产生,比特币会被制造出来。

2018年3月19日 19:04

| #

| 引用

ieayoio

说:

引用小米的发言:

有一个地方不明白,需要请教博主。

如果我是矿工,挖矿时在当前交易记录中擅自增加一条“我获得1000比特币”的记录,然后很幸运这块矿被我挖到,交易记录被记录和通报全网了。

那是不是就能作弊了?

不知道你的问题解决了没,我觉得“我获得1000比特币”的这条记录不能凭空的产生,它必须是“xxx向你转账了1000比特币”才能达到你获得比特币的目的,而这个动作需要有向你转账的人的数字签名作为凭证

2018年3月20日 17:31

| #

| 引用

ieayoio

说:

所谓交易手续费,就是矿工可以从每笔交易抽成,具体的金额由支付方自愿决定。你完全可以一毛不拔,一分钱也不给矿工,但是那样的话,你的交易就会没人处理,迟迟无法写入区块链,得到确认。矿工们总是优先处理手续费最高的交易。

这里我有个疑问,是不是说等到矿工挖到新的区块没有奖励的时候,如果支付不付手续费,是不是说有可能交易永远无法写入区块链,这岂不是有钱花不出去了吗,所以只能追加手续费来完成交易吧?而且手续费少了也很有可能迟迟完成不了交易

2018年3月20日 17:40

| #

| 引用

悟空

说:

现在比特币的区块有多高了啊?

2018年4月 2日 21:05

| #

| 引用

mall

说:

有几点疑问:

1 公钥和私钥都是软件生成的,如何保证软件平台不会私自保存用户的私钥?

2 区块链本身的机制只承认最长新增链(block),那么最终会对导致每个block都只包含最简单的信息(空block或者只包含一笔交易的block),因为你等到2000笔交易凑齐的时候再开始打包计算,可能别人已经算出来的了。这样推演下去最终区块链里每个块只会包含一笔交易,1M的大小根本就用不完。为什么还会出现提议将block size增加 ?

望哪位大侠能指教一下?谢谢

2018年4月 9日 08:57

| #

| 引用

崔文远

说:

私钥的保存用什么方式最安全?

2018年4月11日 20:34

| #

| 引用

帅锅

说:

越看越带劲,真的十分感谢作者这么辛苦写的文章呀!已经能理解很多很多了,感激

2018年4月19日 16:10

| #

| 引用

shilion

说:

引用Satan的发言:

160位是二进制,写成十六进制,大约是26到35个字符

这个是怎么算的?

这个是十六进制和2进制的转换了。就像我们的十进制,冯10进1,十六进制是冯16进1,有0-9,A-F组成。

2018年4月19日 22:17

| #

| 引用

没有

说:

引用Mike的发言:

比特币技术复杂、普通人不能很好的理解。比特币没有金融监管、容易产生金融犯罪。前段时间的黑客勒索无不采用比特币技术。所以个人并不看好这一块的技术。

你不看好的原因我却感觉是比特币火的真正原因,不接受黑暗并不代表黑暗不存在

2018年4月28日 17:52

| #

| 引用

chen

说:

想请问一下:

比特币第一个区块Block #0是相当于初始化创建的,记录的交易一个新闻报纸的标题。

产生50个比特币的奖励(这50个比特币好像不能被使用)。

那第二个区块Block #1它的交易记录是什么呢(是否是用比特币交易呢)?

这些交易的手续费所需的比特币从何处来呢?

2018年5月 2日 18:11

| #

| 引用

梦元

说:

“我获得1000比特币”的这条记录不能凭空的产生,btc不会凭空产生,它产生的唯一渠道是旷工算出合规hash值后获得的奖励,而且会有专门的标识记录这笔btc的产生,以及它产生的条件。首先“我获得1000比特币”这条记录不会添加进去,因为这条记录不合规范至少是“xxx转给xx多少btc”或者是“xx算出了新的合规hash获得XX个btc的奖励”,其次即使你想办法强行添到了数据库,请求同步数据时,其它节点也会算出你这笔凭空产生的记录是非法,拒绝同步你的数据。

每一笔交易都必须具备 (from, to, value,fee ) ,而且每一笔交易应该都会有from方进行数字签名,避免旷工把转账给to方的5个btc改成了10个

2018年5月 3日 18:46

| #

| 引用

晨晨

说:

我就想知道怎么开户 交易

2018年5月11日 22:53

| #

| 引用

虾米

说:

虽然在币圈工作几年了,但是每次需要给小白讲解btc的时候都不知从何讲起。

以后我可以让他们来看峰哥的文章。

2018年5月17日 18:45

| #

| 引用

虾米

说:

引用梦元的发言:

“我获得1000比特币”的这条记录不能凭空的产生,btc不会凭空产生,它产生的唯一渠道是旷工算出合规hash值后获得的奖励,而且会有专门的标识记录这笔btc的产生,以及它产生的条件。首先“我获得1000比特币”这条记录不会添加进去,因为这条记录不合规范至少是“xxx转给xx多少btc”或者是“xx算出了新的合规hash获得XX个btc的奖励”,其次即使你想办法强行添到了数据库,请求同步数据时,其它节点也会算出你这笔凭空产生的记录是非法,拒绝同步你的数据。

每一笔交易都必须具备 (from, to, value,fee ) ,而且每一笔交易应该都会有from方进行数字签名,避免旷工把转账给to方的5个btc改成了10个

峰哥应该是想表达对 btc 的价值思考

2018年5月17日 18:47

| #

| 引用

浅蓝

说:

引用小白的发言:

有点疑惑,交易平台肯定需要维护 哪个比特币钱包是哪个用户的吧,而比特币钱包里包含公钥私钥,这样交易平台不就可以知道比特币是哪个用户的么

只需管理用户对应的钱包地址就行,不需要知道具体的公钥私钥,就好比支付宝管理用户的账号,但是不知道你的密码也能使交易正常完成

2018年5月18日 13:07

| #

| 引用

卫道者

说:

引用Mike的发言:

比特币技术复杂、普通人不能很好的理解。比特币没有金融监管、容易产生金融犯罪。前段时间的黑客勒索无不采用比特币技术。所以个人并不看好这一块的技术。

比特币勒索与比特币无关,只是通过比特币来收钱。

2018年7月13日 13:54

| #

| 引用

Tiger.xu

说:

每个节点都包含了整个区块链(目前大概 100多 GB),并且节点之间时刻不停地在同步信息。------目前100多GB,后面随着时间推移,这个区块链是否会非常之大。而且100多GB的数据在这么多节点中复制,会不会造成网络堵塞?

2018年7月15日 19:22

| #

| 引用

haiker

说:

为什么交易数据要包含双方的地址呢,既然交易数据中已经包含了公钥,而交易的支付方地址就是公钥计算hash得到,只提供公钥,私钥签名和接受方的地址和上次交易的hash不行吗?

2018年10月 7日 10:43

| #

| 引用

张淼

说:

嗯 讲的很清楚

2018年12月21日 11:31

| #

| 引用

风一样的男子

说:

老师,您好,我正在探究比特币的源码,现在有一块没弄清楚,就是同步机制.我想知道比特币的同步时机除了节点启动时,还有其他时机吗?特别时在处理孤块上,加入第k个区块在广播给A节点时丢了,那么对于A节点是采取怎样的措施来获得这个区块的呢?希望老师不吝赐教

2018年12月31日 12:08

| #

| 引用

哈哈

说:

很不错呢,通俗易懂。

2019年4月 9日 20:07

| #

| 引用

代富贵

说:

突然发现一个问题,有人(以为为例)炒币好几年了,说啥币都多少听说过,但是突然被问到到底什么是区块链,什么是加密货币的时候,还是一脸蒙。

2019年5月27日 17:02

| #

| 引用

柚子

说:

引用温国兵的发言:

纠正一个错误

“你可能看出来了,每 4 年奖励减半,那么到了 2140 年,矿工将得不到任何奖励,比特币的数量也将停止增加。这时,矿工的收益就完全依靠交易手续费了。”

这里应该是 2040 年。

每四年减半,要乘以4兄弟,就是2140年咯

2019年6月 1日 12:57

| #

| 引用

BitcoinFan

说:

引用haiker的发言:

为什么交易数据要包含双方的地址呢,既然交易数据中已经包含了公钥,而交易的支付方地址就是公钥计算hash得到,只提供公钥,私钥签名和接受方的地址和上次交易的hash不行吗?

交易数据其实压根就没有包含“地址”。地址只在应用层(钱包软件)里存在,在底层(区块链数据里)并不存在。

交易数据包含的是“输入”和“输出”。

每一项“输出”都含有金额和“锁定脚本”。就好像开宝箱一样,你必须有密码,或者钥匙(取决于这个宝箱最初是怎么制作的)才能打开,打开后想干啥就全部由你做主了。

一般情况下,锁定脚本的内容基本上就是公钥的哈希,外加一点点脚本操作码,

地址只是把公钥的哈希加上校验码,再用Base58编码了一下而已。加上校验码可以防止打错字,用Base58编码可以方便人类阅读。

每一项“输入”都要声明被“解锁”的是具体哪一笔钱,用上一笔交易的哈希(txid)和输出序号指定。同时还要拿出“解锁脚本”,一般就是公钥、数字签名,以及一点点脚本操作码。

2019年9月 6日 22:18

| #

| 引用

BitcoinFan

说:

引用haiker的发言:

为什么交易数据要包含双方的地址呢,既然交易数据中已经包含了公钥,而交易的支付方地址就是公钥计算hash得到,只提供公钥,私钥签名和接受方的地址和上次交易的hash不行吗?

更正一下,地址里不止包含公钥哈希和校验码,还有一个版本号。

实际上这还只是最简单的P2PKH地址,除此之外还有3开头的P2SH地址(含有脚本哈希而不是公钥哈希),以及bc1开头的P2WPKH、P2WSH地址(原生隔离见证地址,功能和P2PKH和P2SH类似)。

P2SH地址可以设置更复杂的脚本,也就是设定更复杂细致的解锁条件。一般它用于多重签名。除了多重签名,还可以“封装”隔离见证脚本,因为bc1开头的原生隔离见证地址很多地方还不兼容,封装成3开头的地址,就能保持兼容了(代价是交易略大,手续费略贵)。

对bc1开头的原生隔离见证地址来说,编码不再使用中本聪设计的Base58,而是使用重新设计的Bech32,只包含小写字母,但也可以全部转换成大写字母来表示(这样可以让二维码更小更“轻便”)。这样更方便在电话中口述这种用途。

2019年9月 6日 22:27

| #

| 引用

BitcoinFan

说:

引用haiker的发言:

为什么交易数据要包含双方的地址呢,既然交易数据中已经包含了公钥,而交易的支付方地址就是公钥计算hash得到,只提供公钥,私钥签名和接受方的地址和上次交易的hash不行吗?

比特币很多时候都是反直觉的……就比如“3开头的P2SH地址可以封装隔离见证”,可能会让很多人产生一种误解:“3开头的地址和bc1开头的地址往往使用同一个公钥”——实际上很多时候并不是这样,因为一般HD钱包都遵守BIP44/49/84规范,生成不同类型的地址时,使用的私钥也不一样;只有少数钱包,比如Bitcoin Core,在一些特殊情况下(老版本的addwitnessaddress,以及importprivkey/importpubkey导入单个私钥/公钥)是这么做的。

2019年9月 6日 22:32

| #

| 引用

BitcoinFan

说:

引用Tiger.xu的发言:

每个节点都包含了整个区块链(目前大概 100多 GB),并且节点之间时刻不停地在同步信息。------目前100多GB,后面随着时间推移,这个区块链是否会非常之大。而且100多GB的数据在这么多节点中复制,会不会造成网络堵塞?

确实是越攒越大的……有些比特币开发者反对增大区块,就是出于“历史区块增长的速度已经超过技术进步速度”这种理由。

网络堵塞,现在看还不至于,因为跑全节点的比特币用户算是少数(很多人只是在交易所里炒一炒,或者就只是用一下轻量级钱包而不是全节点钱包),而且只有一开始要下载那么多,后面只需要不断跟进就可以了,并不需要一遍遍地从头下载。

2019年9月 6日 22:36

| #

| 引用

BitcoinFan

说:

引用alex的发言:

有个地方没明白。

假如说矿工A抢到了这块区块。然后广播出去。大家承认了以后。这块区块的HASH值就定了。

然后再在这块区块中输入"A挖到了这块区块 获得12.5个比特币"。那这个输入信息不是会导致这块区块的HASH值变了么?

实际上当然是先把区块里的各种数据填好、把交易都打包进去,再发给矿机、让矿机去暴力试错凑hash值啊。矿机只需要拿到区块头、coinbase交易等很少的信息就可以进行挖矿了,并不需要拿到完整的区块。

2019年9月 6日 22:42

| #

| 引用

BitcoinFan

说:

引用老宽的发言:

区块链记录着完整的账本,而比特币本质是希望解决去中心化的问题。1M的块大小引起交易堵塞的问题我能理解,通过扩容等技术手段肯定能解决的,只是扩多少的问题了。但是这个只是解决交易速度的问题啊?

但是,将来积累的账本数据肯定越来越多啊,那岂不是意味着每个安装了比特币钱包的客户端软件都得同步这些账本信息呢,比如现在账本数据如果几百G能理解不是问题,但是将来账本数据累积了总会很大啊,这个问题怎么能搞定啊?

交易确认速度这个问题争议比较大。主流认可的办法是开发闪电网络,放弃原有的零确认交易。少数派的办法是用avalanche预共识加固零确认。还有侧链,以前经常提,现在已经有了liquid、rsk这些,却很冷清,几乎没人用。而且也有adam back等大佬认为侧链并不能从根本上解决扩容问题。

区块越攒越多的问题,也有争议。

有人坚持全节点必须把所有区块都下载验证一遍(启用修剪,也只是一边下载新的一边删旧的,并不是不下载旧的),有人就认为这么做太浪费,可以妥协一下,直接从最近的状态开始,跳过历史(也就是utxo commitment、assumeutxo之类的)。

以前对这个问题还提出一个解决方法,就是“欺诈证明”,也就是让轻量级客户端随机挑一部分进行验证,“众目睽睽”之下,总能发现猫腻。但是后来这个基本上是弃坑了,理由是如果有恶意矿工挖违反规则的链,那他完全可以把有猫腻的部分藏着不发出来,轻量级客户端拿它没办法,没办法证明这里缺了一块(而不只是网速卡了)。

引用DannyPei的发言:

我想问个问题,矿工们从网络上收集各种交易请求,组包并计算hash,当计算出的hash不满足要求时,是会更换或重新收集网络上的各种交易请求然后重新打包计算hash,直到所计算出的hash满足要求吗?(因为如果不更换组包的交易内容的话,计算出的hash还是会和原来的一样)这样的话作为一个交易请求的提出方,所提出的交易请求能否被认可、何时被认可都是完全未知的,这样将难以满足货币日常流通的基本需求。不知道是否是这样,求阮老师和各位老师解答。

区块头里有个nonce值,矿机一般是先修改nonce值。nonce值用完了,还可以稍微改一下时间戳,让时间戳前后稍微变动一下。除了时间戳,还有coinbase交易,可以用作extranonce,这里面的空间就大了,但是每次修改extranonce的计算成本都比较大,所以这一般是放到最后尝试。

还有像asicboost这样有争议的办法,(分显式和隐式两种,隐式asicboost里面有提到交换交易顺序,是多种办法中的一种),显式asicboost是修改nversion,争议相对较小。

2019年9月 6日 22:55

| #

| 引用

李晓铭

说:

请问博主,矿工们如何收集交易请求啊?我有一个交易,如何发给矿工呢?这个过程,需要一个中心转发吗?矿工们之间如何联系呢?

就像bt技术一样,最终离不开一个中心来发布种子和登记提供bt服务的ip地址,比特币和区块链能完全脱离一个中心吗?

2019年12月18日 17:38

| #

| 引用

BitcoinFan

说:

引用李晓铭的发言:

请问博主,矿工们如何收集交易请求啊?我有一个交易,如何发给矿工呢?这个过程,需要一个中心转发吗?矿工们之间如何联系呢?

就像bt技术一样,最终离不开一个中心来发布种子和登记提供bt服务的ip地址,比特币和区块链能完全脱离一个中心吗?

比特币有一套P2P协议啊,简单说就是一传十、十传百。

BT不也是有完全去中心化的DHT么,DHT是不需要Tracker服务器的。

不过,比特币的节点软件里确实有硬编码写进几个“种子节点”,一开始不知道其他节点的IP时,就可以向这些“种子节点”查询(这个查询用的是DNS协议,所以叫DNS seeding)。如果从其他途径来发现其他节点,比如手动添加、从已经连接上的其他节点查询等等,那DNS seeding就不是必要的。

这个话题细说的话就不简单了。

比如“节点”具体指什么呢?要是去阅读中本聪最初的介绍和发言,就会发现他默认“矿工即节点、节点即矿工”。

现在的话,“节点”(负责验证交易)和“矿工”(负责穷举哈希来“挖矿”)已经自然而然地分离了。

矿工自己并不会运行节点,他们会把矿机的算力输出给矿池,让矿池的“节点”(或者说是“全节点”full node)负责产生区块。

很多“全节点”背后也是没有算力的,只能监视网络,不能出块。

现在的比特币核心开发者大多认为用户需要跑全节点,因为全节点可以独立、完整地验证区块链账本的内容。

如果是SPV轻量级钱包的话,因为没有对交易内容进行验证,所以,理论上,即便是矿工打破了比特币的规则,比如凭空造100万币,那SPV也是无法识别的。

但是,全节点很笨重,很显然并不适合一般用户;而且有人认为“按照中本聪原本的设计,就不需要普通用户去跑全节点”,比特币的社区可以说也因为这个分歧而分裂了,反对“普通人应该跑全节点”的人很多转而去支持BCH(然后BCH又分裂成ABC和SV两个币……)。

比特币核心开发者则会指出中本聪很早以前就消失了,在他消失之前,他也并没有把SPV轻量级钱包设计完善,因为缺失了“警报机制”来提醒SPV不要去跟随违反规则的区块链账本。

2020年1月 4日 02:06

| #

| 引用

BitcoinFan

说:

还有,矿池之间可能未必是走比特币自身的P2P网络,他们可能还会走更快的FIBRE、Falcon等更加中心化、但也更快的网络,这样可以避免自己因为网络通信不畅(没有及时收到最新区块,或者没有及时把自己新挖出的区块广播出去)而挖出废块。

2020年1月 4日 02:11

| #

| 引用

JAK

说:

用核心钱包交易是不是每次交易都会生成一个新的地址,且钱包内所有的比特币都会转移到新的钱包内,接收了比特币是不是也是一样,所有的比特币包括不是交易所得的比特币都会自动到一个新的找零地址里去?

2020年3月31日 12:15

| #

| 引用

BCG

说:

引用温国兵的发言:

纠正一个错误

“你可能看出来了,每 4 年奖励减半,那么到了 2140 年,矿工将得不到任何奖励,比特币的数量也将停止增加。这时,矿工的收益就完全依靠交易手续费了。”

这里应该是 2040 年。

就是2140年,不是2040.

2020年4月30日 12:07

| #

| 引用

BitcoinFan

说:

引用JAK的发言:

用核心钱包交易是不是每次交易都会生成一个新的地址,且钱包内所有的比特币都会转移到新的钱包内,接收了比特币是不是也是一样,所有的比特币包括不是交易所得的比特币都会自动到一个新的找零地址里去?

避免重复使用同一个地址,这个是中本聪的白皮书里提到的。这是一种很鸡肋的、聊胜于无的隐私保护措施。

每次收款时都用新的收款地址,结合每次转出时都用新的找零地址,双管齐下,理想情况下就分不清哪个地址是回到原主人手里的找零,然后就无法进一步追查资金去向,从而保护隐私。

实际上有不少情况会泄露“哪个地址是找零”这个信息;甚至还有不少轻量级钱包是直接上传xpub主公钥的,钱包服务商直接就知道哪些地址背后是同一个主人了。

(而且Bitcoin Core虽然是HD钱包,但是用的是很蛋疼的hardened derivation,压根就没有xpub主公钥——这个情况可能在未来版本会有所改革,开发者现在正在做descriptor wallet)

每次转出,并不是会把所有币都转移到新的找零地址上。这要看你转出的金额大不大,以及你的钱包如何“选币”,选择花掉哪些UTXO。一般情况下钱包是只选择差不多够用的UTXO(所以这也会造成交易里的找零输出项金额较小,可以被猜测分辨出来;但是如果选了太多UTXO,也要注意,把不同地址上的币同时花出去本身也是隐私信息泄露,因为这样透露了这些地址背后实际上是属于同一个主人)。

2020年10月 2日 01:56

| #

| 引用

undefined

说:

挖到新区块的矿工可以获得比特币奖励,奖励的数量逐年递减,这个机制可以修改吗?谁来决定呢

2022年4月15日 11:56

| #

| 引用

sutungpo

说:

请教下在第三部分交易流程中:

转出比特币的一方提供的数据中的数字签名是不是也保证了交易金额的属实?否则交易的金额在申报提交过程中存在被篡改的可能性?

2022年8月15日 14:54

| #

| 引用

我在2023看世界

说:

2023年再看这篇文章,确实受益匪浅

2023年5月12日 21:43

| #

| 引用

我要发表看法

您的留言

(HTML标签部分可用)

您的大名:

«-必填

电子邮件:

«-必填,不公开

个人网址:

«-我信任你,不会填写广告链接

记住个人信息?

正在发表您的评论,请稍候

«- 点击按钮

Weibo |

Twitter |

GitHub

Email: [email protected]

Buy/Sell Bitcoin, Ether and Altcoins | Cryptocurrency Exchange | Binance

Buy/Sell Bitcoin, Ether and Altcoins | Cryptocurrency Exchange | Binance

Error 403 Forbidden - This request is blocked.

For security reasons you can't connect to the server for this app or website at this time.

It maybe that you have too many requests or the illegal request payload is identified as an attack.

Please try again later.

Buy/Sell Bitcoin, Ether and Altcoins | Cryptocurrency Exchange | Binance

Buy/Sell Bitcoin, Ether and Altcoins | Cryptocurrency Exchange | Binance

Error 403 Forbidden - This request is blocked.

For security reasons you can't connect to the server for this app or website at this time.

It maybe that you have too many requests or the illegal request payload is identified as an attack.

Please try again later.

版权声明:本文由imtoken波宝钱包下载发布,如需转载请注明出处。

本文链接:https://www.siyuewuyu.com/article/332.html