Ist es sicher, abi.encodePacked im Produktionssoliditätscode zu verwenden?

In meinem Solidity-Spielprojekt verwende ich Folgendes:

if (king == keccak256(abi.encodePacked(player)){
   //continue as king
} else{
  // not king
}

Wobei Spielerdatentyp ist bytesund kingeine Spieleradresse ist. Sieht das gut aus oder könnte es ausgetrickst werden, wenn playeres durch Benutzereingaben gesteuert wird? Ich denke keccak256, würde es verhindern, oder?

kingist Typ address? Wenn ja, ist die Gleichheitsprüfung seltsam ... Beachten Sie auch, dass für denselben Wert keccak256(abi.encodePacked(player))immer dasselbe Ergebnis zurückgegeben wird. playerWenn der Benutzer den playerWert direkt steuern kann, kann auch die Gleichheit gesteuert werden. Im Allgemeinen verhält es sich abi.encodePackedjedoch einwandfrei und kann in Produktionssystemen verwendet werden.
@ShawnTabrizi, kingist vom Typ byte32. Hm, aber sagen wir, selbst wenn der Benutzer den Wert von kennt, kingobwohl es sich um eine private Variable handelt. Dann können sie einen Wert immer noch nicht so steuern player, dass keccak256 genauso zurückgibt. Oder doch?
Ich weiß nicht. Sie haben keine Details darüber angegeben, wie der playerWert festgelegt wird ...
Es ist nicht deterministisch, es ist wie first2byteof_contractaddr+<24_digit_hex_seed>+remainingbyteof_contractaddrwo contractaddr == erzeugte Vertragsadresse @ShawnTabrizi

Antworten (1)

Die Funktion abi.encodePacked()verkettet nur ihre Eingabedaten in einem Bytes-Array im Speicher, sie transformiert die Daten in keiner Weise. Daher ist die Verwendung im Produktionscode absolut sicher.

Die Funktion keccak256()ist eine kryptografische Hash-Funktion . Eine seiner Eigenschaften ist, dass es rechnerisch schwierig ist, ein Urbild zu finden, dh es kingist in der Praxis unmöglich, den Wert von zu finden player.