BTC-实现
BTC-实现
Transaction-based ledger(比特币是基于交易的账本模式)
- Account-based ledger(以太坊是基于账户的账本模式)
UTXO Unspent Transaction Output(还未交易的输出)
比特币系统的全节点要维护一个叫UTXO(unspent transaction output)(还没有被花出去的交易的输出)的数据结构。例如:A转给B五个BTC,转给C3个BTC,B将5个BTC花掉,则该交易记录不保存在UTXO中,C没有花掉,则该交易记录保存在UTXO中
UTXO的作用
UTXO集合中每个元素要给出产生这个输出的交易的哈希值,以及其在交易中是第几个输出。通过这两个信息,就可以定位到UTXO的输出。
为了检测double spending。判断一个交易是否合法,要查一下想要花掉的BTC是否在该集合中,只有在集合中才是合法的。如果想要花掉的BTC不在UTXO中,那么说明这个BTC要么根本不存在,要么已经被花过。所以,全节点需要在内存中维护一个UTXO,从而便于快速检测double spending(双花攻击)。
每个交易会消耗输出,但也会产生新的输出。例如:A转给B5个BTC,之后B将其转给D,则UTXO中会删掉A->B这一交易记录,同时会添加B->D这一交易记录。
(总输入=总输出)total inputs = total outputs
每个交易可以有多个输入,也可以有多个输出,所有输入金额之和要等于输出金额之和。因此一个交易可能来自多个地址,可能有多个签名
存在部分交易total inputs>total outputs的情况
比特币系统设计了第二个激励机制:交易费(transaction fee)。矿工将信息放入区块中,会获得交易费
挖矿时只改随机数不够,还可以更改根哈希值。
比特币是基于交易的模式,与之对应,还有一种基于账户的模式(如:以太坊)。基于账户的模式要求,系统中显示记录账户余额。也就是说,可以直接查询当前账户余额是多少货币。可以看到,比特币这种模式,隐私性较好,但其也付出一定代价。在进行交易时,因为没有账户这一概念,无法知道账户剩余多少BTC,所以必须说明币的来源(防止双花攻击)。而基于账户的模式,则天然地避免了这种缺陷,转账交易就是对一个(多个)账户余额的数字减和另一个(多个)账户余额的数字加
比特币的发行总量及计算公式
Geometric serices
21wx50x(1+1/2+1/4+....)=21wx50x1/(1-1/2)=2100w
比特币系统设计的平均出块时间是10分钟,就是整个系统平均10分钟会产生一个新的区块,因比特币数量的上限以及人为的提高寻找区块链的难度,导致新区块的产生仅仅依靠nonce(随机数)很难维持出块奖时间的稳定,因此加入了coinbase的随机, 只有铸币交易没有输入,它有一个coinbase,可以写入任何的内容。因此通过改变这其中的内容来改变最后的哈希值。所以真正挖矿的时候只有两层循环,外层循环调整coinbase域的extra nonce。算出block header里的根哈希值之后,内层循环再调整header里的nonce。
- 每次求解nonce 是Bernoulli trial :a random experiment with binary outcome
- 比特币系统中验证交易的合法性,就是把input scripts和output script配对后执行来完成的。注意:不是把图中的input scripts和output scripts配对,因为这两个脚本是一个交易中的脚本。不是把同一个交易里的输入脚本和输出脚本配对,而是把这里的输入脚本和前面提供币来源的交易的输出脚本配对。如果输入输出脚本拼接在一起,能顺利执行不出现错误,那么该交易就是合法的。
- 挖矿过程每次尝试一个nonce可以看作是一个Bernoulli trial(伯努利实验)。每一个随机的伯努利实验就构成了一个伯努利过程。它的一个性质是:无记忆性
- 在区块链中,nonce(number only used once)是一个在工作量证明算法中中的变量,用于调整矿工进行哈希运算的输入,以满足特定的难题要求。nonce是一个32位的整数,矿工会将该数字与区块中的其他信息一起通过哈希函数进行哈希运算。矿工可以不断尝试不同的nonce值,指到找到一个满足特定条件的哈希值,即满足H(nonce|block header)<=target
- 指数分布也是无记忆性的。因为概率分布曲线的特点是:随便从一个地方截断,剩下一部分曲线跟原来是一样的。比如:已经等十分钟了,还没有人找到合法的区块,仍然参考概率密度函数分布 ,平均仍然要等十分钟。Prisson process(泊松过程)将来还要挖多长时间,跟过去已经挖了多长时间是没有关系的。这个过程也叫:progress free
BTC系统中具体的区块信息
比特币系统安全性分析(Bitcoin is secured by mining)
大多数算力掌握在好的用户手中,能否保障不良交易记录不会被写入区块链?
需要注意的是,算力低的用户并非完全不能获得记账权,仅仅是概率上较低的问题。但实际上,即使拥有少量算力的恶意节点,也有一定概率获得某个区块的记账权。
可否"偷币"?(恶意节点能不能将其他账户上比特币转给自己?)
答案:不能。因为转账交易需要签名,恶意节点无法伪造他人签名。假如其获得记账权并硬往区块中写入该交易,大多数用户会认为其是一个非法区块,大多数算力将不认可该区块,从而沿着其他路径挖矿,随着时间推移,拥有大多数算力的诚实的节点将会仍然沿着原来区块挖矿,从而形成一条“最长合法链”,该区块变成孤儿区块。对于攻击者来说,不仅不能偷到其他人的比特币,而且得不到出块奖励,还浪费了挖矿花费的电费等成本。
可否将已经花过的币再花一遍?
如下图1,若M已经将钱转给B,现在想再转给自己,假设其获得记账权,若按照图1方式,很明显为一个非法区块,不会被其他节点承认。
所以,M只能选择图2方式,将M转账给B的记录回滚掉。这样就有了两条等长合法链,取决于哪一个会胜出。(如果上面交易产生不可逆的外部效果,下面交易回滚便又拿回钱,从而不当获益)
注意
:区块插在哪个位置,在刚挖矿时就是要决定的,因为设置的block header里要填上前一个block header的哈希。所以他想插到那个区块的话,一开始就要认定,而不是等获得记账权以后再认定。irrevocable ledger(不可撤销的记账)
如何防范这种攻击?
如果再M->B这个交易之后还延续有几个区块,如下图所示,则大多数诚实节点不会承认下面的链。所以,便变成了恶意节点挖下面的链,其他节点挖上面的链的算力比拼。由于区块链中大多数节点为善意节点,则最终上面链会胜出,而恶意节点的链会不被认可,从而导致投入成本白费。
- 能不能把已经花了的币再花一遍(即double spending)
假如他把M→A的交易写在了一个区块里面,现在他获得了记账权,他又发布另一个交易,把这个钱转回给自己,即M→M'。同样,这很明显是double spending,只要是诚实的节点都不会接受这个区块。
注意
:区块插在哪个位置,在刚挖矿时就是要决定的,因为设置的block header里要填上前一个block header的哈希。所以他想插到那个区块的话,一开始就要认定,而不是等获得记账权以后再认定。irrevocable ledger(不可撤销的记账)
所以,一种简单防范便是多等几个确认区块。比特币协议中,缺省需要等6个确认区块,因此才认为该记录是不可篡改的。平均出块时间10min,6个确认区块需要1小时,可见等待时间还是相对较长的。
是否故意不包含合法交易?
可以,但是可以等待后续区块包含,所以并没有太大影响,可能由于某段时间实际交易数太多,而一个区块包含交易数存在最大值,导致某些合法交易未被写入区块链(等待后续区块的写入)。
selfish mining
M→M'的交易所在的区块所在的链条虽然短,但是先偷偷的生成比上面更多的区块,然后等上面的链条公布后再公布,就能够胜过上面的几个区块了
- 目的一:selfish mining是分叉攻击(fork attack)的一种手段。但这样成功的概率并不大,因为有恶意的节点本来算力占比就不高,还要生成更多的区块,就非常困难
- 目的二:假如A挖了两个区块都没有发布,而在B挖到一个区块公布后立马公布,这样B挖的区块就作废了。好处是减少竞争,因为A在挖第二个区块时,别人还在挖第一个区块(前提是A算力足够强)。
- 坏处是假如A挖出一个区块,A以为他能赶在别人前再挖一个区块,结果这时有人挖出了第一个区块,那这样的话A就要在别人发布之后立马发布,去争取区块奖励
BTC-实现的更多相关文章
- 区块链基础认识-BTC
1.什么是区块链 a.定义: 从本质上来说区块链就是一种通过将用户的某种特定信息(比如交易信息),通过很多台计算机记录保存并同步的过程,每个区块都记录了对应的交易信息,将这些交易信息串联起来就形成了所 ...
- js 校验 btc eth 地址
NPM 安装 npm install wallet-address-validator Browser <script src="wallet-address-validator.mi ...
- ECC椭圆曲线以及计算出公钥的过程(BTC为例)
ECC概念 全称 “ Ellipse Curve Cryptography ” means “ 椭圆 曲线 密码学 ”. 传统加密方法大多基于大质数因子分解困难性来实现,ECC则是通过椭圆曲线方程式 ...
- [转]BTC RPC API GetTransaction
本文转自: GetTransaction GetTransaction gettransaction调用获取指定钱包内交易的详细信息.该调用需要节点 启用钱包功能. 参数 TXID:要查看详情的交易I ...
- [转]BTC手续费计算,如何设置手续费
本文转自:https://blog.csdn.net/servletcome/article/details/81941334 首先BTC的交易手续费和交易金额是没有关系的.不要误认为交易的金额越大手 ...
- 挖矿程序的工作原理(BTC为例)
Mining时代进化:CPU挖矿 -> GPU挖矿 -> FPGA挖矿 -> ASIC挖矿CPU挖矿时代:SENGENERATEGPU挖矿时代:GETWORK Miner:挖矿的程序 ...
- 区块链区块的生成和链接,比特币btc的产生,UTXO的生成和消耗,比特币系统
区块链区块的生成和链接,比特币btc的产生,UTXO的生成和消耗,比特币系统 区块链区块的生成和链接,比特币btc的产生,UTXO的生成和消耗,比特币系统
- BTC和BCH 区别和联系?
在比特币刚刚出现的时期,中本聪对区块的大小限制在1M.这种限制既保障性能较弱的个人电脑能够参与其中,同时也起到了防止攻击者让比特币网络超载的风险发生,毕竟那时系统还很脆弱.在1M的限制下,10分钟一个 ...
- BTC钱包对接流程
BTC钱包对接流程: 部署钱包节点 分析钱包的API 通过JSON-RPC访问钱包API 部署测试 1.部署钱包节点 虚拟币交易平台对接所有的虚拟币之前,都要在自己的服务器上部署一个钱包节点,首先要找 ...
- 比特币BTC全节点搭建
比特币BTC全节点搭建 #环境 ubuntu 16.4 #硬盘500GB #截止2018-12-31磁盘占用超过230GB #客户端安装 #下载页面 #https://bitcoin.org/zh_C ...
随机推荐
- 【scikit-learn基础】--『预处理』之 数据缩放
数据的预处理是数据分析,或者机器学习训练前的重要步骤.通过数据预处理,可以 提高数据质量,处理数据的缺失值.异常值和重复值等问题,增加数据的准确性和可靠性 整合不同数据,数据的来源和结构可能多种多样, ...
- 数字孪生和GIS系统融合能为水利领域带来什么改变?
随着科技的不断进步,数字孪生和GIS系统的融合应用逐渐成为了水利领域的新趋势.数字孪生是指通过数字化技术模拟物理实体和过程,将现实世界与虚拟世界相结合的技术,而GIS系统则是地理信息系统,用于收集.存 ...
- 文件不落地上线sliver
接着二开sliver,给他添加一个生成powershell payload上线的功能,生成并复制到剪切板. 准备 首先,先开启监听,不多说直接mtls默认的就行,sliver可以生成配置文件来实现 ...
- Ubuntu 安装MySQL 8.0.23及以上版本
首先如果当前linux中没有wget,那么我们可以考虑使用sudo apt-get install wget来安装wget命令 Ubuntu自带的源只能安装MySQL5.7版本,这里去MySQL官网安 ...
- 2023-09-10:用go语言编写。作为项目经理,你规划了一份需求的技能清单 req_skills, 并打算从备选人员名单 people 中选出些人组成一个「必要团队」 ( 编号为 i 的备选人员
2023-09-10:用go语言编写.作为项目经理,你规划了一份需求的技能清单 req_skills, 并打算从备选人员名单 people 中选出些人组成一个「必要团队」 ( 编号为 i 的备选人员 ...
- 未加载mscorlib.pdb
前言: 早上上班按照正常流程打开Visual Studio,调试本地项目,然后奇怪的是一直提示未加载mscorlib.pdb,导致项目无法正常运行,经过一番折腾最后解决了这个突如其来的bug! 问题重 ...
- 揭秘华为云GaussDB(for Redis)丨大key治理
本文分享自华为云社区<华为云GaussDB(for Redis)揭秘第31期:大key治理>,作者: 高斯Redis官方博客. 从DBA的视角看,大Key无疑是引起Redis线上问题的常见 ...
- 干货时间:聊聊DevOps下的技术系列之契约测试
摘要:本期和大家简单聊聊在服务交互场景下使用服务契约的重要性,以及契约管理的必要性,最后简单介绍了下契约测试. 1.服务交互带来的问题 在上一篇文章中,我们系统的列举了DevOps各个流程中常用的测试 ...
- 面试官:说一下Jena推理
摘要:本文介绍了Jena的推理子系统,并构建了一个简单的RDF图.基于该RDF图,我们搭建了一个Jena推理引擎,并进行自动化推理. 本文分享自华为云社区<知识推理之基于jena的知识推理(三) ...
- 华为云企业级Redis揭秘第17期:集群搭载多DB,多租隔离更降本
摘要:GaussDB(for Redis)支持真正可扩展的多DB,轻松实现降本增效. 本文分享自华为云社区<华为云企业级Redis揭秘第17期:集群搭载多DB,多租隔离更降本>,作者: G ...