刚开始研究比特币。
我想能够从比特币网络下载一个块。
这应该是一个老街区,已经被开采了,我知道现在的情况。
然后,我想通过bash linux命令来验证这样的nonce是否解决了这个块。
多亏了这里的一个问题,我知道我可以看看
https://blockchain.info/block-height/474044?format=json
不管这是JSON,我想我不能用它来验证nonce。
因此我的问题是:
如何下载块?
这种块的文件格式是什么?
我可以从nonce字段的哪个字节开始递增,例如用Python脚本?
一旦我把正确的(和已知的:))nonce如何才能验证块已解决?我的意思是,它的散列应该以很多零开始,我能把块当作字符串直接传递给python hashlib函数吗?
提前谢谢。
区块链.info
块
采矿理论
分享
改进这个问题
跟随
7月3日17:31问
杰奎琳。马奎德
23533银徽章66铜徽章
添加评论
5个答案
10
不管这是JSON,我想我不能用它来验证nonce。
你可以。您可以使用JSON对象开头的数据构建块头,然后对其进行散列。当然,获取块hex会更容易,您可以通过访问blockchain.info上的块散列并将?format=hex附加到url来获取。例如,对于链接的块高度,可以在此处找到该块的十六进制:https://blockchain.info/block/000000000000000000ff265a641721e79bbc559d8b0e4894332732109f1a3383?format=hex
如何下载块?
去拿六角扳手。这是块本身的原始数据。你可以把十六进制放在一个十六进制编辑器里,或者把十六进制保存成一个字符串放在一个文本文件里。
这种块的文件格式是什么?
块没有文件格式。它们只是二进制数据的一小部分,您需要了解如何解析它们。https://bitcoin.org/en/developer-reference#serialized-块解释块序列化。
我可以从nonce字段的哪个字节开始递增,例如用Python脚本?
散列的部分是块头,即块的前80个字节。nonce是该头的最后4个字节。您可以在此处阅读有关块头格式的信息:https://bitcoin.org/en/developer-reference#block-标题
一旦我把正确的(和已知的:))nonce如何才能验证块已解决?我的意思是,它的散列应该以很多零开始,我能把块当作字符串直接传递给python hashlib函数吗?
不。块头不是字符串。它是一个二进制数据块。在python中,最简单的方法是将其设为bytes对象,然后将其传递给hashlib。
如果块的工作证明是有效的(请注意,这并不意味着块本身是有效的),那么在使用SHA256 Double对其进行哈希运算之后,将输出视为整数,并将其与头的nBits字段进行比较。nBits字段是一个4字节的字段,从头的末尾开始8个字节,是目标的紧凑表示。您可以在这里阅读如何解释:https://bitcoin.org/en/developer-reference#target-nbits公司。块哈希(视为大整数)必须小于nBits字段指定的目标。
分享
改进这个答案
跟随
7月3日17:42回答
麻吉弟弟周立铭♦
53.7k44金徽章5656银徽章10110铜徽章
你打败了我Penquin 7月3日17:51
添加评论
4.
下载一个区块很容易!这里是一个带有特定块的联机资源管理器的链接,出于实验目的,我建议以原始十六进制格式(或二进制)存储该块。
块没有预定义的文件格式。比特币协议对这些块强制执行一种格式,但它们如何在本地存储并不重要。但是,比特币核心将其块存储在blkxxxxx.dat文件中。。LevelDB(.ldb)文件包含有关存储在blkxxxxx.dat文件中的比特币块的元数据和索引信息。由每个不同的比特币实现自行决定如何存储这些块。
尝试手动解码我上面发布的URL中的块。此页面包含使其工作所需的所有提示。nonce是4个字节,前面有76个字节的数据,因此77字节到80字节是nonce。值得注意的是,也在blockheader的末尾(=前80个字节)。
感谢“伪君子”指出错误的评论。
分享
改进这个答案
跟随
编辑时间:2018年5月22日22:13
7月3日17:49回答
潘昆
65133银牌1515铜牌
1.
需要修正企鹅2号的反应。比特币核心将比特币块存储在.dat文件(blkxxxxx.dat)中。LevelDB(.ldb)文件包含有关存储在blkxxxxx.dat文件中的比特币块的元数据和索引信息。en.bitcoin.it/wiki/Data\u目录–伪善2018年5月20日3:31
添加评论
3.
下面是如何从命令行检查散列。您需要xxd套餐;命令xxd-r-p将十六进制字符串转换为其原始等效字符串(例如,两个字节“5a”变为单字节0x5a)。
wget-q-O-‘https://blockchain.info/block/000000000000000000ff265a641721e79bbc559d8b0e4894332732109f1a3383?format=hex’ \
|xxd-r-p |头部-c 80 | sha256sum-|切割-d”’-f 1\
|xxd-r-p | sha256sum-| cut-d”’-f 1 |版次
分享
改进这个答案
跟随
7月3日17:01回答
内特·埃尔德雷奇
22.4k33金徽章3737银徽章8080铜徽章
添加评论
1.
这是对Nate提议的“注释”(添加注释会破坏换行符和代码格式)。
如果没有xxd,您可以这样做:
cat myfile|with|hexchars | tr[:upper:][:lower:]>myfile|with|hexcode
结果=$(cat myfile,带有十六进制代码sed的/[[:xdigit:]\{2\}/\\x&/g’)
printf$result>myfile\u十六进制
任何十六进制编辑器都有助于查看结果,例如:
hexdump-C myfile\u hex文件
分享
改进这个答案
跟随
我认为这应该是一个完整的答案,或编辑内特的答案添加它。如果你想让它成为一个完整的答案,我认为你只需要重新创建一小部分内特的帖子,你可以从以下几句话开始:“灵感来自内特的答案,你可以使用下面的代码来解决同样的问题,而无需安装软件包xxd…”–Murch♦ 2017年10月22日21:07
UUOC,你不需要tr;[:xdigit:]和printf\x处理这两种情况。事实上,只有在输入完全是十六进制对的情况下,这才是正确的,所以您只需执行printf$(sed’s/./\\&/g'<hexfile)>outfile–dave\u thompson\u 085 Oct 25’17 at 6:49
thx,我可以这样做:printf$(sed’s/[[:xdigit:]\{2\}/\\x&/g'<hexfile)–pebwindkraft 11月1日17日7:54
添加评论
0
接受答案中给出的blockchain.com链接不再有效。
从发布的API
https://blockchain.info/api/blockchain_api
下载十六进制格式块所需的URL如下所示。
https://blockchain.info/rawblock/$block\u哈希
这给你一个十六进制格式的文件,可以转换成二进制与xxd-r-p如上所述。
比特币块头非常简单。
https://en.bitcoin.it/wiki/Protocol_documentation#Block_Headers |大小|描述|类型|注释| |–|–|–|–| | 4 |版本| int32 |块版本信息(注意,这是有符号的)| | 32 | prev | block | char[32]|上一个块的哈希值此特定块引用| | 32 | merkle | u root | char[32]|对merkle树集合的引用,该集合是与此块相关的所有事务的哈希| | 4 | timestamp | uint32 | t |创建此块时的时间戳记录(将溢出)在2106[2]中| | 4 | bits | uint32 | u t |用于此块的计算难度目标| | 4 | nonce | uint32 | u t |用于生成此块的nonce…以允许标头的变化并计算不同的哈希|
要查看nonce:
>>>data=open(’block.bin’,’rb’).read()
>>>nonce=数据[4+32+32+4+4:][:4]
>>>nonce.hex()
‘6d1daf7b’
要计算标头的哈希代码:
>>>导入hashlib
>>>从binascii导入unhexlify,hexlify
>>>标题=数据[:4+32+32+4+4+4]
>>>hash=hashlib.sha256(hashlib.sha256(header.digest()).digest()
>>>十六进制(哈希)解码(“utf-8”)
‘83331A9F103227339480E8B9D55BC9BE72117645A26FF000000000000000000000000’
>>>十六进制(哈希[::-1])。解码(“utf-8”)
‘000000000000000000ff265a641721e79bbc559d8b0e4894332732109f1a3383’
以上内容来自:
https://en.bitcoin.it/wiki/Block_hashing_algorithm
以下由Andrej karphy’s撰写的博客文章提供了有关如何验证块中的事务的更多信息。
https://karpathy.github.io/2021/06/21/blockchain/
分享
改进这个答案
跟随