飞猪币官网欢迎您!

首页 > 资讯 > 正文

飞猪币之分布式详解

发布时间:2018-09-05 11:03:53

分布式合同是指一种使用飞猪币和别人在飞猪币块链上达成协议的方法,合同不会使得以前不可能的事情变成可能,但是,它们能让你以信任最小化的方式来解决现实问题。信任最小化在合同签订过程中避免人类判断,通常会使得事情变得更方便,因此可由程序实现完全的自动化。



飞猪币

 

通过构建与飞猪币交互的最低信任协议,能够创建以下全新产品:

智能资产:能通过块链进行原子交易和贷款的资产。

可转移的虚拟资产:能交易但不能复制的数字资产

代理:是指自治的程序,维护着它们自己的钱包,它们用钱来购买服务器运行时间,代理通过出售服务来挣钱,如果用户需求超过代理的计算能力,它们能生成子代理,这些子代理能否存活要看它们能否得到足够多的业务。

分布式市场:是一种实现点对点债券和股票交易的方法,可使得飞猪币进化成一个能与互联网金融系统分庭抗礼的竞争者。

飞猪货币交易所:是一种在社交网络上实现分布式货币交易的方法。

本文还列出了一些更小的例子。

许多底层飞猪币合同的思想,由NickSzabó在他的开创性研究《Formalizing and Securing Relationships on Public Networks》中最先提出,

 

1对内存池交易替换机制的警告

本文是指飞猪币的一种特殊机制,能使用交易数据结构中的nSequence参数替换内存池中的交易。因为考虑到有人会利用它来实施DOS攻击,这种机制已经在2010年禁用,目前所有相关代码被完全删除。开发者必须注意这点,如果他们开发的程序要与目前钱包兼容,就不要创建依赖于内存池替换的合同机制。如果飞猪币将来再一次允许内存池替换,本文将会更新。

2理论

每个飞猪币交易都有一个或多个输入和输出,每个输入/输出都有一个小的纯函数与之相关联,我们称之为脚本,脚本可包含简化形式交易的签名。

 

每个交易有一个锁定时间,使得该交易处于特定状态并且可被新交易替换,直至锁定时间来临。预定时间可以是块索引或时间戳(这两个因素使用同一个内存项,小于5亿是块索引,大于5亿是时间戳)。当一个交易的锁定时间到了,我们称之为终结。

每个交易的输入都有一个序列号,对于正常发送币的交易,该序列号为UNIT_MAX,锁定时间为0。如果锁定时间还未达到,但所有的序列号为UNIT_MAX,该交易也被认为是终结。序列号用来发布交易的新版本,无需验证其他输入的签名。例如:在一个交易中,每个输入都来自于不同的一方,每个输入的序列号都是0,这些序列号可以独立增加。

签名验证是很灵活的,因为交易的签名方式可以通过SIGHASH符号控制,该符号附加在签名后面。通过这种方式能构建特殊的合同,交易的每个输入方只对交易的一部分签名,因而每个输入方能单方面改变该交易的一部分内容,而无需其他输入方的参与。SIGHASH符号分为两部分,一种模式和一个ANYONECANPAY指示器。

(1)SIGHASH_ALL:这是默认模式。它指示一个交易除输入脚本外,所有部分都被签名。对输入脚本进行签名显然是不可能的,那样无法构建一个交易,所以脚本总是不被签名。尽管如此,要注意的是,输入的其他属性如输出、序列号等都会被签名。直观地说,它的意思是“我同意把我的钱放进去,如果每个人都把他们的钱放进去,并且输出正是我想要的。”。

(2)SIGHASH_NONE:输出没有被签名,可以是任何内容。使用这种模式意味着“我同意把我的钱放进去,如果每个人都把他们的钱放进去,但我不关心输出什么“。这种模式使得其他输入方可以通过改变输入序列号来更新交易。

(3)SIGHASH_SINGLE:像SIGHASH_NONE一样,输入被签名,但序列号没有。因而其他人可以创建交易的新版本,然而,唯一的输出也被签名。该模式说明”如果输出正是我想要的,我同意放钱进去,我不关心其他人的输入。“

ANYONECANPAY指示器可以与以上三种模式联合使用,当设置了ANYONECANPAY时,仅仅是该输入被签名,其他输入可以是任意内容。

