So konvertieren Sie ein Byte-Array in Solidity in Bytes32

Ich möchte die Syntax kennen, um ein Byte-Array solide in Bytes32 zu konvertieren.

Dies ist eine Fortsetzung der Frage: Wie speichert man den öffentlichen Schlüssel im Ethereum-Vertrag?

Ich möchte den als Byte-Array gespeicherten PublicKey abrufen.

Bitte teilen Sie mir mit, wie dies erreicht werden könnte.

Vielen Dank.

Antworten (4)

Hier ist eine Möglichkeit, bytes32 aus einem Bytes-Array zu extrahieren:

function bytesToBytes32(bytes b, uint offset) private pure returns (bytes32) {
  bytes32 out;

  for (uint i = 0; i < 32; i++) {
    out |= bytes32(b[offset + i] & 0xFF) >> (i * 8);
  }
  return out;
}
Was geben wir als Offset ein?
Das erste zu kopierende Byte. Wenn Sie das Ganze kopieren möchten, verwenden Sie 0.
Warum wird hier "& 0xFF" verwendet? Ist das nicht nur nützlich, wenn Sie den Wert des ersten Bytes eines Multibyte-Werts erhalten? b[Offset + i] ist ein einzelnes Byte.
Ich sehe nirgendwo in den Solidity-Dokumenten, die angeben, ob Bytes vorzeichenbehaftet oder vorzeichenlos sind, obwohl die Dokumente zu implizieren scheinen, dass sie vorzeichenlos sind, weil sie sagen: "Ganzzahlen ohne Vorzeichen können in Bytes gleicher oder größerer Größe konvertiert werden, aber nicht und umgekehrt". Die Frage ist also, ob die Konvertierung eines Byte-Werts in einen Byte32-Wert eine Vorzeichenerweiterung bewirkt. Die Dokumente sind in anderen Punkten der Sprachsemantik nicht klar.

Sie können bytes32 direkt im Konstruktor des Vertrags verwenden und dann das Attribut über einen Getter abrufen :

contract PubKey {
         bytes32 pubKey;

         function PubKey(bytes32 initKey) {
             pubKey = initKey;
         }

         function getPubKey() constant returns (bytes32) {

            return pubKey;

         }
    }

Sehen Sie sich auch diese Frage an, um Details zur Typkonvertierung in Solidität zu erhalten.

.

Anscheinend funktioniert string(bytesString), aber bytes32(bytesString) funktioniert nicht.
Denken Sie, dass es am besten wäre, den öffentlichen Schlüssel im Hex-Format (uint256) zu speichern? Lass mich wissen was du denkst.
Ich habe die Antwort geändert. Sie können bytes32 direkt verwenden.
bytes memory toBeConvert = "xxxxx";
bytes32 converted;

assembly {
    encoded := mload(add(result, 32))
}

Wenn Sie nur die Konvertierung durchführen möchten, versuchen Sie dies. Stellen Sie jedoch sicher, dass Sie require in der Produktionsumgebung hinzufügen.

Sie können die Daten aufteilen, wenn sie in den Anrufdaten enthalten sind:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;

contract Slice {
    function bytesToBytes32(bytes calldata b) external pure returns (bytes32) {
        return bytes32(b[:32]);
    }
}