Oracles

Oraclize CBOR 和 python3 CBOR 編碼之間明顯不匹配

  • April 30, 2018

我使用 Oraclize CBOR 庫編碼了一個值,如下所示:

   Buffer.buffer memory cborArgs;
   Buffer.init(cborArgs, 64);
   cborArgs.startArray();
   cborArgs.encodeUInt(10);
   cborArgs.endSequence();

產生:

\\xef\\xbf\\xbd\\\\n

但它似乎與python3中相同編碼的結果不匹配。

print(str(cbor2.dumps([10]))

生產

\x81\n

這是怎麼回事?

您可能想參考每個的十六進製表示。使用十六進製表示時,您會看到它們幾乎相同,不同之處僅在於 python 的 cbor2 定義了一個長度為 3 的靜態數組,而 cbor 庫僅使用動態大小的數組來提高效率和鏈上的適應性。兩者都符合 cbor 標準。

堅固性

   Buffer.buffer memory cborArgs;
   Buffer.init(cborArgs, 64);
   cborArgs.startArray();
   cborArgs.encodeUInt(1);
   cborArgs.encodeUInt(222);
   cborArgs.encodeUInt(9000);
   cborArgs.endSequence();
   debug(cborArgs.buf);

debug[ "0x9f0118de192328ff" ]

Python

import cbor2 import binascii print(binascii.b2a_hex(cbor2.dumps([1, 222, 9000])))

b'830118de192328'

如您所見,唯一的區別在於第一個字節,指定動態,而不是靜態的 3 元素數組。這反過來又需要一個額外的 FF 字節來終止它。

引用自:https://ethereum.stackexchange.com/questions/47001