Что такое p.recipient.call.value (p.amount * 1 ether) (transactionBytecode); делать?

Хорошо, я видел это в учебном пособии DAO (Distributed Autonomous Organization) здесь . И я также посмотрел его в некоторых других местах, таких как официальная документация Solidity здесь . Но я все еще не могу понять, что происходит на этой линии.

Я знаю, что p - это структура предложения, из которой получатель является членом адреса типа. Поэтому я думаю, что это просто сводится к атрибутам или методу «call» и «value», какими бы они ни были.

Я читаю «вызов» - это метод, но здесь он ссылается, как на атрибут. И что это за забавная вещь в использовании двух наборов круглых скобок? является первой функцией, возвращающей другую функцию, которую мы выполняем?

С наилучшими пожеланиями

Нельсон Р. Перес

6 голосов | спросил Bilthon 29 MaramTue, 29 Mar 2016 00:13:17 +03002016-03-29T00:13:17+03:0012 2016, 00:13:17

1 ответ


3

Интересный вопрос, и у меня нет полного ответа. Но из документов Solidity в address говорится:

  

call, callcode и delegatecall:   Кроме того, для взаимодействия с контрактами, которые не соответствуют ABI, предоставляется вызов функции, который принимает произвольное количество аргументов любого типа.

Пример:

address nameReg = 0x72ba7d8e73fe8eb666ea66babc8116a41bfb10e2; nameReg.call("register", "MyName");

Моя интерпретация :

p.recipient.call.value(p.amount * 1 ether)(transactionBytecode);

вызывает адрес (p.recipient), задающий заданный объем транзакции value to (p.amount * 1 ether) и установив поле data транзакции в (transactionByteCode)

Это будет похоже на отправку обычной транзакции с web3 api. псевдокод :

tx = {
  from: (in the example, the calling contracts address)
  to: (p.recipient is the address),
  value: (p.amount * 1 ether),
  data: (transactionByteCode),
  ...
}
web3.eth.sendTransaction(tx)

Дополнительная информация: После нескольких экспериментов и поиска я нашел следующее:

  

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

     

Обычно это делается с функцией целостности .call, которая будет иметь следующие параметры:

     

someAddress.call.value (_amount) (_ данных);

     

Если someAddress является адресом для другого контракта, _amount - это количество эфира в wei, а _data - это пользовательский abi-код функции, которую пользователь хочет вызвать.

Итак, мой оригинальный ответ немного выключен. Но если вы действительно делаете вызов и _data НЕ является функцией abi для выполнения, _data будет передаваться в поле данных в транзакции, но, похоже, значение не будет.

ответил dbryson 29 MaramTue, 29 Mar 2016 00:50:04 +03002016-03-29T00:50:04+03:0012 2016, 00:50:04

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132