2017-03-24 1 views
1

私は次のことを自動的に達成するためのスマートな契約をしようとしています。しかし、私は実装にこだわりました。 Txに署名するためにBを使わずに、(2)Txを実行するにはどうすればいいのですか?すなわち、それが自動的に実行されるようにしてください(1)が起動し、条件(2)が準備されています。Ethereum&Fabricのスマート契約の制限

擬似コード(1):

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

上記のコードは、すなわち複数の所有者を含みます。 A、B、Cがある。まず、TはTx(1)を実行/署名することによって契約をアクティブにする。契約は条件(2)をチェックする。さて、Bにサインを強制することなく、自動的に(3)を走らせることができますか?

最終的に、契約はBの動作に署名(または代理署名)できますか?どのchaincodeで


編集

について、以下の何?それは自動的に実行することができますか?つまり、Dは(3)のDの秘密鍵を使用して署名しなければなりませんか?

擬似コード(二):最終的に

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

答えて

1

、契約Bの挙動にログインすることができる(またはプロキシ記号)は?

Aは、契約に必要な資金を送ることによってトランザクションを開始し、その後、契約は規則に従って資金を分散させます。

これは疑問の余地はありませんが、後でリファクタリングを避けて2つのセンドを分離するベストプラクティスを観察するのに役立ちますおよび/またはCは信頼できない契約です。入金ステップで会計を実行し、B & Cが資格(別個の取引)を主張しているので、引き出しパターンを使用します。

希望します。

更新日:

をここではあなたにいくつかのアイデアを与えるかもしれないラフなアウトラインです。 > 50が常時合計であるか50を超える単発であるかはわかりませんでした。これはB & Cの2つの有効なアドレスを渡して、その契約がそのアドレスを知っていることを期待する意図された例です。

任意の住所(A)から金額を送信でき、契約ではowedToBowedToCが記録されます。

残高を請求するには、BまたはCからwithdraw()に取引を送信することができます。

完全なテストのためにすべてを設定するのに少し時間がかかり、そのままの状態で提示するだけです。

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; 
    } 

} 
+0

ご返信ありがとうございます。私があなたを正しく理解していれば、預金口座で計算をしなければなりません。しかし、問題は今私がしたいことだけです Bは条件(B> 50)が真である場合、C量10を送信します。これは順番にAの結果に基づいています。B – wildcolor

+0

ありがとう素晴らしい例。条件(B> 50)は、現在のBの合計残高を確認することを意味します。これは、BがAから50回の支払いを受け取った後にチェックされます。まず、Bの残高を確認できる契約ですか?第2に、B.balance> 50ならば、B.send(10)をCにします。あなたの例では、owedToBにすべてのデポジットを使用/割り当てました。次に、条件を確認しました。条件がtrueの場合、owedToCに10を割り当てます。この10はA、B、Cのどこから来たのですか?私の元の質問では、BさんがCに10(Bの一部)を送るようにします。 – wildcolor

+0

あなたは正しいです。 owedToB - = 10がなければなりません。バランスを見ることは可能ですが、実際には最良の方法ではないかもしれません。たとえば、uint BBalance = B.balance;この問題は、預金と引き出しで上下に浮動する可能性があるため、ほとんどの契約は資金の流れに基づいているため、口座残高の確認に基づいて物事を引き起こすことはありません。むしろ、ある種の累積領収書。いずれの場合でも、この例のアイデアは、撤退パターンを示すことだけです。算術演算は状況に適応します。 –

関連する問題