Как выполняются вызовы функций контракта web3 и транзакции?

Извините, если это звучит как вопрос новичка, но после прочтения большого количества материала у меня есть несколько вопросов.

Во-первых, если контракт уже создан, могу ли я вызвать его функции, если знаю его ABI и адрес? Я думаю, contract(ABI).at(contractAddress)что делает это, но я нашел описание довольно двусмысленным.

Во-вторых, если я запускаю web3 путем прямого импорта библиотеки без MetaMask или Mist, когда я инициирую вызов функции, кто msg.sender? Если запущены MetaMask или Mist, является ли msg.senderтекущий кошелек авторизованным?

Наконец, если я хочу создать браузерное Dapp, как мне убедиться, что некоторые функции могут быть вызваны только Dapp и никем другим (даже владельцем)?

Заранее спасибо!

Ответы (1)

1- если вы знаете адрес и ABI, вы можете вызвать функцию контракта, как описано в официальном документе:

// creation of contract object
var MyContract = web3.eth.contract(abi);

// initiate contract for an address
var myContractInstance = MyContract.at('0x78e97bcc5b5dd9ed228fed7a4887c0d7287344a9');

var result = myContractInstance.myConstantMethod('myParam');
console.log(result) // '0x25434534534'

myContractInstance.myStateChangingMethod('someParam1', 23, {value: 200, gas: 2000}, function(err, result){ ... });

2-msg sender — это адрес отправителя сообщения//вызова, поэтому, если вы используете любой кошелек ethereum, адрес учетной записи отправляется вместе с вашим сообщением (например, ip).

3-для этого используйте модификатор :

modifier isAllowed() {
   if (msg.sender != allowed_address) {
        throw;
    }

    _;
}
Спасибо за решение моих первых двух вопросов. Что касается третьего, это также означает, что я, как владелец адреса, смогу войти в систему и использовать этот метод, верно? Есть ли способ убедиться, что только приложение может вызывать функции? Если нет, будут ли инвесторы по-прежнему доверять целостности приложения, если один адрес, который будет использоваться с Dapps, сможет сделать значительный вызов функции? (не сможет изменить свой баланс отрицательно, а только положительно)
вы должны определить разрешенный адрес, с которого вы можете вызывать функции, в противном случае вызов завершится ошибкой. обычно мы приписываем такие способности человеку, развернувшему контракт (своего рода администратору), но только для выполнения некоторых основных действий, таких как прекращение действия контракта (в случае недостатков безопасности). если вы говорите о контракте токенов, я советую вам прочитать о концепции ERC20.
Мой токен уже совместим с ERC 223, проблема в том, что сумма, которую конкретный пользователь может вывести из «банка», должна определяться только Dapps. В противном случае нет никакой гарантии, что владелец не сможет использовать его злонамеренно.
извините, но я не понял, что вам нужно, не могли бы вы уточнить?
Допустим, у вас есть банк. Вы вносите туда деньги. Это можно сделать через сам договор. Затем, после того, как вы вносите деньги, вы используете Dapp, который может изменить сумму денег, которую вы «депонировали» (депозит здесь относится к сумме, возвращаемой стандартной функцией ERC20 (адрес, адрес), где первый адрес — это адрес контракта). адрес.). Я хочу, чтобы только децентрализованное приложение могло изменить сумму, которую вы внесли (имеется в виду, что только децентрализованное приложение и контракт могут вызывать функцию утверждения контракта).
дело не в Dapp, а в учетной записи, в которой оно запущено. любой может использовать ваш контракт и вызывать функции, но модификаторы, основанные на адресе вызывающего абонента, могут помочь вам определить политику управления доступом.