2016-04-15 15 views
0

私はtestrpcとweb3を使用しています。Ethereum契約機能はセキュアですか?

は私だけ以前に定義され、ユーザーが何かを行うことができるはずことを保証するために、次のイディオムを使用:

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

     flagSomething = true; 
    } 

次のようにweb3とインスタンス化の契約上の関数を呼び出す:

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

それは働いた。最初は嬉しかったですが、Web3 APIが秘密鍵などのパスフレーズを要求していないことに気付きました。

誰かの公開鍵/アドレスの簡単な知識を持つ人は誰でもこの機能を呼び出すことができますか?

例でこのイディオムを使用すると、msg.senderが暗号で確実に保証されていることが、エテリアムの契約の利点と信じられました。

答えて

2

あなたがパスワードを必要としないので、あなたのアカウントをロックしないtestRPCを使用しているという理由があります。

gethでこれを行う場合は、アカウントをロック解除してから送信する必要があります。

秘密鍵がないと、その関数はエラーをスローします。したがって、その認証方法を正しく使用しています。

2

あなたのコードをもっと見ることなく確認するのは難しいですが、トランザクションを送信するのではなくローカルノードで契約をしていたようです。トランザクションは、アカウントの秘密鍵を持つ人のみが署名することができます。つまり、正確にはmsg.senderに依存することができますが、ローカルノードで実行されるメッセージはそれを強制しません。変更はロールバックされ、状態には適用されません。したがって、ローカルコールが何をするかは関係ありません。

+0

私はそれをtestrpcノードに対して実行しています。多分それが問題です。 – Interition

0

私の推測では、あなたのアカウントは機能を呼び出すときに既にロック解除されています。私はあなたのアカウントがWeb3でロック解除された後にロック解除された正確な期間を覚えていません。私は間違っているかもしれません。これをコメントとして追加したでしょうが、今は許されません。

1

一般に、web3.jsから関数を呼び出すには、2つの方法があります:トランザクションを使用するか、単に "呼び出し"を使う。トランザクションでのみ、ブロックチェーンの内容を実際に変更することができます(読み取りは常に可能です)。トランザクションは常に有効な署名を必要とし、したがって秘密鍵へのアクセスを必要とします。

パスワードを尋ねられなかった理由は、既にアカウントのロックを解除していることが原因である可能性があります。さらに、許可されたユーザ以外のユーザがその機能を呼び出すことができ、変更のみが破棄される。

関連する問題