In meinem Solidity-Spielprojekt verwende ich Folgendes:
if (king == keccak256(abi.encodePacked(player)){
//continue as king
} else{
// not king
}
Wobei Spielerdatentyp ist bytes
und king
eine Spieleradresse ist. Sieht das gut aus oder könnte es ausgetrickst werden, wenn player
es durch Benutzereingaben gesteuert wird? Ich denke keccak256
, würde es verhindern, oder?
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 king
ist in der Praxis unmöglich, den Wert von zu finden player
.
Shawn Tabrizi
king
ist Typaddress
? Wenn ja, ist die Gleichheitsprüfung seltsam ... Beachten Sie auch, dass für denselben Wertkeccak256(abi.encodePacked(player))
immer dasselbe Ergebnis zurückgegeben wird.player
Wenn der Benutzer denplayer
Wert direkt steuern kann, kann auch die Gleichheit gesteuert werden. Im Allgemeinen verhält es sichabi.encodePacked
jedoch einwandfrei und kann in Produktionssystemen verwendet werden.Werbekopf
king
ist vom Typbyte32
. Hm, aber sagen wir, selbst wenn der Benutzer den Wert von kennt,king
obwohl es sich um eine private Variable handelt. Dann können sie einen Wert immer noch nicht so steuernplayer
, dass keccak256 genauso zurückgibt. Oder doch?Shawn Tabrizi
player
Wert festgelegt wird ...Werbekopf
first2byteof_contractaddr+<24_digit_hex_seed>+remainingbyteof_contractaddr
wo contractaddr == erzeugte Vertragsadresse @ShawnTabrizi