簡體   English   中英

Scodec:將vectorOfN與vlong字段一起使用

[英]Scodec: Using vectorOfN with a vlong field

我在玩比特幣區塊鏈學習Scala和一些有用的庫。 目前,我正在嘗試使用SCodec解碼和編碼塊,而我的問題是vectorOfN函數將其大小視為Int。 如何在保留整個值范圍的同時使用長字段表示大小。 換句話說,是否有vectorOfLongN函數?

這是我的代碼,如果我使用vintL而不是vlongL可以很好地編譯:

object Block {
  implicit val codec: Codec[Block] = {
    ("header" | Codec[BlockHeader]) ::
    (("numTx" | vlongL) >>:~
      { numTx => ("transactions" | vectorOfN(provide(numTx), Codec[Transaction]) ).hlist })
  }.as[Block]
}

您可以假定已為Blockheader和事務實現了適當的編解碼器。 實際上,vlong可以簡化該問題,因為比特幣將自己的編解碼器用於可變大小的整數。

我不是scodec專家,但我的常識表明這是不可能的,因為Scala的VectorGenSeqLike的子類型,限於具有Int類型的length ,並且apply接受Int索引作為其參數。 而且AFAIU這個限制來自底層的JVM平台,在該平台上,數組的大小不能超過Integer.MAX_VALUE即大約2 ^ 31(另請參見“ Java的批判”維基 )。 並且盡管Vector理論上可以解決此限制,但是並沒有做到。 因此, vectorOfN不能支持Long size。

換句話說,如果您想要這樣的東西,您可能應該從創建自己的類似Vector的類開始,該類確實支持圍繞JVM限制的Long索引。

您可能想看一下scodec-stream ,當所有數據都不立即可用或不適合內存時,它會派上用場。

基本上,您將使用常規的codecs.X並通過scodec.stream.decode.many(normal_codec)將其轉換為StreamDecoder 這樣,您可以通過scodec數據,而無需將其完全加載到內存中。

一個StreamDecoder然后提供類似的方法decodeInputStream沿scodec's通常的decode

(前一陣子我在一個稍有不同的上下文中使用了它-解析客戶端發送到服務器的數據-但看起來它也適用於此)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM