我正在努力制定智能合约以自动实现以下目标。但我坚持执行。如何在没有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)。现在但如何自动运行(3)而不必强制B签名?
最终,合同是否能够在B的行为上签署(或代理签署)?
修改
下面的链码怎么样?它可以自动运行,即没有D必须使用(3)中的D私钥签名吗?
伪代码(二):
A send 50 to B (1)
if (something is true, say Z > 50) (2)
D send 10 to F (3)
答案 0 :(得分:1)
最终,合同是否能够在B的行为上签署(或代理签署)?
否。
A通过向合同发送必要的资金来启动交易,然后合同根据规则分配资金。所以,A - >合同,合同 - > B,可能,合同 - > C.虽然它不在提出的问题范围之内,但如果B和/或C是不受信任的合同,它可能会帮助您避免以后重构以观察分离两个发送的最佳做法。您只需在存款步骤中进行会计处理,然后使用提款模式作为B& C要求他们的权利(单独的交易)。
希望它有所帮助。
<强>更新强>
这是一个粗略的轮廓,可能会给你一些想法。我不确定是否&gt; 50是全时总计或单次付款&gt;这是一个人为的例子,希望你传递B&amp; B的两个有效地址。 C所以合同知道他们的地址。
您可以从任何地址(A)发送金额,合同将跟踪owedToB
和owedToC
。
您应该能够从B或C向withdraw()
发送交易以索取欠款。
设置所有内容以进行全面测试只需要花费一些时间,因此只需提供&#34;就像#34;一样。
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;
}
}