1

我正在尝试制定智能合约以自动实现以下目标。但我坚持实施。如何在没有 B 签署 Tx 的情况下运行 (2) Tx,即:我希望它在 (1) 被激活并且条件 (2) 准备好后自动运行。

伪代码(一):

A send 50 to B        (1)
if (B > 50)           (2)
    B send 10 to C    (3)

上面的代码涉及多个所有者,即。A、B 和 C。首先,A 通过运行/签署 Tx (1) 来激活合约。然后合约检查条件(2)。现在,但是如何在不必强制 B 签名的情况下自动运行(3)呢?

最终,合同是否能够在 B 的行为上签字(或代理签字)?


编辑

任何链码中的下面呢?它可以自动运行吗,即没有 D 必须使用 (3) 中 D 的私钥签名?

伪代码(二):

A send 50 to B        (1)
if (something is true, say Z > 50)           (2)
    D send 10 to F    (3)
4

1 回答 1

1

最终,合同是否能够在 B 的行为上签字(或代理签字)?

不。

A通过向合约发送必要的资金开始交易,然后合约根据规则分散资金。因此,A -> 合同,合同 -> B,可能还有合同 -> C。

虽然它不在提出的问题范围内,但如果 B 和/或 C 是​​不受信任的合同,它可能会帮助您避免以后进行重构以观察分离两个发送的最佳实践。您只需在存款步骤中进行会计处理,然后使用提款模式,因为 B & C 要求他们的权利(单独交易)。

希望能帮助到你。

更新:

这是一个粗略的大纲,可能会给你一些想法。我不确定 > 50 是历史总数还是单次付款 > 50。这是一个人为的示例,希望您为 B 和 C 传递两个有效地址,以便合约知道它们的地址。

您可以从任何地址 (A) 发送金额,并且合约将跟踪owedToBowedToC

您应该能够向withdraw()B 或 C 发送交易以索取所欠余额。

为完整测试设置所有内容有点耗时,因此只需“按原样”呈现。

pragma solidity ^0.4.6;

contract Royalty {

  address public B;
  address public C;
  uint public owedToB;
  uint public owedToC;

  event LogPaymentReceived(address sender, uint amount);
  event LogPaid(address recipient, uint amount);

  // pass in two addresses, B & C for this simple constructor

  function Royalty(address addressB, address addressC) {
    B = addressB;
    C = addressC;
  }

  function pay()
    public
    payable
    returns(bool success)
  {
    owedToB += msg.value;

    // You can do B.balance > 50 but beware how it drops below 50 after withdrawal
    // A little more involved, but you can have totalReceipts AND totalPayments so owedToB is totalReceipts - totalPayments
    // It all depends on the business terms you're trying to enforce.

    if(msg.value > 50) {
      owedToC += 10;
      owedToB -= 10;
    }

    LogPaymentReceived(msg.sender, msg.value);
    return true;
  }

  function withdraw() 
    public
    returns(uint amountSent)
  {
    if(msg.sender != B && msg.sender != C) throw; // only B & C can withdraw

    uint amount;
    if(msg.sender == B) {
        amount = owedToB;
        owedToB = 0;
        if(!B.send(amount)) throw;
        LogPaid(B,amount);
        return amount;
    }
    if(msg.sender == C) {
        amount = owedToC;
        owedToC = 0;
        if(!C.send(amount)) throw;
        LogPaid(C,amount);
        return amount;
    }
    // we shouldn't make it this far
    throw;
  }

}
于 2017-03-24T12:52:15.653 回答