比特币原理与挖矿算法使用的是哪种Hash算法

区块链解读-区块链中HASH算法
解读区块链,区块链中HASH算法
区块链技术是一系列技术的结合,建立一种新的技术架构,hash算法是其中尤为重要的一块,这里简单对hash算法做一个说明。如果有理解不当的地方请及时指正。
讲hash算法之前先明确一个基础的计算机知识,计算机在底层机器码是采用二进制的模式,所谓二进制简单来说就是底层以0/1来标识,所有数据传输记录都以010101的模式来存储记录,两种状态也可认为就是一个日常生活中的开关,1标识开,0标识关。那么计算机中最小的数据单位也就是这里说的0或者1,这里我们称为bit(比特或者位),8个bit组成一个字节。当然计算机中也有八进制、十六进制的表示,这里暂时不展开讨论。只明确底层一个二进制的概念。
Hash算法将任意长度的二进制值映射为较短的固定长度的二进制值,这个小的二进制值称为哈希值。哈希值是一段数据唯一且极其紧凑的数值表示形式。如果散列一段明文而且哪怕只更改该段落的一个字母,随后的哈希都将产生不同的值。要找到散列为同一个值的两个不同的输入,在计算上是不可能的,所以数据的哈希值可以检验数据的完整性。一般用于快速查找和加密算法。
再引入一个hash表概念,计算机数据结构中,给定一个表M,关键字key,存在函数H(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为hash表。
简单理解hash算法就是这一种单向的加密,一个明文加密称为密文,不可逆推,只有加密过程,没有解密过程。说明了hash函数和hash表的概念,那么目前常用的hash算法有MD5(已被破解),SHA系列算法(比特币中使用sha-256算法)。SHA这里稍微提下(secure
algorithm)这不是一个算法,这是一个hash函数集,现在有sha-224、sha-256、sha-384、sha-512等算法。在09年中本聪设计比特币的时候,当时sha-256被认为最安全的算法之一,故选择了sha-256,到目前为止还没有被破解。
解释到这里,可能会联想到,hash算法中key在计算后如果出现了同一位置,冲突的产生,这里简单说下几种冲突处理,如有兴趣可以查看hash算法论文。
1.拉链法:这种方法可以完全避免冲突,将所有关键字为同义词的结点链接在同一个单链表中。若选定的散列表长度为m,则可将散列表定义为一个由m个头指针组成的指针数组t[0..m-1]。凡是散列地址为i的结点,均插入到以t为头指针的单链表中。t中各分量的初值均应为空指针。在拉链法中,装填因子α可以大于1,但一般均取α≤1。
2.多哈希法:设计两种以上的hash函数,避免冲突,这个感觉比较不靠谱,但是从概率上来说多种hash函数还是降低了冲突的出现。
3.开放地址法:开放地址法有一个公式:Hi=(H(key)+di)
MOD m i=1,2,...,k(k&=m-1),其中,m为哈希表的表长。di
是产生冲突的时候的增量序列。如果di值可能为1,2,3,...m-1,称线性探测再散列。如果di取1,则每次冲突之后,向后移动1个位置.如果di取值可能为1,-1,4,-4,9,-9,16,-16,...k*k,-k*k(k&=m/2),称二次探测再散列。如果di取值可能为伪随机数列。称伪随机探测再散列。
&&&&Hash算法函数根据分类:加法hash、位运算hash、乘法hash、除法hash、查表hash等。
参考百度百科说的比较抽象,有兴趣可以深入了解下。
结合区块链,在区块链中很多地方都用到了hash函数:
1.区块链中节点的地址、公钥、私钥的计算。以地址为例:公钥经过一次SHA256计算,再进行一次RIPEMD160计算,得到一个公钥哈希(20字节\160比特),添加版本信息,再来两次SHA256运算、取前4比特字节,放到哈希公钥加版本信息后,再经过base58编码,最终得到地址。
tree:是数据结构中的一种树结构,可以是二叉树,也可以是多叉树,他和数据结构中树的特点几乎一致,和普通树不同的是:merkle
tree上的叶节点存放hash计算后的hash值,非叶节点是其对应的子节点串联的字符串的hash值。用于区块头和SPV认证中。
3.比特币中的挖矿,工作量证明(pow),计算的其实就是一个nonce,当这个随机数和其他散列过的数据合并时,产生一个比规定目标小(target)值。挖矿也可以理解一种快速不可逆的计算。SHA256(SHA256(version
+ prev_hash + merkle_root + ntime + nbits + x )) &
4.比特币中的bloom
filter布隆过滤器,布隆过滤器基于hash函数的快速查找。解决了客户端检索的问题,原理是Bloom
filter可以快速判断出某检索值一定不存在于某个指定的集合,从而可以过滤掉大量无关数据,减少客户端不必要的下载量。
简单介绍了HASH算法,和区块链中用到的HASH算法,区块链是多个技术的结合,结合各自特点出现的一种新的技术架构,HASH算法和加密技术为区块链的自证信任化及安全控制提供了基础,算法的碰撞和现在量子计算的发展,之前在区块链的安全性的文章中笔者有过说明,技术不断发展,肯定会有更适合的技术保障应用的实现。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。比特币与密码学之哈希函数 | 巴比特
比特币与密码学之哈希函数
什么是哈希函数
Hash Function,音译为哈希函数,也称为散列函数或杂凑函数。哈希函数是一个公开函数,可以将任意长度的消息M映射成为一个长度较短且长度固定的值H(M),称H(M)为哈希值、散列值、杂凑值或者消息摘要。哈希函数满足以下三个性质:
消息M的任何改变都会导致哈希值H(M)发生改变;
在给定某个哈希函数H和哈希值H(M)的情况下,得出M在计算上是不可行的;
无碰撞性。即对于消息M1和哈希值H(M1),找到M2使得H(M2)= H(M1) 在计算上不可行(弱碰撞);或者,找到任意两个M1和M2使得H(M1)= H(M2) 在计算上不可行(强碰撞)。
所谓的“在计算上不可行”依据计算复杂度理论的说法,是指对于该运算不存在一个多项式时间算法,例如大数分解和离散对数问题。上述计算不可行是哈希函数安全性的基础,但是需要强调的是,常见的包括MD5和SHA系列在内的哈希函数的安全性是无法证明的,是另外一个概念。如果把一段消息比作一个人,这段消息的哈希值就是这个人的指纹,是这个人的独一无二的特征。
目前大多数哈希函数是基于异或和求模运算的多轮迭代结构,其输出也就是哈希值具有近似的伪随机特性。伪随机序列是由规则方法产生,其伪随机特性表现在统计特性和相关特性上。二元伪随机序列的统计特性包括:0和1出现的次数相差1次(元素分布),把n个元素连续出现叫做一个长度为n的元素游程,则序列中长度为n的元素游程比长度为n+1的元素游程多一倍(游程分布);伪随机序列的相关特性包括:自相关函数值为0,互相关函数值的绝对值接近Welch下限()。简单来讲,哈希值虽然并不完全满足上述伪随机定义,但其中的单个及多个元素出现的次数近似相等。例如:
SHA256(“The quick brown fox jumps over the lazy dog”)
0x d7a8fbb307dabcbdcdb762d02d0bf37c9e592
其中有125个0,131个1,长度6的游程1111分别有3个和1个,长度5的游程0分别有8个和6个,等等。
SHA256的输入为长度小于2^64比特的任意消息(必须是或者扩展成为512比特的倍数),输出长度为256比特的哈希值,使用异或等逻辑运算,以及平移、循环等置换方法,共经过64次迭代。理论上对于SHA256的攻击尝试从低迭代次数进行,例如对52次迭代SHA256的原相攻击和对46次迭代SHA256的碰撞攻击。关于SHA256算法的细节参见和。
哈希函数与工作量证明
在比特币协议中引入哈希函数,更重要的作用是解决双重花费的问题。一段比特币交易代码中的输入部分,代表了该交易的提出者对相应数额比特币的所有权,输出部分的代码代表指向接收者的比特币发送行为,这里暂且忽略比特币交易的找零机制。当巴比特大熊把自己的比特币发送给宋欢平时,在该交易完成之前,他又试图把同一段输入再发送给大猫,这时我们就面临如何避免让大熊把一份钱当两份花的问题,即双重花费问题。
在比特币协议中,网络节点检验大熊的交易是否正常的前提是,必须首先解决一个数学问题。这就是著名的工作量证明机制,以解决交易区块所携带的数学问题为基础,实现以问题的解换取检验交易的话语权,有效避免了僵尸节点对不合格交易的随意确认。当然,避免双重花费需要大量节点对该区块的检验结果达成共识,区块检验合格,那么区块包含的交易验证签名后也会通过,最终实现全网大账本的统一更新(更多解释请搜索区块链的确认和51%攻击)。由于大熊的交易的非法性,基于工作量证明机制的原理,找到足够多的网络节点使得这个不合格交易蒙混过关就变得极其困难。
工作量证明中的数学问题具体是什么呢?将网络中的一系列交易和大熊的交易一起打包成一个区块,区块自身有一个标记L(block_header),设x是一个32比特的随机数字,这个数学问题就是寻找x,使得Hash(L,x)的输出满足一定的要求,例如Hash(L,x)小于等于某个设定的门限值Target,Target代表问题难度,等价于所谓的,类似于SHA256的输出,是一个256比特长的0/1序列,等价于一个十进制数字,当前值为,比特币协议会根据网络算力的发展调整Target的大小,以保证区块确认的速度适中。哈希函数的三个性质和哈希值的伪随机特性决定了,寻找x是一个没有确定算法只能穷举的问题。
Hash(L,x)=SHA256(SHA256(block_header, nonce_x))
block_header=version+Merkel+nbits+ntime+pre_hash
Version是当前区块的版本号,该区块所包含的多个交易的Hash值构成区块的Merkel数据结构,nbits是当前比特币协议设定的计算复杂度,ntime是区块的时间戳,pre_hash是时间上距离当前最近的一个区块的Hash值,这在《解密比特币》书中也有提及。比特币相关文章中所说的Hash通常就是指Hash(L,x),但实际上Hash(L,x)是两次SHA256运算,需要能够区分这一点。挖矿即是指某个节点第一时间寻找到满足条件的随机数x后,成功获得了该区块内的第一笔名为coinbase交易中的比特币作为奖励,“挖到矿产”,也就是所说的比特币的生产或者发行。同上一段,比特币协议会每2016个区块调整一次Target的大小,控制比特币的发行速度,这样就可以实现将2100万枚比特币的发行持续到2140年的设计方案。
假设网络中的一个节点将最新收到的交易加入自己创建的新的区块中(从可以看到,每一个成功确认的区块所包含的交易的数量是不相同的),如果该节点的挖矿程序对该区块进行大量计算后未得到满足要求的随机数x,程序会通知节点重新创建区块,这时节点会选择更新上面的区块中的交易以及时间戳,再次交给挖矿程序进行随机数x的计算。又或者,挖矿程序尚在运算过程中时,获知一个新的区块已经被其他节点完成了数学问题的计算,区块得到了确认,那么它也必须立即停止,更新自己手中的区块包含的上一区块的Hash值pre_hash,重新构建新的区块,重新开始寻找x的计算。上述两种情况均描述了一次挖矿失败,
比特币全网算力以Hash/s为单位计算,是指比特币网络所有节点每秒钟共进行了多少次Hash运算,一次Hash(L,x)运算包括两次SHA256,所以1Hash/s相当于一秒钟进行了2次SHA256运算。有许多网站提供当前算力,例如。由BlockChain提供的数据显示当前算力已经接近10^5THash/s=100PHash/s,1T=10^12。据观察,各家估算结果的差异在1000 THash/s量级。在 和可以查看当前比特币网络的算力分布,不同的矿池各有特点,高Hashingrate矿池和低Hashingrate矿池的区别在于,在第二类矿池中挖矿时确认区块的速度慢,经常争不过前者,但是一旦完成区块确认则所获得的奖励比例会更大,参与两者挖矿的收益不分伯仲。
我们知道SHA256的输出是256个比特,那么所有的输出就有2^256种可能,于是,(2^256/Target)是一个区块得到确认(寻找到正确解)平均需要的Hash次数,由于寻找过程具有随机性,区块的出块速度可慢可快。根据相邻两个区块的时间戳,短则几分钟,慢的话有超过20分钟的。所以根据区块之间的时间差,以及当前比特币协议设定的难度,就可以估算出对应当前区块的算力。在设定的难度不变的时期内,根据最新的一批区块的生成时间,可以在统计意义上计算出当前时间段内的算力大小。
但是,这样对算力的解释仍然不够准确,比特币的代码显示,扩展后的block_header是128个字节,分成长度相等的两段进行SHA256运算,第二段的SHA256运算的前3次迭代不包括随机数x,最后2次迭代不影响最终Hash值的前面几位,于是这5次迭代运算对于寻找x是一种类似预处理的作用,在测试不同的x的计算过程中是相同的。所以Hash/s以SHA256的迭代次数为衡量标准更加可靠。
BTC: 19fZ5WVfhrDToC3ioMFY71D1ARXsQJu8MK
版权声明:
作者保留权利。文章为作者独立观点,不代表巴比特立场。
您需要登录后才可以回复
ea8e1de58bb3d7fdfc15f5fa4bfa9d4c000
有高人当面指教,求之不得[赞][赞][赞]
有高人当面指教,求之不得
完蛋了,昨晚上梦见个男的,想了一早上@短路的二极管Mumu
回复@沣述:[爱你]有机会能向您当面请教最好了。
回复@沣述:有机会能向您当面请教最好了。
我再修改一下 @那年的三月
[吃惊][吃惊][吃惊] 不能一点点基础都没有寄希望于一篇文章打通任督二脉吧
不能一点点基础都没有寄希望于一篇文章打通任督二脉吧
[汗][汗][挖鼻屎]//@那年的三月:写的太好了,完全看懂里面的每个字,然后到底说啥?
回复@那年的三月:[汗][汗][挖鼻屎]
回复@那年的三月:
写的太好了,完全看懂里面的每个字,然后到底说啥?
//@疯狂-BTC: 转发微博
回复@沣述:[哈哈]你研究的真专业!真要花点功夫,才能真看懂。。。
回复@沣述:你研究的真专业!真要花点功夫,才能真看懂。。。
忘记@你了[嘻嘻]
十分敬佩沣述 ,能把这些严谨、枯燥的数学知识,给我们娓娓道来。花点时间来理解一下,增一下见识。
多提意见大猫
谢谢沣述!!!我竟然看的有些懂了~~多学习几次就好~~
……….可以啊,等我看明白、融会贯通后,再来提意见吧。。。说实话,我目前对算法的理解,处于门外汉和入门的级别。
[挖鼻屎]哈希数学!谢谢分享!
《比特币与密码学之哈希函数》http://t.cn/RvJrn9P
哈希函数,也称为散列函数或杂凑函数。可以将任意长度的消息M映射成为一个长度较短且长度固定的值H(M),称H(M)为哈希值、散列值、杂凑值或者消息摘要。在比特币协议中引入哈希函数,更重要的作用是解决双重花费的问题。@沣述
//@比特币导航BitTOP100:转发微博
系列文章第三篇:《比特币与密码学之哈希函数》,http://t.cn/RvJrn9P @巴比特资讯 @魔力大熊比特币 哈希值_百度知道
比特币 哈希值
我有更好的答案
哈希算法将任意长度的二进制值映射为固定长度的较小二进制值,这个小的二进制值称为哈希值。哈希值是一段数据唯一且极其紧凑的数值表示形式。如果散列一段明文而且哪怕只更改该段落的一个字母,随后的哈希都将产生不同的值。要找到散列为同一个值的两个不同的输入,在计算上来说基本上是不可能的。消息身份验证代码 (MAC) 哈希函数通常与数字签名一起用于对数据进行签名,而消息检测代码 (MDC) 哈希函数则用于数据完整性。比特币全网的基本信息如下:所有需要挖矿的数字货币都是存在哈希值的,例如莱特币、瑞泰币、狗狗币、微盟币、点点币、元宝币等等。
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。比特币挖矿原理与算法
是的,你没有看错!七年之前,一枚比特币仅仅价值0.05美元;而仅仅七年之后,1000美元仅仅能买0.05个比特币而已。
币价如此疯涨,多少人为之癫狂!你是否还在懊悔自己没有早点上车,或者你还在瞻望要把哪个币收作囊中之物?更有甚者早已紧锣密鼓地开启挖矿之旅(或许他们认为这是目前最为安全的投资)。面对诱人的利益,盲目投机比特小编是极不提倡的,切忌投资自己不熟悉的东西,所以今天我们就来科普下比特币的挖矿原理,以及它的算法等知识吧。
比特币挖矿的原理
比特币是一本大账簿,它需要有人来记账,而记账的奖励就是比特币。而这个记账的权利是矿工们需要争取的,而抢夺记账权的形式就是挖矿。谁的算力大,谁就更有可能抢到这个记账权。
工欲善其事,必先利其器----挖矿需要的准备
Step1:要是一台算力合理的矿机以及匹配的电源系统,当然网线和电脑是必不可少的。
Step2:安装找IP软件(如已下载则跳过此步骤)
每台矿机都有自己的IP,需要配备软件才能识别出来,可以在比特大陆的官网-技术支持-设备支持 里上找到该软件,软件叫作IPReporter。(实在找不到的可以在评论里留言,我来发给您。)
Step3:准备自己的矿池、矿工号(如已注册则跳过此步骤)
如果没有自己的矿池号和矿工号,那就不能保证挖到的比特币都是到自己账户上了,所以准备这些是必须滴。在蚂蚁矿池官网注册一个自己的矿池账号,并创建一个矿工号。
比特币挖矿算法
可以说比特币的整个实现就是建立在已有的甚至存在多年的计算机科学领域里的技术或概念的整合,其中哈希算法在比特币中的应用几乎是方方面面,主要包括SHA256和RIPEMD160,比特币将这两个哈希算法的应用组合成两个函数:hash256(d)=sha256(sha256(d))和hash160(d)=ripemd160(sha256(d)),其中d为待哈希的字节数组,两者分别生成256位(32字节)和160位(20字节)的16进制数值。hash256主要用于生成标志符,如区块ID,交易ID等,而hash160主要用于生成比特币地址。
对于hash160比较认同的答案是ripemd160可以使得生成的地址更短,但是只做ripemd160一次哈希可能会存在安全漏洞所以同时使用sha256起到安全加固;至于hash256使用两次sha256哈希算法的原因来源于sha1算法,由于一次sha1哈希存在被生日攻击(birthday attack)的风险,所以当使用sha1运算时一种有效方式就是做两次sha1哈希,sha256本身并不存在生日攻击漏洞,但是防御性的使用两次sha256哈希借鉴于sha1.

我要回帖

更多关于 比特币的签名算法 的文章

 

随机推荐