Ethereum 以太坊智能合约的局限性&;织物

Ethereum 以太坊智能合约的局限性&;织物,ethereum,solidity,smartcontracts,Ethereum,Solidity,Smartcontracts,我正在尝试制定一个智能合约,以自动实现以下目标。但我坚持执行。我如何运行(2)发送而无需B签署发送,即:我希望在(1)激活且条件(2)准备就绪后自动运行 伪代码(一个): 上述代码涉及多个所有者,即A、B和C。首先,A通过运行/签署Tx(1)激活合同。然后合同检查条件(2)。现在,如何在不强制B签名的情况下自动运行(3) 最终,合同是否能够在B方签字(或代理签字) 编辑 下面的链码是什么?它能自动运行吗,即没有D必须在(3)中使用D的私钥签名 伪码(两个): 最终,合同是否能够在B方签字(或代

我正在尝试制定一个智能合约,以自动实现以下目标。但我坚持执行。我如何运行(2)发送而无需B签署发送,即:我希望在(1)激活且条件(2)准备就绪后自动运行

伪代码(一个):

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

最终,合同是否能够在B方签字(或代理签字)


编辑

下面的链码是什么?它能自动运行吗,即没有D必须在(3)中使用D的私钥签名

伪码(两个):

最终,合同是否能够在B方签字(或代理签字)

否。

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

虽然这不在提出的问题范围之内,但如果B和/或C是不受信任的契约,它可能会帮助您避免以后进行重构,以遵守分离两个发送的最佳实践。您只需在存款步骤中进行会计核算,然后在B&C申请其权利时使用取款模式(单独交易)

希望能有帮助

更新:

这是一个大概的提纲,可能会给你一些想法。我不确定>50是有史以来的总额还是一笔>50的付款。这是一个人为的例子,希望您为B&C提供两个有效地址,以便合同知道他们的地址

您可以从任何地址(A)发送金额,合同将跟踪
owedToB
owedToC

您应该能够从B或C向
draw()
发送一笔交易,以申请所欠余额

为一个完整的测试设置所有内容是有点费时的,所以只显示“原样”


谢谢你的回复。如果我理解正确,我必须在存款步骤中进行计算。但现在的问题是,我只想在条件if(B>50)为真时执行B发送C数量10,这反过来又基于发送50到B的结果。对于这个伟大的例子,hanks很多。如果(B>50)的条件意味着检查B当前的总余额。这是在B收到A的50笔付款后检查的。那么1合同是否能够检查B的余额?第二,如果B.balance>50,那么我们希望B.send(10)给C。在您的示例中,您使用/分配了所有存款给owedToB。然后你检查了情况。如果条件为true,则将10分配给owedToC。这10个是从哪里来的,A,B还是C?在我最初的问题中,我希望B向C发送10(B的一部分)。应该有一个owedToB-=10。修好了。可以看到平衡,但实际上这可能不是最好的方法。例如,uint BBalance=B.balance;这样做的问题是,它可能随着存款和取款而上下浮动,因此大多数合同都是基于资金流的,也就是说,你不会触发基于支票账户余额的事情;而是某种形式的累积收益。在任何情况下,本示例的目的只是展示退出模式。这个算法适合这种情况。谢谢你的及时回复。即使使用owedToB-=10,也只修复了此示例。如果我的(3)是B,那么将(20)发送给C。使用上述修复,它将成为owedToB-=20。现在我们冒着透支B账户的风险。这显然是一个人为的例子来解决第一个问题(一),并说明如何使用算术和取款来转移资产。
A send 50 to B        (1)
if (B > 50)           (2)
    B send 10 to C    (3)
A send 50 to B        (1)
if (something is true, say Z > 50)           (2)
    D send 10 to F    (3)
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;
  }

}