① 比特币区块里的各个字段含义(先写了个nonce)
nonce是个啥意思?根据bitcoin wiki
nonce是一个4-byte大小的区域,nonce的值设定使得该块的hash是以一串0开头的。
对于块数据的一点点改变(比如nonce)都会引起block hash的巨大变化。由于逆向预测hash值相对应的一组bit值(hash原文)是不可行的,在尝试足够多的nonce值且计算每个nonce值相对应的block hash之后可以找到一个满足有指定数量 0 bits (0比特位) 的hash值。而 0 bits的数量值是由difficult设定的。最终产生的hash须得是一个小于当前difficulty值。
因为这个迭代的计算耗费时间和资源,块的出现也就是得到了正确的nonce值,这构成了 proof of work
关于以太坊里的nonce 网上很多解释,很多一上来就是 交易计数器 , 然而却把跟POW有关的丢了吗?事实上以太坊里的nonce有两种意思,一个是proof of work nonce,一个是account nonce。
那智能合约呢?合约也算是Account的一种,那也有nonce吗?
是的,而且合约里面的nonce也差不多,也是一个counter。在智能合约里,nonce的值代表的是该合约创建的合约数量。只有当一个合约创建另一个合约的时候才会增加nonce的值。但是当一个合约调用另一个合约中的method时 nonce的值是不变的。
在以太坊中nonce的值可以这样来获取(其实也就是属于一个账户的交易数量):
但是这个方法只能获取交易once的值。目前是没有内置方法来访问contract中的nonce值的,除了自己定义一个counter来计数...
那好,再来看一下Ethereum Block中的nonce:
以太坊和比特币区块链一样,也需要proof of work(计划转移到股份证明也早已在做了)。在比特币区块链中,pow应该是要算出一个符合难度要求的值,通常是以一串0开头的。这个难度一直在变化。可以查看 比特币区块链的POW难度变化 。
② 以太坊的共识算法是什么
以太坊的共识算法是什么?
以太坊是一种基于区块链技术的去中心化应用平台,其共识算法是实现区块链网络共识的重要组成部分。以太坊采用了称为“工作量证明”(Proof-of-Work,PoW)的共识算法来验证交易和添加新的区块到链上。
在以太坊中,挖矿节点使用计算能力来解决数学难题,这些数学难题需要大量计算资源来解决。完成解题的矿工将获得以太币的奖励,并由网络确认其工作结果,从而将新的区块添加到区块链中。
如何保障共识算法的安全性?以太坊通过调整困难度(Difficulty),使得挖矿难度与算力成正比。也就是说,当更多的挖矿节点加入网络并提高算力时,难度也相应变化,确保全网总共识难度保持一定的水平。
除了工作量证明,以太坊还计划采用“证明权益”(Proof-of-Stake,PoS)的共识算法来替代PoW。在PoS共识算法中,用户需要投入一定量的以太币来验证交易和添加新的区块。随着用户持有的以太币数量越多,其参与共识的权利也就越大。
总的来说,以太坊的共识算法采用了PoW和未来可能会采用PoS,这两种算法均是为了保障区块链网络的安全性。随着技术的进步和共识算法的不断演进,以太坊将在不断优化共识算法的同时,实现更好的去中心化应用平台。
③ 区块链高度怎么查询(区块链地址查询怎么查)
区块高度越高说明什么区块高度(Blockheight)是指一个区块的高度是指在区块链中它和创世区块之间的块数。区块高度是可以通过该区块在区块链中的位置识别区块的另一种方式。第一个区块,其高度为0,每一个随后被存储在第一个区块之上的区块在区块链中都比前一区块“高”出一个位置,就像箱子一个接一个堆叠在其他箱子之上。
和区块头哈希值不同的是,区块高度并不是唯一的标识符,在区块链的增长过程中可能会出现两个或两个以上的区块有同样的高度,这种情况叫做“区块链分叉”。
区块链是blockchain翻译而来的,看见“链”人们联想到的是长长的链条,它有长度的概念。但在区块链中,并不叫区块长度,而是区块高度,你可以把区块链理解为区块堆。
创世区块,即第0块,位于最底层,然后每一块都叠在前一块之上,这样就比较好理解区块高度了。我们查询某个区块信息时,除了通过它的哈希,还可以通过它的区块高度进行查询。
区块高度的作用
区块高度是区块的标示符,区块有两个标示符,一是区块头的哈希值,二是区块高度。区块头的哈希值是通过SHA256算法对区块头进行二次哈希计算而得到的数字。区块哈希值可以唯一、明确地“标识”一个区块,并且任何节点通过简单地对区块头进行哈希计算都可以独立地获取该区块哈希值。区块高度是指该区块在区块链中的位置。区块高度并不是唯一的“标识”符。虽然一个单一的区块总是会有一个明确的、固定的区块高度,但反过来却并不成立,一个区块高度并不总是识别一个单一的区块。两个或两个以上的区块可能有相同的区块高度,在区块链里争夺同一位置。
如何检测区块链智能合约的风险等级高低随着上海城市数字化转型脚步的加快,区块链技术在政务、金融、物流、司法等众多领域得到深入应用。在应用过程中,不仅催生了新的业务形态和商业模式,也产生了很多安全问题,因而安全监管显得尤为重要。安全测评作为监管重要手段之一,成为很多区块链研发厂商和应用企业的关注热点。本文就大家关心的区块链合规性安全测评谈谈我们做的一点探索和实践。
一、区块链技术测评
区块链技术测评一般分为功能测试、性能测试和安全测评。
1、功能测试
功能测试是对底层区块链系统支持的基础功能的测试,目的是衡量底层区块链系统的能力范围。
区块链功能测试主要依据GB/T25000.10-2016《系统与软件质量要求和评价(SQuaRE)第10部分:系统与软件质量模型》、GB/T25000.51-2016《系统与软件质量要求和评价(SQuaRE)第51部分:就绪可用软件产品(RUSP)的质量要求和测试细则》等标准,验证被测软件是否满足相关测试标准要求。
区块链功能测试具体包括组网方式和通信、数据存储和传输、加密模块可用性、共识功能和容错、智能合约功能、系统管理稳定性、链稳定性、隐私保护、互操作能力、账户和交易类型、私钥管理方案、审计管理等模块。
2、性能测试
性能测试是为描述测试对象与性能相关的特征并对其进行评价而实施和执行的一类测试,大多在项目验收测评中,用来验证既定的技术指标是否完成。
区块链性能测试具体包括高并发压力测试场景、尖峰冲击测试场景、长时间稳定运行测试场景、查询测试场景等模块。
3、安全测评
区块链安全测评主要是对账户数据、密码学机制、共识机制、智能合约等进行安全测试和评价。
区块链安全测评的主要依据是《DB31/T1331-2021区块链技术安全通用要求》。也可根据实际测试需求参考《JR/T0193-2020区块链技术金融应用评估规则》、《JR/T0184—2020金融分布式账本技术安全规范》等标准。
区块链安全测评具体包括存储、网络、计算、共识机制、密码学机制、时序机制、个人信息保护、组网机制、智能合约、服务与访问等内容。
二、区块链合规性安全测评
区块链合规性安全测评一般包括“区块链信息服务安全评估”、“网络安全等级保护测评”和“专项资金项目验收测评”三类。
1、区块链信息服务安全评估
区块链信息服务安全评估主要依据国家互联网信息办公室2019年1月10日发布的《区块链信息服务管理规定》(以下简称“《规定》”)和参考区块链国家标准《区块链信息服务安全规范(征求意见稿)》进行。
《规定》旨在明确区块链信息服务提供者的信息安全管理责任,规范和促进区块链技术及相关服务的健康发展,规避区块链信息服务安全风险,为区块链信息服务的提供、使用、管理等提供有效的法律依据。《规定》第九条指出:区块链信息服务提供者开发上线新产品、新应用、新功能的,应当按照有关规定报国家和省、自治区、直辖市互联网信息办公室进行安全评估。
《区块链信息服务安全规范》是由中国科学院信息工程研究所牵头,浙江大学、中国电子技术标准化研究院、上海市信息安全测评认证中心等单位共同参与编写的一项建设和评估区块链信息服务安全能力的国家标准。《区块链信息服务安全规范》规定了联盟链和私有链的区块链信息服务提供者应满足的安全要求,包括安全技术要求和安全保障要求以及相应的测试评估方法,适用于指导区块链信息服务安全评估和区块链信息服务安全建设。标准提出的安全技术要求、保障要求框架如下:
图1区块链信息服务安全要求模型
2、网络安全等级保护测评
网络安全等级保护测评的主要依据包括《GB/T22239-2019网络安全等级保护基本要求》、《GB/T28448-2019网络安全等级保护测评要求》。
区块链作为一种新兴信息技术,构建的应用系统同样属于等级保护对象,需要按照规定开展等级保护测评。等级保护安全测评通用要求适用于评估区块链的基础设施部分,但目前并没有提出区块链特有的安全要求。因此,区块链安全测评扩展要求还有待进一步探索和研究。
3、专项资金项目验收测评
根据市经信委有关规定,信息化专项资金项目在项目验收时需出具安全测评报告。区块链应用项目的验收测评将依据上海市最新发布的区块链地方标准《DB31/T1331-2021区块链技术安全通用要求》开展。
三、区块链安全测评探索与实践
1、标准编制
上海测评中心积极参与区块链标准编制工作。由上海测评中心牵头,苏州同济区块链研究院有限公司、上海七印信息科技有限公司、上海墨珩网络科技有限公司、电信科学技术第一研究所等单位参加编写的区块链地方标准《DB31/T1331-2021区块链技术安全通用要求》已于2021年12月正式发布,今年3月1日起正式实施。上海测评中心参与编写的区块链国标《区块链信息服务安全规范》正处于征求意见阶段。
同时,测评中心还参与编写了国家人力资源和社会保障部组织,同济大学牵头编写的区块链工程技术人员初级和中级教材,负责编制“测试区块链系统”章节内容。
2、项目实践
近年来,上海测评中心依据相关技术标准进行了大量的区块链安全测评实践,包括等级保护测评、信息服务安全评估、项目安全测评等。在测评实践中,发现的主要安全问题如下:
表1区块链主要是安全问题
序号
测评项
问题描述
1
共识算法
共识算法采用Kafka或Raft共识,不支持拜占庭容错,不支持容忍节点恶意行为。
2
上链数据
上链敏感信息未进行加密处理,通过查询接口或区块链浏览器可访问链上所有数据。
3
密码算法
密码算法中使用的随机数不符合GB/T32915-2016对随机性的要求。
4
节点防护
对于联盟链,未能对节点服务器所在区域配置安全防护措施。
5
通信传输
节点间通信、区块链与上层应用之间通信时,未建立安全的信息传输通道。
6
共识算法
系统部署节点数量较少,有时甚至没有达到共识算法要求的容错数量。
7
智能合约
未对智能合约的运行进行监测,无法及时发现、处置智能合约运行过程中出现的问题。
8
服务与访问
上层应用存在未授权、越权等访问控制缺陷,导致业务错乱、数据泄露。
9
智能合约
智能合约编码不规范,当智能合约出现错误时,不提供智能合约冻结功能。
10
智能合约
智能合约的运行环境没有与外部隔离,存在外部攻击的风险。
3、工具应用
测评中心在组织编制《DB31/T1331-2021区块链技术安全通用要求》时,已考虑与等级保护测评的衔接需求。DB31/T1331中的“基础设施层”安全与等级保护的安全物理环境、安全通信网络、安全区域边界、安全计算环境、安全管理中心等相关要求保持一致,“协议层安全”、“扩展层安全”则更多体现区块链特有的安全保护要求。
测评中心依据DB31/T1331相关安全要求,正在组织编写区块链测评扩展要求,相关成果将应用于网络安全等级保护测评工具——测评能手。届时,使用“测评能手”软件的测评机构就能准确、规范、高效地开展区块链安全测评,发现区块链安全风险,并提出对应的整改建议
怎样通过RPC命令实现区块链的查询
基本架构如下:
前端web基于socket.io或者REST实现,
后端加一层mongodb/mysql等数据库来代替单机leveldb做数据存储
目的应该是:
1.加速查询
2.做更高层的数据分析
3.做分布式数据库
思考:
这些online的查询固然可以方便我们的日常用,那如何与相关应用集成呢?我们是否可以通过简单的rpc命令实现同等的效果?
有几个用处:
1.大家都可以做自己的qukuai.com或blockchain.info的查询:)
2.集成RPC命令到自己的店铺,收款后查询用
3.集成到钱包应用
4.其他应用场景
cmd分析:
根据高度height查blockhash
./bitcoin-cligetblockhash19999
2.然后根据blockhash查block信息
./bitcoin-cligetblock
{
"hash":"",
"confirmations":263032,
"size":215,
"height":19999,
"version":1,
"merkleroot":"",
"tx":[
""
],
"time":1248291140,
"nonce":1085206531,
"bits":"1d00ffff",
"difficulty":1.00000000,
"chainwork":"",
"previousblockhash":"",
"nextblockhash":""
}
3.根据tx查询单笔交易的信息:
没建index时,只能查询自己钱包的信息,若不是钱包的交易,则返回如下:
./bitcoin-cligetrawtransaction
error:{"code":-5,"message":"Invalidornon-wallettransactionid"}
那怎么办呢?直接分析代码找原因:
//Returntransactionintx,andifitwasfoundinsideablock,itshashisplacedinhashBlock
boolGetTransaction(constuint256hash,CTransactiontxOut,uint256hashBlock,boolfAllowSlow)
{
CBlockIndex*pindexSlow=NULL;
{
LOCK(cs_main);
{
if(mempool.lookup(hash,txOut))
{
returntrue;
}
}
if(fTxIndex){
CDiskTxPospostx;
if(pblocktree-ReadTxIndex(hash,postx)){
CAutoFilefile(OpenBlockFile(postx,true),SER_DISK,CLIENT_VERSION);
CBlockHeaderheader;
try{
fileheader;
fseek(file,postx.nTxOffset,SEEK_CUR);
filetxOut;
}catch(std::exceptione){
returnerror("%s:DeserializeorI/Oerror-%s",__func__,e.what());
}
hashBlock=header.GetHash();
if(txOut.GetHash()!=hash)
returnerror("%s:txidmismatch",__func__);
returntrue;
}
}
if(fAllowSlow){//,andscanit
intnHeight=-1;
{
CCoinsViewCacheview=*pcoinsTip;
CCoinscoins;
if(view.GetCoins(hash,coins))
nHeight=coins.nHeight;
}
if(nHeight0)
pindexSlow=chainActive[nHeight];
}
}
if(pindexSlow){
CBlockblock;
if(ReadBlockFromDisk(block,pindexSlow)){
BOOST_FOREACH(constCTransactiontx,block.vtx){
if(tx.GetHash()==hash){
txOut=tx;
hashBlock=pindexSlow-GetBlockHash();
returntrue;
}
}
}
}
returnfalse;
}
pi节点区块高度不显示PI节点区块高度不显示可能是由于网络连接出现问题而导致的,建议重新检查网络连接,重启PI节点,以及更新PI节点软件至最新版本,若仍无法显示出来,可使用区块链浏览器查看区块高度。
怎么样在以太坊上查询区块链币可以输入钱包地址、交易ID、区块哈希或者区块高度等信息直接查询,非常方便。
如果是查询账户余额、账户的历史交易数据等信息,建议直接输入钱包地址查询;如果是查询某笔转账的相关信息,比如是否到账、进展如何,输入交易ID是最方便的。
当然了,区块链浏览器不仅可以查询自己的账户,也可以查询别人的账户以及相关的交易信息,包括比特币创始人中本聪的账户。
④ 挖矿真的能赚钱吗!数据带你看清真相……
“拥有三台挖矿机,不用去上班了!在家躺着等收钱!!!”
“3个月回本,除去电费,剩下的全是利润。”
……
满屏都充斥着这样的文字,与蛊惑。
你心动过么?
怀疑过么?
想撸起袖子买一台来试试看么?
当你手攥2万元,准备入场,却不知该买币好,还是挖币好时,不妨读读下面这些数据。
因为,买币和挖币,真的没有太大差别!!(至少,2018年的以太坊是这样。)
如果再考虑所耗费的时间成本、电费成本、维护成本、全网算力提升,等等这些关键因素。那么,挖币将是一件非常不划算的事情。
为什么?
看下面的数据,你就知道了。
假设手里有2万元闲置资金,你是准备买币?还是入手一台矿机来挖币?
如果参考以太坊(eth),我们来算算2种方案各自的优劣。
方案A——买币
假设在2018.01.10(当天eth价格为1402.47美元,折合人民币9011.35元),花2万元买入2.2枚eth,即:
方案B——挖币
假设仍以2万元价格买入一台矿机(6块显卡:讯景RX570 4G战狼版),相关参数为:
以2018.01.10当天eth难度值(difficulty value = 2005.905T)来计算,这台矿机,一天能挖出0.022枚,如下表:
★ 情形一:假设全网算力不变
如果全网算力没有提升(即eth难度值仍为2005.905T),那么,我们这台矿机每天都能挖出0.022枚eth:
100天后,我们收获2.22枚eth:
如果不考虑币价波动,此时已经收回了当初购买矿机的成本:
再用一周的时间(大约6天),之前消耗的电费也可以完全赚回来。
也就是说,在购买矿机后的第107天,除去每日电费,剩下的全是净利润。
这样看来,挖矿要比直接买币有赚头得多。
但实际情况,真的是这样吗????
这样的收益结果,是在一个非常重要的前提下运算得到的,即
“全网算力不变!!! ”
但是,全网算力真的不发生改变吗?
下面是近3个月(2017.10.17-2018.01.16)eth的难度值增长图:
正是由于算力提升,难度值在持续增长。
因而,我们的假设:全网算力保持不变,是不合理的。
那么,在真实的环境下,挖矿究竟能带来多少收益呢?
★ 情形二:全网算力逐步提升
如果全网算力每天都在提升,那么,我们购买的矿机,每天的挖币量,不再均衡地保持在0.022水平线上,而是逐日递减:
上图是在全网算力每天递增的情况下,日挖币量的曲线。
如果全网算力以天为单位,有时增加,有时降低,那么,日挖币量曲线将是波动的。
为了弱化这种日波动带来的影响,假设全网算力每个月增长一次,难度值每个月上升25%(数据来源: etherscan.io/chart/diff...
),则每个月的挖币量为:
即“在不考虑币价波动,eth难度值每月增长25%的情况下,以2万元的成本,购入一台算力为170Mh/s的矿机,全天24小时运行5个月后,即可回本”。
从数据上来看,全网算力的增长,并没有过多的影响回本时间(仅仅多出50天):
关键是在收回成本后,挖矿真的能带来更多的收益吗?
继续往下算,看看第6个月~第12个月能够获得的eth数量:
将表格中的最后1列绘制成曲线图:
从图中能够看到,从第6个月开始,曲线越来越平缓,直到第12个月,近乎为一条水平线,也就是说,同样的矿机,下半年持续挖,也只能再挖出0.63个eth。
假设电价为0.5元/度,一天消耗24度电。那么,全年的电费约为4380元。
然而,居民用电采用阶梯定价的方式,矿机持续跑一年,电价会比0.5元/度再高出0.2-0.4元不等(视地区而定),故全年因挖矿而产生的电费,大约维持在5568元左右。
总结一下,如果花2万元入手一台算力为170MH/s、日耗电量为24度电的矿机,其成本为:
假设eth难度值每月增长25%,且矿机没有损耗(即算力一直维持在170Mh/s),那么,全年挖币量为3.038枚。不同的币价,对应的收益约为:
参照挖矿成本(2.56万元),不同的币价,所对应的收益-成本为:
所以,总的来说,只要币价坚挺,挖矿是有利可图的。
但是,其收益也仅和买币所带来的收益大体相同,如果考虑设备损耗以及全网算力快速提升等必然因素。那么,挖矿所获得的收益,实际上要小于直接买币所能赚取的收益。
最后,附上“买币、挖矿的成本-收益对比图”:
⑤ 简单的解释一下什么是区块链
区块链是一个信息技术领域的术语。从本质上讲,它是一个共享数据库,存储于其中的数据或信息,具有“不可伪造”“全程留痕”“可以追溯”“公开透明”“集体维护”等特征。基于这些特征,区块链技术奠定了坚实的“信任”基础,创造了可靠的“合作”机制,具有广阔的运用前景。
2019年1月10日,国家互联网信息办公室发布《区块链信息服务管理规定》。2019年10月24日,在中央政治局第十八次集体学习时,习近平总书记强调,“把区块链作为核心技术自主创新的重要突破口”“加快推动区块链技术和产业创新发展”。“区块链”已走进大众视野,成为社会的关注焦点。
2019年12月2日,该词入选《咬文嚼字》2019年十大流行语。
(5)以太坊修改difficulty扩展阅读:
区块链金融应用:
2016年起,各大金融巨头们也闻风而动,纷纷开展区块链创新项目,探讨在各种金融场景中应用区块链技术的可能性。特别是普银集团率先开创了“区块链+”本位制数字货币的先河。
本位制数字货币是资产经过第三方机构完成鉴定、评估、确权、保险等流程,经过缜密的数字算法写入区块链,形成资产与数字货币之间的本位对应关系,称之为本位制数字货币。
为了实现区块链金融大跨越大发展,为了推动中国经济新发展,加速全球资产流通,实现一代代人为之奋斗不已的复兴梦想,普银集团将于2016年12月9日在贵州举行普银区块链金融贵阳战略发布仪式;
会上将就区块链实现资产的数字化流通、区块链金融交易模式、并对区块链服务与社会公共产业的应用落地展开探讨。此次大会将标志着区块链金融落地应用的开始,标志着全新金融生态的变革与发展。
⑥ 以太坊stratum协议原理
参照比特币的 stratum协议 和 NiceHash的stratum协议规范 编写了一版以太坊版本的stratum协议说明.
stratum协议是目前最常用的矿机和矿池之间的TCP通讯协议。
以太坊是一个去中心化的网络架构,通过安装Mist客户端的节点来转发新交易和新区块。而矿机、矿池也同时形成了另一个网络,我们称之为矿工网络。
矿工网络分成矿机、矿池、钱包等几个主要部分,有时矿池软件与钱包安装在一起,可合称为矿池。
矿机与矿池软件之间的通讯协议是 stratum ,而矿池软件与钱包之间的通讯是 bitcoinrpc 接口。
stratum是 JSON 为数据格式.
矿机启动,首先以 mining.subscribe 方法向矿池连接,用来订阅工作。
矿池以 mining.notify 返回订阅号、ExtraNonce1和ExtraNonce2_size。
Client:
Server:
其中:
是 订阅号 ;
080c是 extranonce ,Extranonce可能最大3字节;
矿机以 mining.authorize 方法,用某个帐号和密码登录到矿池,密码可空,矿池返回 true 登录成功。该方法必须是在初始化连接之后马上进行,否则矿机得不到矿池任务。
Client:
Server:
难度调整由矿池下发给矿机,以 mining.set_difficulty 方法调整难度, params 中是难度值。
Server:
矿机会在下一个任务时采用新难度,矿池有时会马上下发一个新任务并且把清理任务设为true,以便矿机马上以新难度工作。
该命令由矿池定期发给矿机,当矿机以 mining.subscribe 方法登记后,矿池应该马上以 mining.notify 返回该任务。
Server:
任务ID : bf0488aa ;
seedhash : 。每一个任务都发送一个seedhash来支持尽可能多的矿池,这可能会很快地在货币之间交换。
headerhash : 。
boolean cleanjobs : true 。如果设为true,那么矿工需要清理任务队列,并立即开始从事新提供的任务,因为所有旧的任务分享都将导致陈旧的分享错误。如果是 false 则等当前任务结束才开始新任务。
矿工使用seedhash识别DAG,然后带着headerhash,extranonce和自己的minernonce寻找低于目标的share(这是由提供的难度而产生的)。
矿机找到合法share时,就以” mining.submit “方法向矿池提交任务。矿池返回true即提交成功,如果失败则error中有具体原因。
Client:
任务ID : bf0488aa
minernonce : 6a909d9bbc0f 。注意minernonce是6个字节,因为提供的extranonce是2个字节。如果矿池提供3字节的extranonce,那么minernonce必须是5字节
Server:
一般的矿机与矿池通讯过程就如下所示:
⑦ 区块链分叉有什么风险(什么叫区块链分叉)
区块链为什么有分叉?分叉会发生什么情况?????区块链的分叉(fork)的形成原因可能有多种。
????当两个结点几乎在同一个时间挖到了矿并同时发布区块,此时就出现临时性的的分叉(statefork),
????本质上是对比特币这个区块链当前的状态产生了意见分歧,
????当人为的发起分叉攻击(forkingattack),也就是故意造成这类分叉(deliberatefork)还有一类分叉是,当比特币的协议发生了改变的时候,软件需要升级。而在分布式系统中不能保证所有节点同时升级软件,假设存在部分节点未升级,会导致协议分叉(protocolfork)。对协议修改的内容的不同,又可以将分叉分为硬分叉(hardfork)和软分叉(softfork);
????比特币协议增加新协议,扩展新功能,未升级软件的旧节点会不认可这些修改,会认为这些特性是非法的。这也就是对比特币协议内容产生分歧,从而导致的分叉叫硬分叉。此时,就出现了新节点永远沿着新节点产生的链挖矿,旧节点永远沿着旧节点链挖矿,由于新节点算力足够强,所以形成两条永远都在延伸且平行的链。只要这部分旧节点永远不更新,则旧链将一直延续,可见这种分叉是持久性的。
出现hardfork后,便变成了两条平行的链,也就造成了社区分裂。社区中有一部分人,会认为下面的链才是根正苗红,各个链上的货币独立。以太坊历史上的一件大事就是硬分叉事件。以太坊称为ETH,但目前看到的ETH已经不是最初的ETH了,以太坊在历史上发生过硬分叉,另一个链称为ETC。实际上,ETC才是以太坊设计原本的协议,而ETH是黑客攻击ETH上一个智能合约THEDAO后,进行回滚的协议链(将黑客攻击偷取的以太币采用硬分叉方式回滚回到另一智能合约,然后退还给真正拥有者)。
????分叉之初,由于两个链分叉造成了互相影响,产生了很多麻烦。比如:在ETH链上有一笔转账B-C,有人便在ETC链上回放,将ETC链上的货币页转给了C(C收到两笔钱)。后来,对两条链各添加了一个chainID,将两个链区分开,才使得这两条链真正分开。
如果对BTC协议添加限制,使得原本合法交易在新交易中不合法,便会形成软分叉。
当大多数节点已经更新完毕之后,旧节点认可新节点挖出的区块,因此发布自己挖出的区块,但新节点不认可旧结点挖出的区块,便沿着上一个新节点发布的区块继续挖矿,当新节点拥有大部分算力的时候,新链会越来越长,从而旧节点挖出并发布的区块一直被抛弃,无法获得出块奖励,最终倒逼旧节点升级软件,实现所有节点认可新协议并进行升级。可见,只要系统中拥有半数以上算力节点更新软件,此类分叉不会出现永久性分叉。比特币脚本中的P2SH就是通过软分叉方法加进去的。
?
????这一部分我并没有查到太多的资料,但是在绝大多数共识协议之中我们都假设需要过半算力;
????在理论上,如果掌握了50%以上的算力,就拥有了获得记账权的绝对优势,可以更快地生成区块,也拥有了篡改区块链数据的权利。因此,当具有过半的算力,也就是51%都是诚实可靠的,能保证整一个区块链在合法有序的进行运行。
????但是为什么选择过半的算力,而不是过半的用户?比特币系统,任何人都可以加入,且创建账户及其简单,只需要本地产生公私钥对即可。只有转账(交易)时候,比特币系统才能知道该账户的存在。这样,黑客可以使用计算机专门生成大量公私钥对,当其产生大量公私钥对超过系统中一半数目,就可以获得支配地位(女巫攻击)。因此,比特币系统中很巧妙的使用算力作为投票的依据。
到底啥是区块链分叉?
分叉,是区块链世界中一个神奇的名词。区块链网络从此一分为二,不同共识的人们从此分道扬镳。这究竟是一次动荡的分裂,还是一次新的共识的形成?
区块链的分叉,可以说是区块链网络中独有的一种版本升级方式,就像我们生活中使用的互联网软件一样,使用了一段时间以后,自然而然就需要进行优化升级,从而去解决一些用户的使用问题。区块链也是这样,只不过它的升级比较特别,升级的时候会由参与的矿工共同来决定,甚至还能产生多种版本,不像互联网一样一家独裁、没有选择的余地。
它的原理是这样的,由于区块链是一个由数据块组成的链式结构。所以,当他要升级的时候,实际上会从某一个数据块开始,连到两个不同的数据块上,从而分成了两条链;就好像树枝一样,大家共用同一个树干,共享会分开前的数据,但是又有很多条树枝属于多条链,而这个过程就叫做分叉。
之前我们也说了,区块链的升级是由矿工们一起来决定,既然参与的人多了,就会有不同的意见,当大家能达成共识的时候,分叉出来的两条链相当于一个是老的版本,一个是新的版本,两者兼容;老链上的矿工升级后,逐渐向新链过渡,最终大家升级完成只剩新链,这叫做软分叉。具体来说软分叉属于系统内的短暂现象,并不会分叉出一个新的区块链。区块链系统升级,一部分节点并哪怕没有及时升级,也仍旧可以工作。比特币软分叉之后不会像硬分叉一样产生两条链,而是还会保持在一条链上,软分叉会进行一些升级,但是不会影响整个系统的稳定性和有效性,旧节点会兼容新节点,只是新节点不兼容旧节点而已,二者依然可以共存在一条链上。
当矿工们不能达成共识的时候,大家虽然共用之前的数据,但是形成了两条新的链,就好比物种进化一样,一部分猴子进化成了人类,另一部分进化成了猩猩,两种物种都发生了改变,互不兼容,这叫做硬分叉。也就是说区块链发生永久性分歧,在新共识规则发布后,部分没有升级的节点无法验证已经升级的节点生产的区块,通常硬分叉就会发生。代码出现一个硬分叉,会改变算法的难度级别。
实质意义上的分叉之所以产生,是因为项目在动态发展过程中原社区内部理念产生了不可调和的分歧。区块链背后的社区作为去中心化组织,主张非暴力自由人的自由联合,这意味着在向未知的将来迈进的过程中,当遇到的新问题超出了原有既定游戏规则之时,分歧一旦产生将很难达成一致,这是由区块链基因里去中心化的属性决定的。
区块链技术的发展还处于很初期的状态,分叉对于区块链来说,就相当于一个技术迭代的过程,随着人们不断发现区块链技术现有的限制,只有不断升级和扩展这项技术,才能让区块链技术走向成熟。当然,这种分叉跟区块链不可篡改的特性正在背道而驰,但没有天生完美的技术,区块链也不例外,技术的发展如果在发生错误时都不可控,那这种技术就无法做到普世,人们对它的信任度也无法提升。且分叉的结果是由社区成员投票决定的,某种程度上来说依旧遵守着去中心化的原则。
人们对区块链分叉各执己见,但在区块链发展的历史进程里,分叉无疑让区块链变得更有故事性和可能性了。总的来说,分叉这种升级方式虽然麻烦很多。但是,他却给了每个人更多选择的权利。也许,区块链就在这样的求同存异之中孕更多的可能性。
区块链鼻祖比特币之8:分叉带来的双花支付、51%攻击与解决办法分叉
前面讲到了比特币通过区块链+工作量证明的独特设计来解决了时间顺序,但是不能保证在同一时刻有两个节点算出了正确的解,虽然这种可能性很低很低。这就带来了区块的分叉。
虽然说几乎同时有两个节点计算出这一数学问题的可能性微乎其微,但是仍然存在这样的可能性,所以分叉就以为着同一个区块的后面可能会跟上两个不同的区块。
规则的打破一直要到下一个区块被人解开。则会立即转向最长的区块,而那些短的区块则会被抛弃。数学问题使得区块很难被同时拆解。要连续发生多次更是困难。最终区块链会稳定下来。也就是说所有人对最后几个区块顺序达成共识。分叉意味着,譬如,若你的交易出现在较短的支链,它就会失去进入区块链的位置。一般而言,只代表他会回到未确认交易池。然后被纳入到下一个区块。
比特币网络如何解决分叉带来的双花支付
可惜,交易失去区块位置的潜在可能,给了本来定序系统防范的重复支付攻击机会。考虑下面的一个攻击者A,其首先用自己的比特币交换B节点的货物,其立即又支付给自己。然后其通过努力的制造更长的链条来让自己的支付替代掉B节点的支付,从而实现了双重支付,B节点既得不到钱,还失去了货物。
这时交易会退回到未确认池中,因为A节点已经利用参照同样的input交易取而代之。节点就会认为Bob的交易无效。因为已使用掉。
你可能会猜测A节点会预先的计算出一支区块链,然后抓住时机发布到网络。但是每个区块的数学谜题阻挡了这个可能性。如前面所诉,解开区块是猜测出一个随机数的过程。一旦得出答案,解出的哈希值就会成为指纹一样的区块识别。只要区块内容有一丁点变化,下一个区块的参考值就会完全不同。此机制的结果就是无法在区块链中置换区块。在得到前一个区块之前,下位区块无法被解开。前一个区块的指纹也是杂凑函数的引数之一。
同时,该工作量证明机制还解决了在集体投票表决时,谁是大多数的问题。如果决定大多数的方式是基于IP地址的,一IP地址一票,那么如果有人拥有分配大量IP地址的权力,则该机制就被破坏了。而工作量证明机制的本质则是一CPU一票。“大多数”的决定表达为最长的链,因为最长的链包含了最大的工作量。如果大多数的CPU为诚实的节点控制,那么诚实的链条将以最快的速度延长,并超越其他的竞争链条。如果想要对业已出现的区块进行修改,攻击者必须重新完成该区块的工作量外加该区块之后所有区块的工作量,并最终赶上和超越诚实节点的工作量。我们将证明,设想一个较慢的攻击者试图赶上随后的区块,那么其成功概率将呈指数化递减。另一个问题是,硬件的运算速度在高速增长,而节点参与网络的程度则会有所起伏。为了解决这个问题,工作量证明的难度(theproof-of-workdifficulty)将采用移动平均目标的方法来确定,即令难度指向令每小时生成区块的速度为某一个预定的平均数。如果区块生成的速度过快,那么难度就会提高。
如果有一台超级电脑,能够在区块解题中获胜?
即便是一台超级电脑,或者时几百上千台电脑也很难赢得解一个区块的胜利,因为竞争对手不是任一台电脑,而是整个比特币网络。你可以用买彩票来比拟。操作千百台电脑,如同买了千百张彩票一样。
51%攻击是指的什么
根据前面的例子,我们知道,要想有50%的概率领先其他人解题得到胜利,就需要掌握全网50%以上的算力。要连续领先他人解出区块,掌握的运算能力还需要高得多。所以区块链中的交易是受到数学竞赛所保护。恶意用户必须和整个网络较量。区块连接建立的结果,使得在支链越前方的交易越安全。恶意的用户必须在更长的时间赢过全网络,来达成重复支付,替换前面的区块链。所以,系统只有支端末尾易受到重复支付攻击。这也是为什么系统建议多等几个区块,才能确认收款成功。
个人博客:
区块链交易有哪些风险进行区块链交易时,3个最需要注意的灾难性的风险是(严重性从高到低排序):个人风险、平台风险和政策风险最大风险:个人风险如果没有把控好个人风险,可能会遇到:1.密码,私钥被盗,钱包和交易平台里的所有数字资产丢失(无法找回)2.你的信息会被地下黑产卖来卖去,几乎没有隐私3.如果你在其他地方(银行,证券交易平台)使用相同或类似的密码,其他地方的资产也会被盗如何规避个人风险:增加密码强度,不要重复使用密码,不要在网上发送密码…电脑不要裸奔(不装安全杀毒软件),不要上乱七八糟的网站(“黄赌毒”的网站是木马病毒的重灾区)所有需要
区块链面临哪些风险需要解决的?虽然在资本和人才涌入的推动下,区块链行业迎来快速发展,但是作为一个新兴产业,其安全漏洞频繁示警的状况引发了人们对区块链风险的担忧。
国家信息技术安全研究中心主任俞克群指出,对于隐私暴露、数据泄露、信息篡改、网络诈骗等问题,区块链的出现给人们带来了很多期望。但区块链的安全问题依然存在诸多的挑战。
俞克群表示,目前区块链还处在初级阶段,存在着密码算法的安全性、协议安全性、使用安全性、系统安全性等诸多的挑战。
国家互联网应急中心运行部主任严寒冰也指出,区块链如果要在全球经济占有重要地位,必须首先解决其面临的安全问题。
严寒冰指出,区块链安全问题包含多个方面。比如说传统的安全问题,包括私钥的保护,包括应用层软件传统的漏洞等。另外,新的协议层面也有一些新的协议带来的漏洞。
去中心化漏洞平台(DVP)提供的数据也显示区块链安全问题的严峻性。DVP负责人吴家志透露,自7月24日来的一周内,DVP就已经收到白帽子所提供的312个漏洞,涉及175个项目方。其中包括智能合约、知名公链,交易所等一系列项目。高危漏洞达122个,占所有漏洞的39.1%,中危漏洞53个,占所有漏洞的17%。
中国信息安全测评中心主任助理李斌分析说,当前区块链分为公有链、私有链、联盟链三种,无论哪一类在算法、协议、使用、时限和系统等多个方面都面临安全挑战。尤为关键的是,目前区块链还面临的是51%的攻击问题,即节点通过掌握全网超过51%的算例就有能力成功的篡改和伪造区块链数据。
值得注意的是,除了外部恶意攻击风险,区块链也面临其内生风险的威胁。俞克群提醒说,如何围绕着整个区块链的应用系统的设备、数据、应用、加密、认证以及权限等等方面构筑一个完整的安全应用体系,是各方必须要面临的重要问题。
吴家志也分析说,作为新兴产业,区块链产业的从业人员安全意识较为缺乏,导致目前的区块链相关软硬件的安全系数不高,存在大量的安全漏洞,此外,整个区块链生态环节众多,相较之下,相关的安全从业人员力量分散,难以形成合力来解决问题。迎接上述挑战需要系统化的解决方案。
内容来源中新网
⑧ 浠ュお鍧婃寲鐭跨殑闅惧害璋冩暣鏄鎬庝箞鏍风殑
浠ュお鍧婃寲鐭跨殑闅惧害璋冩暣鏄鎬庢牱鐨勶紵
浠ュお鍧婃寲鐭跨殑闅惧害璋冩暣鏄鎬庢牱鐨勶紵
浠ュお鍧婁綔涓轰竴绉嶈櫄鎷熻揣甯侊紝鍏跺畨鍏ㄦт笌鍙闈犳ф湁璧栦簬鎸佺画鐨勬寲鐭挎椿鍔ㄣ傜劧鑰岋紝闅忕潃鎸栫熆浜烘暟鐨勫炲姞锛屽叾闅惧害閫愭笎澧炲姞锛屼娇寰楁寲鐭垮彉寰楄秺鏉ヨ秺鍥伴毦銆傚洜姝わ紝浠ュお鍧婇噰鍙栦簡涓绉嶅彨鍋氬姩鎬侀毦搴︾殑鎶鏈锛岄氳繃瀹氭湡璋冩暣闅惧害鏉ョ‘淇濇寲鐭跨殑鍏姝e拰绋冲畾銆
鍔ㄦ佽皟鏁撮毦搴︾殑鑳屾櫙鍜屾剰涔
浼犵粺鐨勬寲鐭挎祦绋嬮氬父閲囩敤鍥哄畾闅惧害鐨勬寲鐭挎柟娉曪紝鍗冲湪涓娈垫椂闂村唴淇濇寔涓嶅彉鐨勬寲鐭块毦搴︺傜劧鑰岋紝杩欑嶆柟娉曞湪鎸栫熆浜烘暟杈冨皯鐨勬儏鍐典笅鏄鏈夋晥鐨勶紝浣嗛殢鐫瓒婃潵瓒婂氱殑浜哄弬涓庢寲鐭挎椿鍔锛岃繖绉嶆柟娉曠殑灞闄愭у紑濮嬫樉鐜般傚傛灉闅惧害璁剧疆杩囬珮锛屾墍鏈夊弬涓庢寲鐭跨殑浜洪兘鍙鑳藉け璐ワ紱濡傛灉闅惧害璁剧疆杩囦綆锛屽彧鏈変竴灏忛儴鍒嗘寲鐭跨殑浜鸿兘澶熸垚鍔燂紝鑰屽叾浠栦汉鐨勬敹鐩婁細鐩稿簲鍑忓皯銆
鍥犳わ紝涓轰簡瑙e喅杩欎釜闂棰橈紝浠ュお鍧婇噰鍙栦簡涓绉嶅姩鎬佽皟鏁撮毦搴︾殑鏂规硶锛屽嵆瀹氭湡鏇存敼鎸栫熆闅惧害銆
鍔ㄦ侀毦搴﹁皟鏁寸殑宸ヤ綔鍘熺悊
鍔ㄦ侀毦搴﹁皟鏁寸殑涓昏佸師鐞嗘槸锛屾牴鎹鐗瑰畾鐨勮勫垯鏉ヨ$畻鍑轰笂涓娈垫椂闂村唴鐨勬寲鐭挎垚鍔熺巼锛屽苟鎹姝よ皟鏁翠笅涓娈垫椂闂寸殑鎸栫熆闅惧害銆
鏇村叿浣撳湴璇达紝浠ュお鍧婇噰鐢ㄤ簡涓绉嶅彨鍋欵thereumDifficultyBomb锛堜互澶鍧婇毦搴︾偢寮癸級鐨勬妧鏈銆傝繖椤规妧鏈浣跨敤涓涓鎵璋撶殑闅惧害绯绘暟鏉ヨ〃绀烘寲鐭跨殑闅惧害銆傛瘡褰撲竴娈垫椂闂寸粨鏉熸椂锛堥氬父涓15绉掞級锛屼互澶鍧婁細灏嗗綋鍓嶇殑闅惧害绯绘暟涓庣洰鏍囬毦搴︾郴鏁拌繘琛屾瘮杈冦傚傛灉褰撳墠闅惧害绯绘暟楂樹簬鐩鏍囬毦搴︾郴鏁帮紝鍒欎細鑷鍔ㄨ皟鏁翠笅涓涓鍛ㄦ湡鐨勭洰鏍囬毦搴︾郴鏁帮紝浣垮叾鏇村姞鎺ヨ繎褰撳墠闅惧害绯绘暟銆
杩欑嶉毦搴﹁皟鏁存柟娉曚娇寰楁寲鐭夸汉浠鑳藉熷湪鐩稿圭ǔ瀹氱殑闅惧害涓嬫寔缁鎸栫熆锛岃岄毦搴︾殑璋冩暣涔熻兘鏇村ソ鍦伴傚簲甯傚満闇瑕佸拰鑷鐒跺洜绱犵殑鍙樺寲锛屼繚璇佷簡鏁翠釜浠ュお鍧婄綉缁滅殑绋冲畾鍜屽畨鍏ㄣ
鎬荤粨
鍔ㄦ佽皟鏁撮毦搴︽槸浠ュお鍧婃寲鐭跨殑涓椤瑰叧閿鎶鏈锛岃兘澶熺‘淇濇寲鐭跨殑鍏骞虫у拰绋冲畾鎬с傞氳繃鍛ㄦ湡鎬у湴璋冩暣闅惧害绯绘暟锛屼互澶鍧婅兘澶熸洿濂藉湴閫傚簲甯傚満闇姹傚拰鑷鐒跺洜绱犵殑褰卞搷锛屼粠鑰屼繚璇佹寲鐭夸汉鑳藉湪杈冧负骞崇ǔ鐨勯毦搴︿笅鎸佺画鎸栫熆銆
⑨ 区块链如何查询区块高度(区块链怎么查地址)
区块高度是指区块链的容量吗?答:一、区块高度不是指区块链的容量。
二、区块高度的内涵
区块高度是区块链接在主链的个数,也就是连接在区块链上的块数。
三、区块高度的作用
1、区块高度是区块的标示符。
2、区块有两个标示符,一是区块头的哈希值,二是区块高度。
3、区块头的哈希值是通过SHA256算法对区块头进行二次哈希计算而得到的数字。
区块哈希值可以唯一、明确地标识一个区块,并且任何节点通过简单地对区块头进行哈希计算都可以独立地获取该区块哈希值。
4、区块高度是指该区块在区块链中的位置。
区块高度并不是唯一的标识符。
怎么样在以太坊上查询区块链币
可以输入钱包地址、交易ID、区块哈希或者区块高度等信息直接查询,非常方便。
如果是查询账户余额、账户的历史交易数据等信息,建议直接输入钱包地址查询;如果是查询某笔转账的相关信息,比如是否到账、进展如何,输入交易ID是最方便的。
当然了,区块链浏览器不仅可以查询自己的账户,也可以查询别人的账户以及相关的交易信息,包括比特币创始人中本聪的账户。
区块高度越高说明什么区块高度(Blockheight)是指一个区块的高度是指在区块链中它和创世区块之间的块数。区块高度是可以通过该区块在区块链中的位置识别区块的另一种方式。第一个区块,其高度为0,每一个随后被存储在第一个区块之上的区块在区块链中都比前一区块“高”出一个位置,就像箱子一个接一个堆叠在其他箱子之上。
和区块头哈希值不同的是,区块高度并不是唯一的标识符,在区块链的增长过程中可能会出现两个或两个以上的区块有同样的高度,这种情况叫做“区块链分叉”。
区块链是blockchain翻译而来的,看见“链”人们联想到的是长长的链条,它有长度的概念。但在区块链中,并不叫区块长度,而是区块高度,你可以把区块链理解为区块堆。
创世区块,即第0块,位于最底层,然后每一块都叠在前一块之上,这样就比较好理解区块高度了。我们查询某个区块信息时,除了通过它的哈希,还可以通过它的区块高度进行查询。
区块高度的作用
区块高度是区块的标示符,区块有两个标示符,一是区块头的哈希值,二是区块高度。区块头的哈希值是通过SHA256算法对区块头进行二次哈希计算而得到的数字。区块哈希值可以唯一、明确地“标识”一个区块,并且任何节点通过简单地对区块头进行哈希计算都可以独立地获取该区块哈希值。区块高度是指该区块在区块链中的位置。区块高度并不是唯一的“标识”符。虽然一个单一的区块总是会有一个明确的、固定的区块高度,但反过来却并不成立,一个区块高度并不总是识别一个单一的区块。两个或两个以上的区块可能有相同的区块高度,在区块链里争夺同一位置。
怎样通过RPC命令实现区块链的查询基本架构如下:
前端web基于socket.io或者REST实现,
后端加一层mongodb/mysql等数据库来代替单机leveldb做数据存储
目的应该是:
1.加速查询
2.做更高层的数据分析
3.做分布式数据库
思考:
这些online的查询固然可以方便我们的日常用,那如何与相关应用集成呢?我们是否可以通过简单的rpc命令实现同等的效果?
有几个用处:
1.大家都可以做自己的qukuai.com或blockchain.info的查询:)
2.集成RPC命令到自己的店铺,收款后查询用
3.集成到钱包应用
4.其他应用场景
cmd分析:
根据高度height查blockhash
./bitcoin-cligetblockhash19999
2.然后根据blockhash查block信息
./bitcoin-cligetblock
{
"hash":"",
"confirmations":263032,
"size":215,
"height":19999,
"version":1,
"merkleroot":"",
"tx":[
""
],
"time":1248291140,
"nonce":1085206531,
"bits":"1d00ffff",
"difficulty":1.00000000,
"chainwork":"",
"previousblockhash":"",
"nextblockhash":""
}
3.根据tx查询单笔交易的信息:
没建index时,只能查询自己钱包的信息,若不是钱包的交易,则返回如下:
./bitcoin-cligetrawtransaction
error:{"code":-5,"message":"Invalidornon-wallettransactionid"}
那怎么办呢?直接分析代码找原因:
//Returntransactionintx,andifitwasfoundinsideablock,itshashisplacedinhashBlock
boolGetTransaction(constuint256hash,CTransactiontxOut,uint256hashBlock,boolfAllowSlow)
{
CBlockIndex*pindexSlow=NULL;
{
LOCK(cs_main);
{
if(mempool.lookup(hash,txOut))
{
returntrue;
}
}
if(fTxIndex){
CDiskTxPospostx;
if(pblocktree-ReadTxIndex(hash,postx)){
CAutoFilefile(OpenBlockFile(postx,true),SER_DISK,CLIENT_VERSION);
CBlockHeaderheader;
try{
fileheader;
fseek(file,postx.nTxOffset,SEEK_CUR);
filetxOut;
}catch(std::exceptione){
returnerror("%s:DeserializeorI/Oerror-%s",__func__,e.what());
}
hashBlock=header.GetHash();
if(txOut.GetHash()!=hash)
returnerror("%s:txidmismatch",__func__);
returntrue;
}
}
if(fAllowSlow){//,andscanit
intnHeight=-1;
{
CCoinsViewCacheview=*pcoinsTip;
CCoinscoins;
if(view.GetCoins(hash,coins))
nHeight=coins.nHeight;
}
if(nHeight0)
pindexSlow=chainActive[nHeight];
}
}
if(pindexSlow){
CBlockblock;
if(ReadBlockFromDisk(block,pindexSlow)){
BOOST_FOREACH(constCTransactiontx,block.vtx){
if(tx.GetHash()==hash){
txOut=tx;
hashBlock=pindexSlow-GetBlockHash();
returntrue;
}
}
}
}
returnfalse;
}