Отправить 1% Ethereum, проданного с одного аккаунта, на другой

Я договорился с другом, по которому он согласился отдать мне 1% всего Ethereum, который он продает во время продажи. Итак, сегодня он владеет 100 эфирами; через 1 год он идет продавать 10 эфиров, мне в этот момент будет отправлено 0,1 эфира с его счета.

Как мне зафиксировать это в контракте Ethereum? Мне непонятно:

  1. Как «достучаться» до его аккаунта, чтобы получить 1% от его продажи; Я предполагаю, что ему нужно будет заранее разместить 1% своего Ethereum на каком-то счете условного депонирования?
  2. Как «запустить» контракт Ethereum на основе какого-то другого события в блокчейне (в частности, отправки эфира с определенного адреса).

Я совершенно новичок в Ethereum, поэтому извините меня, если я ошибаюсь в некоторых формулировках/концепциях.

Ответы (1)

Лучше всего было бы создать контракт, который разделяет деньги по мере их снятия. Для этого вы должны создать контракт, который позволяет вашему другу снимать средства, но каждый раз, когда он это делает, он отправляет 1% от суммы снятия на ваш адрес.

Затем он отправляет свои 100 ETH на контракт, зная, что может получить их в любое время, но при этом вы платите 1%, на который он согласился.

Вероятно, это выглядело бы примерно так:

contract Siphon {
  address private _owner;
  address private _beneficiary;

  modifier onlyOwner {
    if (msg.sender != owner) {
      throw;
    }
    _;
  }

  // alternatively, use the sender to be the owner, so the owner
  // is the deployer.
  function Siphon(address owner, address beneficiary) payable {
    _owner = owner;
    _beneficiary = beneficiary;
  }

  function withdraw(uint256 amount) onlyOwner {
    // note that integer division means amounts less than 100
    // would have no payout
    uint256 beneficiaryAmount = amount / 100;
    if (beneficiaryAmount > 0) {
      if (!_beneficiary.send(beneficiaryAmount)) {
        throw;
      }
    }
    if (!owner.send(amount - beneficiaryAmount)) {
      throw;
    }
  }

  // allow deposits
  function () payable onlyOwner {}
}

Я бы не стал использовать этот код прямо из коробки, так как, вероятно, есть некоторые крайние случаи, о которых стоит подумать. По крайней мере, я обратил внимание на одного. Это также может не совсем соответствовать вашим потребностям, но основная концепция должна применяться: чтобы применить такое ограничение на выплату ETH, ETH должен принадлежать контракту и интересующим вас событиям (в частности) , также должны управляться контрактом.

Вот что я бы предложил. Но также помните, что это вычитает, beneficiaryAmountтак что друг получит 9,9 ETH. Также это не мешает ему совершать продажи вне контракта.
Дело в том, что 100ETH, которыми владеет его друг, переводятся в этот контракт, как только соглашение заключено, поэтому единственный способ получить их обратно — это брать 1% штрафа при каждом снятии средств. Они двое, вероятно, могут договориться о возврате этого 1%, если снятие средств не связано с целью продажи ETH.
Да, комиссия может быть обработана несколькими способами. Но большая проблема здесь — отследить продажу эфира. Что произойдет, когда 100ETH закончатся, и они перейдут к новым продажам? Нам нужен дополнительный механизм, чтобы заставить друга также вносить новые эфиры в контракт или заставить получателей принимать только внутренние транзакции из контракта. В любом случае, это проблемы, связанные с самой аранжировкой, а не с вашим ответом. У меня тоже нет ответа на эти вопросы :)
Первоначальная договоренность, по-видимому, была рассчитана только на 100 ETH, кроме того, контракт, который я написал, позволяет вносить больше ETH в соответствии с теми же правилами. Арбитраж контракта и принудительное исполнение обстоятельств, выходящих за рамки его определения, лежат за пределами области блокчейна — как и любой другой контракт.