2016-04-15 11 views
0

Ich benutze testrpc und web3.Ist die Ethereum-Vertragsfunktion sicherbar?

verwenden ich das Idiom unten, um sicherzustellen, dass nur ein vorher definierte Benutzer in der Lage sein soll, etwas zu tun:

function doSomethingProtected() { 
     if (msg.sender != authorizedUser) 
       throw; 

     flagSomething = true; 
    } 

Wenn die Funktion auf einen instanziiert Vertrag mit web3 Aufruf wie folgt:

myContract.doSomethingProtected({ from: "0x..." }); 

hat es funktioniert. Zuerst war ich zufrieden, aber dann erkannte ich, dass die Web3-API von mir keine Passphrase für einen privaten Schlüssel oder ähnliches benötigte.

Kann jemand mit der einfachen Kenntnis von jemandes öffentlichen Schlüssel/Adresse diese Funktion aufrufen?

Die Verwendung dieses Idioms in den Beispielen führte zu der Annahme, dass ein Vorteil der Ethereum-Verträge darin bestand, dass msg.sender dadurch kryptografisch gesichert wurde.

Antwort

2

Der Grund ist, dass Sie testRPC verwenden, der seine Konten nicht sperrt, so dass Sie kein Kennwort benötigen.

Wenn Sie dies mit Geth tun würden, müssten Sie das Konto entsperren, bevor Sie es senden.

Ohne den privaten Schlüssel wird diese Funktion einen Fehler auslösen, so dass Sie diese Autorisierungsmethode korrekt verwenden.

2

Es ist schwierig, sicher zu sein, ohne mehr von Ihrem Code zu sehen, aber es scheint wahrscheinlich, dass Sie den Vertrag auf Ihrem lokalen Knoten aufgerufen haben, anstatt eine Transaktion zu senden. Transaktionen können nur von Personen mit dem privaten Schlüssel des Kontos signiert werden, dh Sie können sich darauf verlassen, dass msg.sender korrekt ist, aber Nachrichten, die auf Ihrem lokalen Knoten ausgeführt werden, erzwingen das nicht. Alle von ihnen vorgenommenen Änderungen werden rückgängig gemacht und nicht auf den Status angewendet. Daher spielt es keine Rolle, wie Ihr lokaler Anruf lautet.

+0

Ich führe es gegen einen Testerpc Knoten. Vielleicht ist das das Problem. – Interition

0

Meine Vermutung ist, dass Ihr Konto bereits beim Aufrufen der Funktion entsperrt wurde. Ich erinnere mich nicht an den genauen Zeitraum, in dem Ihr Konto entsperrt wurde, nachdem es in web3 entsperrt wurde. Ich könnte mich jedoch irren. Ich hätte das als Kommentar hinzugefügt, aber ich bin momentan nicht erlaubt.

1

Im Allgemeinen gibt es zwei Möglichkeiten, eine Funktion von web3.js aus aufzurufen: Eine Transaktion verwenden oder nur einen "Aufruf" verwenden. Nur in Transaktionen können Sie den Inhalt der Blockchain ändern (Lesen ist immer möglich). Transaktionen erfordern immer eine gültige Signatur und damit Zugriff auf einen privaten Schlüssel.

Der Grund, warum Sie nicht nach einem Passwort gefragt wurden, könnte sein, dass Sie das Konto bereits freigeschaltet haben. Außerdem können andere Benutzer als der autorisierte Benutzer die Funktion aufrufen, nur die Änderungen werden verworfen.