Counterparty技术文档


原文:https://github.com/PhantomPhreak/Counterparty


[size=20pt]Counterparty协议[/size]


摘要


Counterparty是基于比特币传输层的协议,是基于时间戳和发布证明的一类服务。


所有的钱包管理是由Bitcoind/Bitcoin-Qt来处理的:用户必须指定一个他想要交易Counterparty的地址。


可参考的实现方式就是counterpartyd,在这里可以找到https://github.com/PhantomPhreak/counterpartyd.


解析


所有的Counterparty消息有下面的标识符:


一个源地址
一个目标地址
如果存在的话,要发送的从源地址到目标地址的比特币数量。
交易费,在比特币协议中,用来付给矿工将此笔交易加入到区块中。
超过80字节的混杂“数据”, 嵌入在比特币交易中,包含在OP_RETURN输出中。
为了身份识别目的,每一笔Counterparty交易“数据”场包含“CNTRPRTY”字符串作为前缀,以UTF-8的方式编码。 这个字符串是足够长的,确保存于OP_RETURN场中的伪随机数的交易不会被误认为是Counterparty的交易。在测试中,这个字符串简化为“XX”。


每一笔载有Counterparty的交易必须在一个和三个输出之间:目标输出(可选),数据输出(必须的),以及改变输出(可选),按顺序来。改变输出对于Counterparty来说并不重要。


目标输出的存在,以及Bitcoin交易费用大的部分和所交易的Bitcoin,依赖于Counterparty消息类型,由数据场中的4字节来决定,这4字节会紧跟随标识符前缀。剩下的数据有一个指定的消息类型格式,在源代码里有描述。


每一笔Counterparty交易必须有一个独立并且清晰的源地址:所有包含Counterparty交易的比特币输入交易必须一致——在比特币中独立的基金源地址就是在Counterparty里面交易的源地址。


一笔Counterparty交易的源地址和目标地址就是比特币地址本身,而且任何比特币地址可以接受任何Counterparty的资产(并且可以发送,如果有的话)。


所有的消息按顺序解析,一次一个,除了订单和赌注过期外,忽略所有的区块边界。


消息类型


Send 发送
Order 订单
BTCPay BTC支付
Issue 发布
Broadcast 广播
Bet 赌注
Dividend 股息
Burn 烧
Cancel 取消
Send 发送


一条发送消息从源地址向目标地址发送一定数量的任何形式的Counterparty资产。在消息被解析的同时(按交易的序列),如果发送者没有足够的资产在发送地址上, 那么这次发送是无效的。


Order 订单

一笔“订单”就是给予一笔特定数量的特定资产的同时获取一定数量的其他形式资产作为回报。在“买单”和“卖单”之间没有本质的区别。 资产在被解析的时候,该资产立即被代理执行。也就是说,如果有人想要以1 XCP的价格购买2 BTC,那么一旦他发布了订单,他的余额中会扣除1 XCP。


当一笔订单在区块链(blockchain)中出现的时候, 协议尝试去匹配,确定地,用另一个之前就出现在区块链中的订单去匹配。两笔匹配的订单被称之为“订单匹配” 。如果任何一笔匹配的订单中涉及到比特币,那么此笔订单匹配被分配到“等待BTC支付”的状态,直到相应的比特币支付(BTCPay)交易被发布。否则的话,此笔交易被协议本身分配的参与地址立即执行在他们的新的余额上。


所有的订单是限制性订单:一笔卖单价格(asking price)就一笔指定比率的某人想要多少价钱来购买和支付的订单;一笔订单以最优的价格匹配了开放的订单,那么这笔订单就以这个价格与之匹配。也就是说,如果一笔订单以0.11 XCP/BTC的价格开价,而另一笔以0.12 XCP/BTC价格开价 ,那么任何形式的新的以0.14 XCP/BTC开价的买单将会匹配第一种卖单,所以XCP和BTC将会以0.11 XCP/BTC的价格成交。


所有的订单允许解析执行;这里没有非所有或者零订单(而且芝加哥板块选项交易也不允许这样)。如果,像先前的例子一样,买家想要购买的比特币数量比第一笔卖的数量要多,那么剩下的买单将会填充之后存在的卖单。在所有可能的订单实现匹配之后,当前的买单本身就被列在开放的订单之中。如果有多个开放的订单以同样的价格存在的话,最早下单的将会最先匹配。


开放订单在用户指定数量的区块(blocks)之后过期。 匹配订单在等待比特币支付的时候,一旦买单跟卖单任何一方过期了,匹配订单随之过期。在所有的订单以及匹配订单过期的时候,代理基金将会把最初拥有的基金归还给双方。


通常来说, 不会存在一笔欺骗性订单,因为每个团体的资产存在于代理之中。尽管如此,不可能代理比特币,那些尝试购买比特币的用户可能要寻求只有支付矿工交易费用的比特币订单来与之匹配。另一方面,当创建一笔卖比特币订单的时候,用户可以支付任何他想支付的费用。


