Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将长度为32[]字节的nonce从golang编码为hit rust';s jormungandr rpc服务器?_Go_Cardano - Fatal编程技术网

如何将长度为32[]字节的nonce从golang编码为hit rust';s jormungandr rpc服务器?

如何将长度为32[]字节的nonce从golang编码为hit rust';s jormungandr rpc服务器?,go,cardano,Go,Cardano,如果您看看go cardano客户端是如何实现握手请求有效负载的: 但grpc生成的结构是: type HandshakeRequest struct { // Nonce for the server to authenticate its node ID with. Nonce []byte `protobuf:"bytes,1,opt,name=nonce,proto3" json:"nonce,omitempty"` } 对于引用的no

如果您看看go cardano客户端是如何实现握手请求有效负载的:

但grpc生成的结构是:

type HandshakeRequest struct {
  // Nonce for the server to authenticate its node ID with.
  Nonce []byte `protobuf:"bytes,1,opt,name=nonce,proto3" json:"nonce,omitempty"`
}
对于引用的
nonce
,需要通过这个[]字节:

它的长度是32:

因此,在golang代码中的这一行:

  versionTable.Add(cbor.NewPositiveInteger8(1), cbor.NewPositiveInteger(764824073))
长度不能为32[]字节,对吗?如何对其进行编码:

  req := HandshakeRequest{}
  req.Nonce = []byte{}
  for i := 0; i < 32; i++ {
    req.Nonce = append(req.Nonce, byte(rand.Intn(256)))
  }
req:=握手请求{}
req.Nonce=[]字节{}
对于i:=0;i<32;i++{
req.Nonce=append(req.Nonce,字节(rand.Intn(256)))
}
进入这个版本表“params”


编辑:您似乎认为来自
gocardano/go cardano客户端的握手
node.proto
中描述的握手在某种程度上与相同的实现相关。事实上,我认为他们没有

基于TCP的握手遵循Shelley协议规范,并使用编码的
versionTable
发送有效负载。正如您所考虑的,基于gRPC的握手请求只是暂时的。proto模式中没有任何东西提示Shelley协议。
Nonce
字段上的注释也非常明确地指出:“服务器对其节点ID进行身份验证的Nonce。”

因此,假设这个nonce和
versionTable
负载有任何共同点,这将有点奇怪

编辑2:此外,“Jormungandr”rust节点实现似乎根本不支持Shelley,因此当您说无法连接到中的节点时,我认为您不应该在Jormungandr存储库中查找答案。相反,我认为中继运行的是的Haskell实现

至于为什么你不能连接,
go cardano
客户端对一些未检查的类型断言感到恐慌,因为在
queryip
Shelley message
chainSyncBlocks.RequestNext
之后,中继服务器会用不同的迷你协议响应,
transactionSubmission.msgRequestTxIds
如使用TCP运行客户端并跟踪消息所示:

MiniProtocol: 4 / MessageMode: 1 / f1bb7f80800400058400f50003
Array: [4]
  PositiveInteger8(0)
  False
  PositiveInteger8(0)
  PositiveInteger8(3)
使用MiniProtocol
2
ChainSyncHeaders
)发送同步链请求时,也会得到相同的结果。我检查了Shelley协议规范,但找不到关于服务器为什么要切换协议的明确指示。。。不幸的是,我对哈斯克尔不够熟悉,无法从大毒蛇的资料中获得进一步的了解


在协议
握手请求中的nonce确实与Shelley协议相关的意外情况下,其内容可能是链接的Cardano客户端中的CBOR数组(推测如下):

通过检查使用握手请求的客户端,我们可以看到:

messageResponse, err := c.queryNode(multiplex.MiniProtocolIDMuxControl, handshakeRequest())
然后在
queryNode
中:

sdu := multiplex.NewServiceDataUnit(miniProtocol, multiplex.MessageModeInitiator, dataItems)
...
c.socket.Write(sdu.Bytes())
sdu.Bytes()
方法序列化整个有效负载,特别是:

// EncodeList return CBOR representation for each item in the list
func EncodeList(list []DataItem) []byte {
    result := []byte{}
    for _, item := range list {
        result = append(result, item.EncodeCBOR()...)
    }
    return result
}
EncodeCBOR()。注意,握手函数返回一个切片
[]cbor.DataItem
,其中包含一个
数组
项,该数组包含
握手消息建议
版本表
映射

如果仔细遵循序列化的过程,最终将获得字节数组的分解结果(以下以十进制表示):

[130 0 163 1 26 45 150 74 9 25 128 2 26 45 150 74 9 25 128 3 26 45 150 74 9]
其中:

  • 130是数组数据项前缀
  • 0是握手消息提议
  • 163是地图数据项前缀
  • 随后的字节是
    versionTable
    映射

  • 总共是25个字节。此时,我不知道内置在
    queryNode
    函数中的多路复用包装器是否是nonce的一部分。使用完整包装器时,序列化字节数组的长度将增加到33。因此,排除一些控制位或诸如此类的内容,这可能是您应该写入
    握手请求中的内容。Nonce

    rs客户端生成长度为32个Nonce的随机字节,并将它们发送到服务器。使用加密的nonce进行服务器响应。所以,您要做的是生成32位的nonce?我们从中选择一个随机ip:port地址,并与TCP连接。每次我尝试这个,我都无法成功地完成握手。我似乎从来没有回复过握手请求,也从来没有正确地发送过握手请求。啊哈!也许我们现在有进展了。是的,我是!我同意也许我不应该这样。所以,当我通过普通TCP连接时,我会发送这个神奇的764824073号码,告诉对方,我准备好迎接雪莱了吗?(之前的协议名为Byron,我想它有一个不同的硬编码幻数。)所以在我发送764824073后,我也从另一端返回764824073,然后呢?这适用于与客户端运行在同一台计算机上的本地节点,但当我尝试使用任何来自的随机节点时,我从未让C.QueryTip起作用。哦,也许这是他们shelly缺少的“客户授权”步骤。。。但客户端身份验证要求我从握手响应中获取值,比如节点id、sig等,而我从来没有这样做过。我只发送那个神奇的号码,然后取回同样的神奇号码。我放弃了rust(jormungandr)cardano,搬到了他们官方的haskell回购(cardano节点)。Haskell代码最先出现,我认为锈迹只是一个端口。我在运行jormungandr方面没有取得任何成功,但这篇文章非常完美。非常好的信息,谢谢!但问题是,如果整个事件都是nonce,它的硬代码是764824073,那么这到底是一个nonce吗?764824073这个数字应该是随机的还是总是相同的?
    // EncodeList return CBOR representation for each item in the list
    func EncodeList(list []DataItem) []byte {
        result := []byte{}
        for _, item := range list {
            result = append(result, item.EncodeCBOR()...)
        }
        return result
    }
    
    [130 0 163 1 26 45 150 74 9 25 128 2 26 45 150 74 9 25 128 3 26 45 150 74 9]