Ich möchte einen öffentlichen Schlüssel einer Ethereum-Adresse in einem Vertrag speichern. Was ist der empfohlene primitive Datentyp zum Speichern eines öffentlichen Schlüssels?
Vielen Dank!
Speichern Sie Schlüssel immer als Bytes, da Zeichenfolgen in einigen Sprachen bekanntermaßen durch Nullwert-Bytes abgeschlossen werden. Sie können ein bytes32- Attribut verwenden, um den Schlüssel zu speichern, und eine Getter-Methode, um ihn aus dem bereitgestellten (instanziierten) Vertrag abzurufen:
contract PubKey {
bytes32 pubKey;
function PubKey(bytes32 initKey) {
pubKey = initKey;
}
function getPubKey() constant returns (bytes32) {
return pubKey;
}
}
Bearbeiten:
Der öffentliche Schlüssel ist ohne sein Präfix 64 Bytes lang :
contract PubKey {
uint8[] pubKeyBytes;
function PubKey(uint8[] initKey) {
for(uint i = 0; i < initKey.length; i++) {
pubKeyBytes.push(initKey[i]);
}
}
function getPubKeyByte(uint i) constant returns (uint) {
return pubKeyBytes[i];
}
Dies ist teuer, da jeder Abruf des öffentlichen Schlüssels 64 Mal aufgerufen werden muss. Die Verwendung von zwei 32-Byte-Blöcken ist billiger (aber hässlicher):
contract PubKey {
bytes32 pubKeyHalf1, pubKeyHalf2;
function PubKey(bytes32 initKeyHalf1, bytes32 initKeyHalf2) {
pubKeyHalf1 = initKeyHalf1;
pubKeyHalf2 = initKeyHalf2;
}
function getPubKeyHalf1() constant returns (bytes32) {
return pubKeyHalf1;
}
function getPubKeyHalf2() constant returns (bytes32) {
return pubKeyHalf2;
}
}
Sie können den öffentlichen Schlüssel auch in einer Variablen speichern bytes
, aber das wird mehr Gas verbrauchen. In meinem einfachen Test verbraucht das Speichern eines öffentlichen Schlüssels in zwei bytes32
Variablen ~ 67.000 Gas und das Speichern in einer bytes
Variablen ~ 85.000 Gas
Äthergesichter
Niksmac
Sebi
Äthergesichter
Sebi
jMyles
Sebi
Jaspis
jMyles