pragma solidity ^0.4.11;
contract test2
{
address creater;
string username;
string password;
function testusernamepassword(string username,string password) returns (bool)
{
if (username == "deepak" && password == "123") //error: operator == is not compatible with string ?
{
return true;
}
else
{
return false;
}
}
}
Sie können Zeichenfolgen wie folgt vergleichen:
function compareStrings(string memory a, string memory b) public view returns (bool) {
return (keccak256(abi.encodePacked((a))) == keccak256(abi.encodePacked((b))));
}
Als Randnotiz: Es ist überhaupt nicht sicher, mit Passwörtern und Benutzernamen in Solidity umzugehen.
Hier ist der einfachste Weg:
keccak256(bytes(a)) == keccak256(bytes(b));
Verwenden Sie einfach keccak256()
beim Konvertieren der Zeichenfolge in bytes
.
keccak256(bytes(a)) == keccak256(bytes(""));
funktioniert nicht. Besser: string memory empty = "";
dannkeccak256(bytes(a)) == keccak256(bytes(empty));
length
damit vergleichenbytes(<your-string>).length == 0
Scheint ziemlich teuer für Saiten mit einer anderen Länge zu sein, was die meiste Zeit sein könnte. Was ist mit dieser Lösung?
function memcmp(bytes memory a, bytes memory b) internal pure returns(bool){
return (a.length == b.length) && (keccak256(a) == keccak256(b));
}
function strcmp(string memory a, string memory b) internal pure returns(bool){
return memcmp(bytes(a), bytes(b));
}
Strings sind nicht wirklich ein primitiver Typ in Solidity. Es gibt viele Dinge, die fehlen, ein bisschen wie im alten C. Sie ähneln sehr einem Byte-Array, also wäre die niedrige Ebene des Vergleichs, sie als solche zu behandeln und über die Arrays zu iterieren.
Die Antwort von PabloRuiz ist eine bessere Wahl.
Wenn Sie etwas mehr über Saiten wissen möchten, können Sie meinen Blogbeitrag zu diesem Thema ausprobieren.
Denken Sie beim Testen von Benutzernamen und Passwörtern in Solidity daran, dass alles, was Sie in einer Transaktion senden, für alle sichtbar ist. Die Daten können von einem Blockchain-Explorer abgerufen werden . Das erste, was Sie zumindest versuchen sollten, ist, das Passwort zu hashen, aber selbst dann kann jeder, der den Hash findet, ihn kopieren und für sich selbst in einer gefälschten Authentifizierung weitergeben. In Nicht-Blockchain-Systemen würden Sie normalerweise eine Art Challenge-Response-Setup verwenden. Wenn Sie weitere Details zu Ihrem Authentifizierungs-Setup angeben könnten, können die Leute hier vielleicht einige Ideen dazu geben.
Dies ist eine sauberere Version der @pabloruiz55-Version. Die Klammern sind nicht notwendig und die Funktion kann rein sein.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract StringComparison {
function compareStrings(string memory a, string memory b) public pure returns (bool) {
return keccak256(abi.encodePacked(a)) == keccak256(abi.encodePacked(b));
}
}
Probieren Sie hier direkt den Code in Remix aus .
Reißer234
Reißer234
Alper
equires a single bytes argument. Use abi.encodePacked(...) to obtain the pre-0.5.0 behaviour or abi.encode(...) to use ABI encoding.
@pabloruiz55Alex Pint