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节省了大量的交易费!

一个支付合约就写完了

 

参照

附:

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

ecrecover(bytes32 hash, 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取出来的值或者是0001。要使用时,我们先要将其转为整型,再加上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))).

 

相关文章
|
2天前
|
数据采集 人工智能 安全
|
11天前
|
云安全 监控 安全
|
3天前
|
自然语言处理 API
万相 Wan2.6 全新升级发布!人人都能当导演的时代来了
通义万相2.6全新升级,支持文生图、图生视频、文生视频,打造电影级创作体验。智能分镜、角色扮演、音画同步,让创意一键成片,大众也能轻松制作高质量短视频。
1006 151
|
3天前
|
编解码 人工智能 机器人
通义万相2.6,模型使用指南
智能分镜 | 多镜头叙事 | 支持15秒视频生成 | 高品质声音生成 | 多人稳定对话
|
16天前
|
机器学习/深度学习 人工智能 自然语言处理
Z-Image:冲击体验上限的下一代图像生成模型
通义实验室推出全新文生图模型Z-Image,以6B参数实现“快、稳、轻、准”突破。Turbo版本仅需8步亚秒级生成,支持16GB显存设备,中英双语理解与文字渲染尤为出色,真实感和美学表现媲美国际顶尖模型,被誉为“最值得关注的开源生图模型之一”。
1699 9
|
8天前
|
人工智能 自然语言处理 API
一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸
一句话生成拓扑图!next-ai-draw-io 结合 AI 与 Draw.io,通过自然语言秒出架构图,支持私有部署、免费大模型接口,彻底解放生产力,绘图效率直接爆炸。
643 152
|
10天前
|
人工智能 安全 前端开发
AgentScope Java v1.0 发布,让 Java 开发者轻松构建企业级 Agentic 应用
AgentScope 重磅发布 Java 版本,拥抱企业开发主流技术栈。
613 13
|
9天前
|
人工智能 自然语言处理 API
Next AI Draw.io:当AI遇见Draw.io图表绘制
Next AI Draw.io 是一款融合AI与图表绘制的开源工具,基于Next.js实现,支持自然语言生成架构图、流程图等专业图表。集成多款主流大模型,提供智能绘图、图像识别优化、版本管理等功能,部署简单,安全可控,助力技术文档与系统设计高效创作。
687 151