以太坊代码标准是什么_50行代码写就以太坊支付

状态通道(State Channel)是非常流行的扩容方案。比特币线下支付通道有闪电(lightning),以太坊有雷电(Raiden) 本文演示如何立刻用合约写以太坊支付.

假设在Alice和Bob之间发生的微支付场景: Bob雇佣Alice为他的推特的水军,定期在Bob的推特上发推,回帖。为此BOB答应Alice,每发一个推(tweet),Bob支付0.001个ETH。这种微支付交易通过公链来做的话,20%的Alice的收入都会被以交易费的方式吃掉。

一方面,Alice不想每发100条推特后才信任Bob会付总额0.001ETH*100=0.1ETH。因为BOB有可能赖账。另一方面,Bob不想一次性付Alice发100个推特的钱,因为Alice完全有可能拿了钱,人间蒸发而不干活。

这时候,我们就需要一个支付通道,Bob预先打100*0.001 = 0.1 ETH 到通道的智能合约,按照合约的规则,合约里的钱可能给Alice,也可能退回给BOB. 构造函数如下:

contract Channel {

address public channelSender;

address public channelRecipient;

uint public startDate;

uint public channelTimeout;

mapping (bytes32 => address) signatures;

function Channel(address to, uint timeout) payable {

channelRecipient = to;

channelSender = msg.sender;

startDate = now;

channelTimeout = timeout;

}

假设Bob送了0.1 ETH给这个合约,而且设定Timeout为1天。如果timeout发生,Bob可以撤销这个合约,从而获得被退回的余额.

Alice看到支付通道合约里有钱被锁定了,Alice就放心的开始工作:发推特。每发一个tweet, Bob就用私钥签名一个(contract_address, value)产生的哈希值,并送给 Alice. 所以,Alice发第一个tweet, Bob 就签(0x123…, 0.001 ETH), 发第二个推特,Bob签(0x123, 0.002 ETH), etc…

每次Alice收到Bob签名的信息,Alice也签名,但是并不送到公链。任何时候Alice决定终止这分工作时,alice需要发一个多人签名(Bob和Alice)的消息给合约。合约就会送给Alice事先约定好的酬劳 (say, 0.05 ETH=发了50个推特*0.001ETH) 并把合约里剩余的资金返回给Bob.

function CloseChannel(bytes32 h, uint8 v, bytes32 r, bytes32 s, uint value){

address signer;

bytes32 proof;

// get signer from signature

signer = ecrecover(h, v, r, s);

// signature is invalid, throw

if (signer != channelSender && signer != channelRecipient) throw;

proof = sha3(this, value);

// signature is valid but doesn't match the data provided

if (proof != h) throw;

if (signatures[proof] == 0)

signatures[proof] = signer;

else if (signatures[proof] != signer){

// channel completed, both signatures provided

if (!channelRecipient.send(value)) throw;

selfdestruct(channelSender);

}

}

Alice可以调用这个函数中止通道。因为调用此函数需要Bob和Alice的签名,Bob不能单方面的关闭合约(从而不付Alice她应得的报酬)

因为此函数需要Bob和Alice两个人的签名才能执行,Bob和Alice都不能单方面的从合约里提钱。

如果Alice是恶意的,而且希望欺骗Bob:让Bob把钱锁进合约,但是Alice不干任何事,并且伪造一个交易(让合约送给Alice一半的钱)这种情况下,ChannelTimeout函数可以保护Bob:Bob可以等一天,然后调用, 把合约销毁,并把合约里所有的资金返回给Bob.

function ChannelTimeout(){

if (startDate + channelTimeout > now)

throw;

selfdestruct(channelSender);

}

Timeout 函数保证Bob 免受勒索

同时,在Bob和Alice的签名提交到公链之前,Bob没有Alice的签名。Bob不能单方面关闭通道从而免付Alice应得的报酬。如果Alice觉察到Bob没有付钱了,Alice可以关闭通道从而拿到她应得的报酬。唯一的损失是Alice可能损失她发最后一个推特的钱。同时Bob和Alice节省了大量的交易费!

一个支付合约就写完了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值