Wie vergleicht man Saiten in Festigkeit?

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;
        }
    }
}

Antworten (5)

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.

keccak256 ist die native Hash-Funktion von Ethereum. ethereum.stackexchange.com/a/554/229
Beachten Sie, dass dies eine Warnung in Remix ausgibt. imgur.com/a/ruV6IM1
Gibt folgenden Fehler: equires a single bytes argument. Use abi.encodePacked(...) to obtain the pre-0.5.0 behaviour or abi.encode(...) to use ABI encoding.@pabloruiz55
@alper Das liegt an Änderungen in Solidity seit 2017. Keccak hat früher ein Tupel von Werten genommen, jetzt braucht es nur noch einen. Abi.encodePacked nimmt ein Tupel und erzeugt ein Array von Bytes, die alle Elemente dieses Tupels codieren, wodurch es für Keccak geeignet ist.

Hier ist der einfachste Weg:

keccak256(bytes(a)) == keccak256(bytes(b));

Verwenden Sie einfach keccak256()beim Konvertieren der Zeichenfolge in bytes.

Zum Überprüfen einer leeren Zeichenfolge: keccak256(bytes(a)) == keccak256(bytes(""));funktioniert nicht. Besser: string memory empty = "";dannkeccak256(bytes(a)) == keccak256(bytes(empty));
Guter Punkt, Sie können auch leere Zeichenfolgen lengthdamit 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 .