Я не эксперт в Solidity. Я пытаюсь вызвать функцию для другого контракта, чтобы она обновляла значения, но это не так. Я использую онлайн Remix Browser. Контракт, который будет называться Высшим. Я вижу, что значения геттера и сеттера работают, как и ожидалось. Контракт вызывающего абонента — Hack. Если функция Sneak из Contract Hack отправляет на 1 эфир больше, чем значение стоимости, то отправитель становится большим. Например, если Sneak вызывает функцию Supreme со Стоимостью = 2 эфира, то Стоимость становится равной 2, а отправитель заменяет позицию «большой». Когда я передаю адрес из первого контракта в контракт Caller и даю 2 эфира в стоимости. Кликаю на сеттер, потом проверяю стоимость, остается 1 эфир. Я пробовал так много способов, но я не могу двигаться вперед.
contract Supreme {
address public big;
uint256 public cost;
function Supreme()
public
{
big = msg.sender;
cost = 3 ether;
}
function Road()
external
payable
{
require(msg.value >= cost);
big.transfer(msg.value);
big = msg.sender;
cost += 1 ether;
}
}
Это контракт вызывающего абонента
import "browser/Supreme.sol";
contract Hack{
Supreme public sup;
Supreme s;
function Hack(Supreme _sup){
sup = _sup;
}
function sneak(address addr) public payable{
s.Road.value(msg.value)();
}
function() payable{
s.Road();
}
}
Две проблемы:
Supreme
, поэтому я считаю, что вы пытаетесь отправить эти вызовы функций на адрес 0.s.Road()
.Для первой проблемы вы можете либо развернуть свой контракт Supreme
:
sup = new Supreme();
или (что более вероятно, что вы хотите) вы можете развернуть Supreme
себя, а затем передать адрес развернутого контракта Hack
в конструкторе:
function Hack(Supreme _sup) {
sup = _sup;
}
Чтобы решить вторую проблему, добавьте значение к вашему вызову:
s.Road.value(msg.value)();
РЕДАКТИРОВАТЬ
Ваш новый код имеет другие проблемы. Он отслеживает sup
, но затем не использует его. Функция sneak
также принимает адрес, который не используется.
Вот фиксированный код. Обязательно передайте адрес развернутого Supreme
контракта при создании Hack
. Это означает, что вам нужно ввести адрес этого контракта (например "0x123abc..."
, ) в текстовое поле рядом с кнопкой «Создать». Затем отправьте эфир, изменив value
поле справа вверху при вызове sneak
функции.
import "browser/Supreme.sol";
contract Hack {
Supreme public sup;
function Hack(Supreme _sup) public {
sup = _sup;
}
function sneak() public payable {
sup.Road.value(msg.value)();
}
}
Майк
Майк
пользователь19510
Майк
пользователь19510
0x
и заключенная в двойные кавычки.Майк
пользователь19510
Hack
)? Вы уверены, чтоHack
принимает только один параметр конструктора?Майк