Solidity /Web3.js Не удается отправить значение для неплатежеспособного конструктора
У меня есть простой контракт, с которым я построил небольшое веб-приложение. Контракт заключен в следующем:
contract MyContract {
address public creator;
function MyContract() {
creator = msg.sender;
}
function reject() {
selfdestruct(creator);
}
function send(address target, uint256 amount) {
if (!target.send(amount)) throw;
}
function destroy(address target) {
selfdestruct(0x0000000000000000000000000000000000000000);
}
}
Это всегда сработало - я использую MetaMask для подписи платежей и заключения контрактов. Начиная с недели или чего-то, я получаю сообщение об ошибке в моей консоли из Web3: Cannot send value to non-payable constructor
Затем я начал работать в Google и узнал о функции, которая должна быть payable
и что должна быть функция возврата в мой контракт. Поэтому я немного подгонял свой контракт, это то, что у меня есть сейчас:
pragma solidity ^0.4.9;
contract Oursurance {
address public creator;
uint x;
function() payable { x = 1; }
function Oursurance() payable {
creator = msg.sender;
}
function reject() payable {
selfdestruct(creator);
}
function send(address target, uint256 amount) payable {
if (!target.send(amount)) throw;
}
function destroy(address target) payable {
selfdestruct(0x0000000000000000000000000000000000000000);
}
}
Я знаю, что не каждая функция должна быть payable
, но для того, чтобы быть уверенным, что я добавил ее ко всему. Просто нужно, чтобы он снова работал.
Я все еще получаю эту ошибку с вышеупомянутым (отредактированным) контрактом.
1 ответ
Немного объяснений. Я переименовал «отклонить», чтобы «убить» и убрать, оплачивая из функций, которые, как я полагаю, не должен иметь этого.
Существует два способа ввода финансирования в контракт:
- При развертывании контракта добавьте значение. Вы можете сделать это через meta.mask при развертывании контракта.
-
После того, как он развернут , вы можете отправить Ether на адрес контракта таким же образом, как и ETH для вашего другого кошелька. Не требуется никакой функции. Будет запущена безымянная (резервная) функция, которая является
payable
.
Вы также можете инициировать возврат из JavaScript web3.eth.sendTransaction({from: me, to: contract, value: amount})
или из другого контракта с помощью contractAddress.send(amount)
. Контракт будет выполнять резервную функцию, если функция не указана, или когда указанная функция не существует.
Я добавил источник событий в функцию возврата, чтобы показать, как вы можете использовать резервную копию для чего-то полезного. Для согласованности я также поместил его в конструктор и добавил аналогичное событие для send ().
Мы можем с уверенностью сказать, что «необходимый учет» (журналы в этом случае) выполняется для всех фондов, которые приходят и выходят из этого контракта. Ничто не прорвется через такие функции, как send()
, которые не предназначены для обработки квитанций.
pragma solidity ^0.4.9;
contract Oursurance {
address public creator;
event LogFundsReceived(address sender, uint amount);
event LogFundsSent(address receiver, uint amount);
function() payable {
LogFundsReceived(msg.sender, msg.value);
}
function Oursurance() payable {
creator = msg.sender;
LogFundsReceived(msg.sender, msg.value);
}
function kill() {
selfdestruct(creator);
}
function send(address target, uint256 amount) {
if (!target.send(amount)) throw;
LogFundsSent(target, amount);
}
}
Надеюсь, что это поможет.