Что я делаю неправильно при воспроизведении дайджеста ha sh CID в ipfs dag-cbor - PullRequest
0 голосов
/ 26 апреля 2020

Этот вопрос похож на на , то есть о том, как вычисляется дайджест ha sh в формате MerkleDag (dag-pb) на основе ProtoBuf. Так как ipfs dag заменит ipfs object, и CBOR будет поддерживаться, здесь я хочу спросить подобное о dag-cbor. Я попытался найти ответ в документации IPFS, но не получил много информации.

Поэтому я сделал следующее.

$ echo '[0,1,2,3]' | ipfs dag put

Это дает CID bafyreidiu4acrauzpzhefghkkom6pbbsvw34o7kc2trpnqd7l62yrxrv2q. В веб-интерфейсе IPFS CID разрешается как

bafyreidiu4acrauzpzhefghkkom6pbbsvw34o7kc2trpnqd7l62yrxrv2q
base32 - cidv1 - dag-cbor - sha2-256-256-68a7002882997e4e4298ea5399e78432adb7c77d42d4e2f6c07f5fb588de35d4
BASE - VERSION - CODEC - MULTIHASH
MULTIHASH
0x122068a7002882997e4e4298ea5399e78432
      adb7c77d42d4e2f6c07f5fb588de35d4
HASH DIGEST
0x12 = sha2-256
0x20 = 256 bits

Я ожидаю, что [0,1,2,3] сначала сериализуется CBOR как массив CBOR, а затем переваривается sha256. Поэтому я хочу воспроизвести дайджест ха sh (68a700288299...). Поэтому я сделал следующее в ответе Python:

>>> from cbor2 import dumps
>>> from hashlib import sha256
>>> from binascii import hexlify
>>> hexlify(sha256(dumps([0,1,2,3])).digest())
b'e3fbd65c4c3f7fdba7b8ae0709da781c3637b13f4a4b920db90d2f9b23d412ff'

Так что ha sh не может сравниться. Но если я сделаю то же самое для простого строкового объекта, например,

$ echo '"Hello World"' | ipfs dag put
bafyreidfq7gnjnpi7hllpwowrphojoy6hgdgrsgitbnbpty6f2yirqhkom

, дайджест ha sh, в этом случае, может быть успешно воспроизведен.

Так почему это не так? не работает для объекта массива (объекты карты также не работают)? Что еще скрывается?

Ответы [ 2 ]

0 голосов
/ 26 апреля 2020

Я наконец нашел github.com / ipfs / go -ipfs / Issues / 6549 . Это потому, что go -ipfs анализирует [0,1,2,3] как float64. Так что в Python, если я изменю его на [0.0, 1.0, 2.0, 3.0], два значения ha sh будут идеально совпадать! Вот почему простая строка работает.

0 голосов
/ 26 апреля 2020

Я не уверен, но это может быть неправильное представление типа данных в Python. Вы пробовали вместо этого кортеж?

...