以太坊和 Fabric 中的智能合约限制
Smart contract limitations in Ethereum & Fabric
我正在尝试制作一个智能合约来自动实现以下功能。但我坚持执行。我如何在没有 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通过running/signingTx(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)
Ultimately, is the contract able to sign (or proxy sign) on behave of B?
没有
A通过向合约发送必要的资金开始交易,然后合约根据规则分配资金。因此,A -> 合同,合同 -> B,可能还有合同 -> C。
虽然它不在提出的问题范围内,但如果 B and/or C 是不受信任的合约,它可能会帮助您避免以后重构以观察将两个发送分开的最佳实践。您只需在存款步骤中进行会计处理,然后使用提款模式,因为 B 和 C 要求他们的权利(单独的交易)。
希望对您有所帮助。
更新:
这是一个粗略的大纲,可能会给您一些想法。我不确定是否 > 50 是历史总数还是单次付款 > 50。这是一个人为的例子,希望您为 B 和 C 传递两个有效地址,以便合同知道他们的地址。
您可以从任何地址 (A) 发送金额,合约将跟踪 owedToB
和 owedToC
。
您应该能够从 B 或 C 向 withdraw()
发送交易以索取欠款。
为完整测试设置所有内容有点耗时,所以只展示 "as is"。
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;
}
}
我正在尝试制作一个智能合约来自动实现以下功能。但我坚持执行。我如何在没有 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通过running/signingTx(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)
Ultimately, is the contract able to sign (or proxy sign) on behave of B?
没有
A通过向合约发送必要的资金开始交易,然后合约根据规则分配资金。因此,A -> 合同,合同 -> B,可能还有合同 -> C。
虽然它不在提出的问题范围内,但如果 B and/or C 是不受信任的合约,它可能会帮助您避免以后重构以观察将两个发送分开的最佳实践。您只需在存款步骤中进行会计处理,然后使用提款模式,因为 B 和 C 要求他们的权利(单独的交易)。
希望对您有所帮助。
更新:
这是一个粗略的大纲,可能会给您一些想法。我不确定是否 > 50 是历史总数还是单次付款 > 50。这是一个人为的例子,希望您为 B 和 C 传递两个有效地址,以便合同知道他们的地址。
您可以从任何地址 (A) 发送金额,合约将跟踪 owedToB
和 owedToC
。
您应该能够从 B 或 C 向 withdraw()
发送交易以索取欠款。
为完整测试设置所有内容有点耗时,所以只展示 "as is"。
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;
}
}