脚本可以包括CHECKMULTISIG操作码,该操作码提供了n-of-m的签名验证:你可以提供多个公钥m,定义必须出现的有效签名个数n,签名个数n可以小于公钥数量m。如果我们设置以下脚本,则一个输出需要两个签名:

2 2 CHECKMULTISIGVERIFY

有两种通用方式来安全地创建合同:

(1)在P2P网络之外传递部分完成或无效的交易。

(2)使用两个交易:创建一个交易(合同交易),先签名但不马上广播,在达成合同并且被锁定在内存中后,广播另一个交易(支付交易),最后再广播合同。

用以上方式来保证人们知道他们达成的合同内容。这些特性可以让我们在块链基础上创建有趣的、创新的金融手段。

示例1:提供押金证明

想像你在一个网站(论坛或WIKI)上注册了一个帐号,想在网站运营者处建立你的信用,但是你没有以前的名誉来支撑你的信用。一个解决方案是向网站付点钱购买信用,但是如果你关闭帐号,可能想要回这部分钱。你对该网站的信任程度不足以让你存钱到该网站,因为担心网站会花掉你的钱。另一个风险是,某一天该网站有可能消失了。

 

建立信用度的目的是你作出某种奉献,让网站知道你不是一个垃圾机器人。但是你不想网站花掉你的钱。如果网站运营者消失了,你最终想让钱回来,而无需他们的任何许可。

我们通过合同来解决这个问题:

(1)用户和网站相互发送各自新生成的公钥

(2)用户创建交易TX1(支付交易),该交易支出10个BTC到网站地址,用户创建了TX1但不广播。

(3)用户把TX1交易的HASH值发送给网站。

(4)网站使用TX1的HASH值创建交易TX2(合同),TX2花掉TX1的钱并且支付到用户地址。注意:TX2需要双方签名,因而该交易不完整,nLockTime被设置成未来时间(比如六个月后),输入的序列号为0。

(5)最终,这个不完整的交易TX2(一半已签名)被回送给用户,用户检查合同是否如预期-六个月后10BTC最终会回到他的地址-除非情况有变,因为序列号为0,如果双方同意,合同可以被修订。该交易的输入脚本不完整,因为用户未签名,用户对合同签名并且把签名放到合适的位置。

(6)用户先广播TX1,再广播TX2。

在这个阶段,用户和网站都不能单独得到10BTC。六个月后,合同完成,即使网站消失了,用户也能得到币。

如果用户想提早关闭帐号,又该怎么处理呢?网站创建新版的TX2,nLockTime设为0,并且输入的序列号设为UINT_MAX,重新签名,把该交易发回用户,用户签名后广播该交易,就能提早结束合同并且释放10BTC。

如果六个月快到了,而用户想保留他的帐号,又该怎么办呢?类似的事情发生了,合同使用新的nLockTime,序列号比以前的序列号大1,双方重新签名,广播2^32次。无论发生什么,双方都必须同意,才能真正改变合同。

显然,如果该用户被证明是有恶意的(例如:垃圾邮件发送者),网站不会同意提早结束合同。如果用户有太多的滥用行为,则网站可以要求增加押金数量,或者要求延长合同时间。

示例2:担保和争端调解

一个买家想和他不认识或不信任的某人交易,在一般情况交易正常进行时,买家不想任何第三方参与。但如果交易出现问题时,他想有一个第三方-也许是一个专业的争端调解服务-来决定谁能拿到钱。注意:这个概念同时适用于买家和卖家。例如:调解员可向商家要求邮资证明,以判断是否发货。

 

换句话说,某人想锁定某些币,在第三方同意的情况下,才能被花掉。

(1)和商家一起引入一个调解员(如:ClearCoin)

(2)得到商家的公钥K1,得到调解员的公钥K2,创建自己的公钥K3

(3)把K2发给商家,商家生成一个随机数挑战调解员,调解员用K2的私钥签名,用来证明K2确实属于调解员

(4)创建一个交易TX1,包括如下输出脚本并且广播该交易。

2 3 CHECKMULTISIGVERIFY

现在这些币被锁定了,如果要解锁这些币,需要使用以下几种方式:

(1)客户和商家同意(无论是成功的交易,还是在没有调解的情况下商家同意回退给客户)

(2)客户和调解者同意(失败的交易,调解者认同客户,正如退款)

