Welchen Datentyp sollte ich für einen IPFS-Adress-Hash verwenden?

Hier ist ein IPFS-Hash: QmTfCejgo2wTwqnDJs8Lu1pCNeCrCDuE4GAwkna93zdd7d. Laut IPFS-Dokumentation sind sie base58-codiert, und ich gehe davon aus, dass Qmes sich um Metadaten handelt (weil sie alle diese teilen).

Was ist der effektivste Datentyp, um einen davon zu speichern?

Bearbeiten: Sie beginnen nicht alle mitQm

Siehe die Antwort dieser fast doppelten Frage mit hervorragenden Informationen zu Hashes, Hash-Funktionen und einigen alternativen Solidity-Speichermethoden ethereum.stackexchange.com/a/17112/3344

Antworten (2)

bytesweil sie mehr als 32 Bytes sind. Ein IPFS-Hash:

selbst spezifiziert die Hash-Funktion und die Länge des Hashs in den ersten zwei Bytes des Multihashs. In den obigen Beispielen sind die ersten beiden Bytes in Hex 1220, wobei 12 angibt, dass dies die SHA256-Hash-Funktion ist, und 20 die Länge des Hashs in Bytes ist – 32 Bytes.

Quelle

Obwohl SHA2-256 32 Bytes groß ist und derzeit der häufigste IPFS-Hash ist, könnten andere Inhalte eine Hash-Funktion verwenden, die größer als 32 Bytes ist.

Ich bin mir sicher, dass dies die richtige Antwort für den allgemeinen Fall ist, aber wenn der Hash von Ihrer eigenen Software erstellt wird (dh Sie müssen keine beliebigen IPFS-Inhalte unterstützen), kann es ein Argument dafür geben, sich für die Verwendung von 32-Byte-SHA2- 256-Hashes und Entfernen der Multihash-Identifikation 1220, da Arrays eine PITA sind, mit der man in Solidity arbeiten kann, und in der Praxis wird jeder die Blockchain nur mit 1220s füllen.
Stimmen Sie sicherlich einigen Typen über PITA zu. Wir sollten uns daran erinnern, dass IPFS Zukunftssicherheit (wie github.com/multiformats/multihash ) sehr schätzt. Vielleicht könnte eine Bibliothek helfen, da "es auch möglich ist, elementare Typen zu erweitern" .

Sie können jeden IPFS-Hash in bytes32 speichern.
Sie benötigen das cidsnpm-Paket.

Beispiel:

export function IpfsHashToBytes32(hash: string)
{
    return new CID(hash).toV0().multihash.subarray(2)
}

export function bytes32ToIpfsHash(bytes: Uint8Array)
{
    return new CID(new Uint8Array([18, 32, ...bytes])).toString()
}

Die ersten beiden Bytes sind Hash-Versionspräfixe, Sie brauchen sie also nicht.