等待比特币支付一笔匹配的订单在一条btcpay消息之后完成,消息存于OP_RETURN输出中,只有由组成匹配订单交易的hashes来填充。


Issue 发行

资产通过发行消息类型来发行: 用户挑选名称和数量,相应地,协议来信任他的地址。资产ID必须唯一或者是一个被之前同一地址发行过的。当重新发行一笔资产的时候,也就是说,发行比已经存在的更多的资产的时候,可分割性和发行地址必须匹配。


资产名称由大写的ASCII字符串组成,当被编码成十进制整数的时候,比26^3大且比256^8小:所有的资产名称,除了“BTC”和“XCP”必须至少4个字母长度。 资产名称被存于8字节无符号整数的OP_RETURN场中。


资产既可以分割,也可以不分割,可分割的资产被分割为8位十进制的位置上。


在一个给定名称下发行资产的权限可能被转移到另一个地址上。一笔包含此转移的交易必须不是他自己发行的任何形式的资产。否则的话,发行零数量的资产会被翻译成锁的状态,不可逆的,在询问中发行资产,保证拥有者不会通货膨胀。


Broadcast 广播

一条广播消息发布带有时间戳的文本和数值信息,作为广播的一部分序列被称之为“给予”。一个给予(feed)跟一条地址相关联:任何从一个给定地址的广播是那条地址给予的一部分。 给予的时间戳必须单调的递增。


赌注是由一条数值给予构成,其值可能是一种货币的价格,或者是部分代码用来描述未来的可能分散的产出事件。例如,有人可能想要描述一个像这样的文本代码,“US QE on 2014-01-01: dec=1, const=2, inc=3”,而且公布其结果为“US QE on 2014-01-01: decrease!”,随带1作为其值。更为复杂的赌注机制可能会在链下发布。


一个单一的由空字符串文本信息组成的广播的发布可以锁住给予,而且可以阻止任何进一步从源地址和任何新的主题的赌注进行(如果给予被锁住了,而有一个开放的赌注和未处理的与之匹配的赌注,那么那些赌注已经匹配的赌注将会过期而没有任何损失)。


一个给予由发布他的地址来标识。


Bet 赌注

现在有两种形式的赌注。第一种是有特定给予的赌注,将会等于(或者不等于)一个确定的值——一个目标值——在最后期限。第二种是定义好日期的不同合同。两种简单的相等或者不相等的赌注以及牛市或者熊市CFDs将他们的赌注放在与之匹配的代理中,而且他们在最后期限将被处理。CFDs,实际上可能会强制清算,在那时候如果一笔给予的值移动太多将代理耗尽的话。


CFDs可能具有杠杆性,而且他们的杠杆水平被指定在5040等于相应的单位被以整数的形式存起来:一个5040的杠杆水平意味着赌注应该以1:1的形式执行,10080的水平意味着一个给予增长的点包含合同中两点增加(减少)的牛市(熊市)的值。


CFDs没有目标值而且相等或者不相等赌注不能够杠杆化。尽管如此,对于两个相匹配的赌注,他们的杠杆水平,最后期限以及目标值必须一致。否则的话,他们会像订单一样匹配,出了赌注的胜率跟订单的价格成反比例关系(胜率(odds)=赌注(wager)/柜台赌注(counterwager)):每个被匹配的赌注,如果可能的话,将会给最高胜率的赌注,尽可能的。


0不是一个有效的目标值,而且赌注匹配(合同)不会被空值的广播所影响。


赌注在其所参考的最后广播的给予的时间戳之后不能有最后期限。


赌注跟订单一样,以相同的方式过期,例如在特定的区块(blocks)之后。赌注匹配在2016区块之后过期,这个区块在最后期限的时间戳之后。


赌注费用跟初始化的赌者成比例,而不是跟所挣的。


Dividend 股息

股息支付是一定数量的XCP的支付,对每一个持有相应的资产的人,按比例的支付。股息——既可以是可分割的资产也可以是不可分割的资产。股息支付可以从任何发源的地址支付。


Burn 燃烧

Counterparty的本身余额货币,“XCP”,将会通过“烧”比特币以矿工交易费的形式,在特定的燃烧期间使用燃烧消息类型。每个BTC可以挣到的XCP的数量用下面的公式计算:


XCP_EARNED = BTC_BURNED * (1000 * (1 + .5 * ((END_BLOCK - CURRENT_BLOCK) / (END_BLOCK - START_BLOCK))
END_BLOCK是结束区块(区块号283810)以及START_BLOCK是开始区块即燃烧阶段的开始(区块号278310)。越早烧,价格越好,可能会介于1000和1500 XCP/BTC之间。


燃烧消息已经精确的以字符串“ProofOfBurn”的形式存于OP_RETURN的输出中。


Cancel 取消

TODO
不能够取消在等待BTC支付的订单(如果买BTC,不公平;如果卖,没必要)。


***************************************************************************************************
欢迎转载,注明出处。
喜欢的话,打赏点吧:152oBitoBwHwxR5UpUQnsvWSFjYHkheDJk
关注我的微博:http://weibo.com/520Bit
***************************************************************************************************