我正在尝试构建一个小型完整节点,这样我就可以准确地了解它们是如何运行的。我已经设法让P2P api的一些部分工作,但是我仍然坚持基本的东西,比如“getblocks”和“getheaders”
例如,我对以下块哈希感兴趣:
块\u hash=“000000000000592589e55cda6e8a093998e8356ea770d4aaeb7c0f5439b147d7”
block_stop=“000000000000017a09017d52db538d7a9ddcc48311866d7e5fdbbbec7d0faad5”
命令:getblocks
请求:0B110907676574626C6F636B7300000040000002A0AF995010000000100000000000592589E55CDA6E8A093998E8356EA770D4AAEB7C0F5439B147D70000000000017A09017D52DB538D7A9DDCC48311866D7E5FDBBB7D0FAAD5
我的问题是:当停止散列距离块定位器只有1个块时,为什么我要取回500个inv项目(顺便说一句,当我使用getheaders而不是getblocks时,同样的事情也会发生在我身上)
编辑
好的,我已经交换了我发送的数据的尾端。我还必须交换块定位器并停止,以便得到响应(因此停止散列位于比定位器低的块高度),这让我觉得我在这里犯了更多的错误。
在执行此操作时,在上面的示例中,我仍然收到500 inv,但是如果改用这两个:
block_stop=“0000000000000049a7ce260de7fcf63f34acf3fe1c5b2040ae77b9bdaf1abb38”
块\u hash=“000000000000013d8a77f222805b1dca31d0fb48d60b29098c77609de5f93811
实际消息:0B110907676574626C6F636B730000004000000A83C12F9010000001138F9E59D60778C09290BD648FBD031CA1DB8022F2778A3D010000000000038BB1AAFBDB977AE40205B1CFF3343FF6FCE70D26CEA7490000000000000
它正确地从我需要的高度返回,但是它返回所有的块,直到最新的块,而不是我要找的块。我误解了这个API的意义吗?我的印象是它返回块细节,但它只是返回丢失的块哈希。那我怎么才能知道那个街区发生了什么交易?
比特币核心
完整节点
点对点
分享
改进这个问题
跟随
编辑时间:19年12月27日17:03
麻吉弟弟周立铭♦
52.8k44金徽章5555银徽章106106铜徽章
问到19年12月27日2点04分
迪米特里
2144枚青铜徽章
你能更新一下你发送的确切信息吗麻吉弟弟周立铭♦ 19年12月27日5:29
完成时间:AndrewShow–Dimitree 19年12月27日11:49
添加评论
1个答案
看起来块哈希的字节顺序不对。它们是按显示字节顺序显示的,但是网络实际上是按相反的字节顺序处理块哈希,0在末尾。
我认为你得到的回应也将是区块链的前500个区块。
所以发生的是一个节点看到了你的开始散列,却没有在你的区块链中找到它,所以它从genesis块开始。它继续查找每个块,发现没有找到停止散列。这既可能是因为停止哈希的字节顺序错误,也可能是因为它是从genesis开始的,而不是从start哈希开始的。
因此,您得到的响应是从genesis块开始的最多500个块,genesis块是您的开始哈希和它的当前提示之间最新的共同祖先。
我误解了这个API的意义吗?我的印象是它返回块细节,但它只是返回丢失的块哈希。那我怎么才能知道那个街区发生了什么交易?
getblocks获取块散列。要获得实际的块本身,需要将getdata与收到的哈希一起使用。
分享
改进这个答案
跟随
编辑时间:19年12月27日5:31
回复时间:19年12月27日4:10
麻吉弟弟周立铭♦
52.8k44金徽章5555银徽章106106铜徽章
谢谢你!我已经根据这个答案更新了我的问题的更多细节。我差不多就要回答这个问题了,但现在我比开始时更困惑了迪米特里19年12月27日5:12
添加评论