(3)调解者和商家同意(商品已经发送,尽管有争议,商家还是得到币)

当对输入签名时,内容被设为相关联的输出。这样,为了从这个交易中得到币,客户创建包含两个签名位的脚本,自己签一个,再把未完全的交易发给商家或者调解员,请求第二个签名。

示例3:保证合同

保证合同是建造公众商品时的集资办法,公众商品是指,一旦建成,任何人都可以免费享受到好处。标准的例子是灯塔,所有人都认同应该建造一个,但是对于个人航海者来说灯塔太贵了,灯塔同时也会方便其他航海者。

 

一个解决方案是向所有人集资,只有当筹集的资金超过所需的建造成本时,每个人才真正付钱,如果集资款不足,则谁都不用付钱。

在保证合同集资方面,包括频繁的、小额的、经常自动进行的集资,例如互联网电台的资金和网页翻译等,飞猪币优于传统的支付方式。考虑有一个浏览器的插件可供你发送一点币,它能检测当前页面的语言并且广播一个集资请求,用于把该页面翻译成你的语言。如果使用该插件的许多用户同时查看该页面(例如:该页面从高流量的网站链接过来),足够的集资请求广播出去,到达一定的金额时,可自动付钱给一个高质量的翻译公司,当翻译完成后该页面自动在你的浏览器中加载。

我们能以飞猪币方式建立以下模型

(1)主办方创建新的捐赠地址,宣布如果筹集资金超过1000BTC,则将建造该商品,任何人都可以捐赠。

(2)捐赠者创建一个新交易,把一定数量的钱打到集资地址,但是他们并不广播该交易。该交易与常规的交易相似,除了三个不同点:首先,不能做任何改变,如果你没有正确的输出金额1000BTC,你必须先创建一个;第二,输入脚本要以SIGHASH_ALL|SIGHASH_ANYONECANPAY的模式签名;最后,输出值是1000BTC,注意这不是一个有效的交易,因为输出值比输入值大得多。

(3)把交易上传到主办方的服务器上,他们保存到磁盘上,随时更新捐赠的币数量。

(4)一旦服务器获得了足够的币,它将把所有捐赠者上传的独立交易合并成一个新交易,该交易只有一个输出,仅仅把钱付到捐赠地址,该输出与每个捐赠者的交易的输出部分相同,而输入部分则是所有捐赠者输入的集合。

(5)完整的交易被广播,发送捐赠的币到捐赠地址中。

这样的场景依靠协议的几个方面,首先使用了SIGHASH符号,SIGHASH_ALL是默认模式,意味着要签名所有交易的内容,除了输入脚本。SIGHASH_ANYONECANPAY是附加的指示器,意味着签名仅覆盖自己的输入部分-不签名其他人的输入,这样其他人的输入可以留空。使用这些符号,我们能创建这样一个签名,即使在其他输入添加进入后,该签名依旧是有效的。但如果输出内容或其他的交易部分被改变了,该签名就无效了。第二,输入值小于输出值的交易是无效的(原因很明显),这就意味着捐赠者把发送币的交易发送给主办方是安全的-因为主办方不可能得到这些捐赠币,除非他加上其他的输入值等于或超过输出值。

不使用SIGHASH_ANYONECANPAY指示器也可以创建保证合同。不需捐赠者创建交易的集资方式有两个步骤,一旦达到集资的总金额,主办方就创建包含所有捐赠者输入的交易,然后依次在捐赠者中传递,每个捐赠者对该交易签名。但是,先使用SIGHASH_ANYONECANPAY指示器,然后合并交易,这样可能更方便一些。

保证合同可以保证下一个块的资金网络安全,通过这种方式,即使一个块中的交易数量比较少,挖矿也能挣钱(因为保证合同的交易一般占用空间大,因而要付出更多的网络转帐费)。

Tabarrok在他的论文《The private provision of public goods via dominant assurance

contracts》中详尽描述了保证合同的概念,在一个通用保证合同中,如果合同失败了(在预定时间内集资不足),主办方给捐赠者支付网络转帐费,这种类型的合同旨在鼓励捐赠者,积极参与总是正确做法。

上一篇
飞猪币背后不为人知地一大算法:椭圆曲线算法

联系我们

Flypigcoin@qtum.org

Flypigcoin版权所有 © 2018