Как я вызываю функцию с несколькими учетными записями?

#ethereum #solidity #smartcontracts

#ethereum #надежность #смарт-контракты

Вопрос:

Я создал смарт-контракт, который должен выполнять функцию после ее вызова двумя владельцами, тогда и только тогда, когда оба владельца вызывают функцию X, тогда эта функция выполняется. Это похоже на тип подписи с несколькими подписями. Мой код приведен ниже, но он все еще не работает. Контракт должен отправить 1 эфир на учетную запись кошелька после его вызова двумя владельцами. Пожалуйста, кто-нибудь может мне помочь. Заранее спасибо.

  `pragma solidity ^0.4.25;

  contract MyContract {

  address Owner1;
  address Owner2;
  address Wallet;
  mapping(address => bool) signed;
  mapping(address => uint) balances;

  constructor() public payable {
   Owner1 = 0xC20201d915458EF540aDe6068dFe2777E8fa733c;
   Owner2 = 0x54201A09ACff6D2A60DcdF8896AFf308FDDC160C;
   Wallet = 0x30E09Fa68430Def6978ED1a3E8f5ed473A04024c;
   }

   function Sign() public {
   require (msg.sender == Owner1 || msg.sender == Owner2);
   require (signed[msg.sender] == false);
   signed[msg.sender] = true;
    }

   function Reward() public payable returns (string) {
   require (signed[Owner1] == true amp;amp; signed[Owner2] == true);
   Wallet.transfer(1 ether); 
   signed[Owner1] = false; 
   signed[Oener2] = false; 
   }
     }
  

`

Комментарии:

1. Ваша логика неверна. Если я правильно понял, вы хотели бы отправить 1 эфир на свой счет кошелька. Это означает, что вы должны определить, с какой учетной записи следует списать этот 1 эфир? либо owner1 1, либо owner2? например, сначала владелец 1 пришел и подписал транзакцию, затем владелец 2 пришел и подписал ее, и поскольку вторая транзакция подписывается владельцем 2, тогда этот 1 эфир должен быть вычтен из учетной записи owner2, и вы должны перевести 1 эфир на учетную запись кошелька с учетной записью owner2. Я надеюсь, что это поможет

2. Привет, Hsn, 1 эфир будет вычтен из баланса контракта. Итак, в контракте есть баланс эфиров, который будет отправлен на адрес кошелька после того, как функция Reward будет вызвана если и только двумя владельцами. Если только один владелец вызывает эту функцию, функция не должна выполняться.

3. дайте ответ, который я опубликовал, попробовав. у меня все работало нормально..

4. Для вас работает, что два владельца вызывают функцию, а затем ее выполняют?

5. Да, точно….

Ответ №1:

В приведенном ниже коде сначала вам нужно внести немного эфира со своей учетной записи, чтобы внести функцию. и затем вы можете вызвать функцию знака и вознаграждения

 pragma solidity ^0.4.25;

  contract MyContract {

  address Owner1;
  address Owner2;
  address Wallet;
  mapping(address => bool) signed;
  mapping(address => uint) balances;

  constructor() public payable {
   Owner1 = 0x4B0897b0513fdC7C541B6d9D7E929C4e5364D2dB;
   Owner2 = 0x583031D1113aD414F02576BD6afaBfb302140225;
   Wallet = 0xdD870fA1b7C4700F2BD7f44238821C26f7392148;
   }
   
   function deposit() payable returns(bool success) {
        balances[msg.sender]  =msg.value;
        return true;
    }

   function Sign() public {
   require (msg.sender == Owner1 || msg.sender == Owner2);
   require (signed[msg.sender] == false);
   signed[msg.sender] = true;
    }

   function Reward() public payable returns (string) {
   require (signed[Owner1] == true amp;amp; signed[Owner2] == true);
   Wallet.transfer(1 ether); 
   signed[Owner1] = false; 
   signed[Owner2] = false; 
   }
     }