2016-04-15 3 views
0

Я использую testrpc и web3.Защищена ли контрактная функция Ethereum?

Я использовал ниже идиому, чтобы гарантировать, что только определенный ранее пользователь должен быть в состоянии сделать что-то:

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

     flagSomething = true; 
    } 

При вызове функции на реализованном контракт с Web3 следующим образом:

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

это сработало. Сначала я был доволен, но потом понял, что API-интерфейс web3 не требовал от меня предоставления какой-либо парольной фразы для закрытого ключа или подобного.

Может ли кто-нибудь с простым знанием кого-то публичного ключа/адреса назвать эту функцию?

Использование этой идиомы в примерах заставило меня поверить в то, что контракты Ethereum заключаются в том, что он обеспечил криптографическую уверенность в том, что msg.sender был зашифрован.

ответ

2

Причина в том, что вы используете testRPC, который не блокирует его учетные записи, поэтому вам не нужен пароль.

Если вам нужно было сделать это с помощью geth, вам нужно будет разблокировать учетную запись перед ее отправкой.

Без закрытого ключа эта функция выдает ошибку, поэтому вы правильно используете этот метод авторизации.

2

Трудно быть уверенным, не видя больше своего кода, но кажется вероятным, что вы вызывали контракт на своем локальном узле, а не отправляли транзакцию. Транзакции могут быть подписаны только кем-то с закрытым ключом учетной записи, что означает, что вы можете положиться на msg.sender, чтобы быть точным, но сообщения, выполняемые на вашем локальном узле, не будут обеспечивать это. Любые изменения, которые они делают, откатываются назад и не применяются к состоянию, тем не менее, поэтому не имеет значения, что делает ваш местный вызов.

+0

Я запускаю его против узла testrpc. Возможно, в этом и проблема. – Interition

0

Я предполагаю, что ваша учетная запись была уже разблокирована при вызове функции. Я не помню точный период, когда ваша учетная запись разблокирована после ее разблокировки в web3. Возможно, я ошибаюсь. Добавил бы это как комментарий, но мне сейчас не разрешают.

1

В общем, существует два способа вызова функции из web3.js: использование транзакции или просто использование «вызова». Только в транзакциях вы можете фактически модифицировать содержимое блок-цепи (чтение всегда возможно). Транзакции всегда требуют действительной подписи и, следовательно, доступа к закрытому ключу.

Причина, по которой вас не просил ввести пароль, может заключаться в том, что вы уже разблокировали учетную запись. Кроме того, пользователи, кроме авторизованного пользователя, могут вызывать функцию, только изменения будут выброшены.

Смежные вопросы