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;

    functionChannel(address to,uinttimeout) 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.

functionCloseChannel(bytes32 h, uint8 v, bytes32 r, bytes32 s,uintvalue){

    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.

functionChannelTimeout(){

    if(startDate + channelTimeout > now)

            throw;

    selfdestruct(channelSender);

}

Timeout 函数保证Bob 免受勒索

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

一个支付合约就写完了


参照

附:

ecrecover函数是由以太坊提供的一个全局函数,用于签名数据的校验。与上面所陈述的方式略有不同的是,这个函数返回的是签名者的公匙地址。如果返回结果是签名者的公匙地址,那么说明数据是正确的。

ecrecover(bytes32hash, uint8 v, bytes32 r, bytes32 s) returns (address)

ecrecover函数需要四个参数,需要被签名数据的哈希结果值,r,s,v三个值。通过前面的说明,我们知道r,s,v是分别来自签名结果串。

r= signature[0:64]

s= signature[64:128]

v= signature[128:130]

其中v取出来的值或者是00或01。要使用时,我们先要将其转为整型,再加上27,所以我们将得到27或28。在调用函数时v将填入27或28。

如果你使用以太坊的客户端进行签名时,它们会在你要签名的数据前增加前缀\x19Ethereum Signed Message:\n。

eth_sign

The sign method calculates an Ethereum specific signature with: sign(keccak256("\x19Ethereum Signed Message:\n" + len(message) + message))).

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342