Byteball的应用
数字资产
Byteball本质上是基于DAG的分布式数据库,数据状态一旦确定则不可逆转。在各种类型的数据中,具有社会普遍意义的数据是比较有价值的,比如个人资产数据。在Byteball中,资产可以发布、转移以及交换,类似于Byteball的基本货币bytes
。资产可以代表任何有价值的东西,比如债务、股票、会员积分、通话时间、商品、其它加密货币等。
定义新资产的消息格式为:
unit: {
...
messages: [
...
{
app: "asset",
payload_location: "inline",
payload_hash: "hash of payload",
payload: {
cap: 1000000,
is_private: false,
is_transferrable: true,
auto_destroy: false,
fixed_denominations: false,
issued_by_definer_only: true,
cosigned_by_definer: false,
spender_name_attested: true,
attestors: [
"2QLYLKHMUG237QG36Z6AWLVH4KQ4MEY6",
"X5ZHWBYBF4TUYS35HU3ROVDQJC772ZMG"
]
}
},
...
],
...
}
在定义新资产时,可以设置以下属性:
cap
:资产总量,比如bytes
的总量为$10^{15}$is_private
:资产转移是否公开,比如bytes
为公开is_transferrable
:资产是否可以在无发行方允许的条件下进行流通,如果不可流通,则资产的收发方中必须有发行方,比如bytes
为可流通auto_destroy
:资产在发送回发行方时是否自动销毁,比如bytes
为不自动销毁fixed_denominations
:资产是否以固定面额进行流通(类似纸币),比如bytes
可以以任意金额流通issued_by_definer_only
:资产是否仅由发行方发布,比如bytes
均在创世单元中发布cosigned_by_definer
:资产在每次转移时是否必须由发行方共同签名,比如bytes
是不需要的spender_attested
:资产在使用时用户是否需要通过认证,比如bytes
是不需要的attestors
:受资产发行方认可的认证地址,可以在后续过程中修改denominations
:如果资产具有固定面额,定义面额种类以及各类别总量transfer_condition
:资产转移需要的额外条件,语法与地址定义脚本相同(除了不使用sig
之外)issue_condition
:资产发布需要的额外条件
在定义资产时,每个单元中最多只能有一条asset
消息。当资产定义单元发布后,后续都通过引用该单元的hash来引用该资产。资产只能定义一次,除了attestors
之外均不能进行修改。资产定义的解释权在发行方,其具体含义由其进行解释。资产定义中的不同属性的组合可以适用不同的场景。
发布资产的消息格式为:
unit: {
...
messages: [
...
{
app: "payment",
payload_location: "inline",
payload_hash: "hash of payload",
payload: {
asset: "hash of unit where the asset was defined",
inputs: [
{
type: "issue",
amount: 1000000,
serial_number: 1,
address: "ISSUER ADDRESS" // only when multi-authored
},
...
],
outputs: [
{
address: "BENEFICIARY ADDRESS",
amount: 12345
},
...
]
}
},
...
],
...
}
总量有限的资产必须在一个交易中全部发布,比如,所有的bytes
都是在创世单元中发布的。如果资产总量有限,发布时serial_number
必须为1;如果资产总量不受限,每次发布时serial_number
必须保证不同。
转移资产与bytes
类似,只是需要加上资产的ID,其消息格式为:
unit: {
...
messages: [
...
{
app: "payment",
payload_location: "inline",
payload_hash: "hash of payload",
payload: {
asset: "hash of unit where the asset was defined",
inputs: [
{
unit: "hash of source unit",
message_index: 0,
output_index: 1
},
...
],
outputs: [
{
address: "BENEFICIARY ADDRESS",
amount: 12345
},
...
]
}
},
...
],
...
}
隐私资产
公开资产在转移过程中,其内容在交易中是完全公开的。而对于隐私财产,在转移时,仅发送特定时间点资产转移的证据;同时,发送者通过私有通道把资产发送给接收者;接收者可以通过区块链上的资产转移证据来验证是否得到该笔资产。
为了解决双花问题,需要在单元增加新的字段spend_proof
,要求:
- 它仅依赖于其所花费的输出,相同的输出将产生相同的
spend_proof
- 无法通过它逆向推断出所花费输出的任何信息
例如采用如下方式生成spend_proof
:
spend_proof = hash({
asset: payload.asset,
unit: input.unit,
message_index: input.message_index,
output_index: input.output_index,
address: src_output.address,
amount: src_output.amount,
blinding: src_output.blinding
})
其中,payload.asset
表示需要转移的资产,input
则表示花费输出src_output
的输入。隐私资产的输出必须包含扰乱因子blinding
,它使得无法通过spend_proof
来逆向推到出其使用了哪个输出。
对于隐私资产的发行来讲,其spend_proof
为:
spend_proof = hash({
asset: payload.asset,
address: "ISSUER ADDRESS",
serial_number: input.serial_number, // always 1 for capped assets
amount: input.amount, // issue amount
denomination: 1 // always 1 for arbitrary-amounts payments
})
在发行隐私资产时,由于需要公开表明已发行该资产,因此不需要添加扰乱因子。在资产传递过程中,发送者已知扰乱因子,虽然他可以知道接收者是否花费了这笔资产,但是他无法知道这笔资产的下一个接收者是谁,也就无法继续跟踪该笔资产的进一步流向了。
spend_proof
需要添加到区块链单元中,其格式为:
unit: {
...
spend_proofs: [
{
spend_proof: "the above hash in base64",
address: "SPENDING ADDRESS" // only if multi-authored
},
...
],
...
}
在发送隐私资产时,发送者需要完成以下几件事情:
- 对每个输出添加扰乱因子
- 将隐私资产通过私有通道发送给接收者,以及该资产传递所在的区块链单元
- 对于单元中每个输入,计算相应的
spend_proof
并加入单元中
接收者需要检查两件事情:
- 检查收到的隐私资产的
hash
值是否与区块链单元中的payload_hash
相同 - 检查通过收到的隐私资产计算得到的
spend_proof
是否与区块链单元中的匹配
接收者可以验证整个资产转移的过程,并能够回溯到该资产的发布单元。
Byteball中提供了一种隐私数字资产blackbytes
,其定义如下所示:
{
cap: 2,111,100,000,000,000,
is_private: true,
is_transferrable: true,
auto_destroy: false,
fixed_denominations: true,
issued_by_definer_only: true,
cosigned_by_definer: false,
spender_name_attested: false,
denominations: [
{denomination: 1, count_coins: 10,000,000,000},
{denomination: 2, count_coins: 20,000,000,000},
{denomination: 5, count_coins: 10,000,000,000},
{denomination: 10, count_coins: 10,000,000,000},
{denomination: 20, count_coins: 20,000,000,000},
{denomination: 50, count_coins: 10,000,000,000},
{denomination: 100, count_coins: 10,000,000,000},
{denomination: 200, count_coins: 20,000,000,000},
{denomination: 500, count_coins: 10,000,000,000},
{denomination: 1000, count_coins: 10,000,000,000},
{denomination: 2000, count_coins: 20,000,000,000},
{denomination: 5000, count_coins: 10,000,000,000},
{denomination: 10000, count_coins: 10,000,000,000},
{denomination: 20000, count_coins: 20,000,000,000},
{denomination: 50000, count_coins: 10,000,000,000},
{denomination: 100000, count_coins: 10,000,000,000}
]
}
数据
非结构化数据(文本)
用户可以在Byteball中存储文本信息,消息格式为:
unit: {
...
messages: [
...
{
app: "text",
payload_location: "inline",
payload_hash: "hash of payload",
payload: "any text"
},
...
],
...
}
文本可以是任意内容:用户可以利用这个发布不能被篡改的公告、微博等等;也可以存储一些非明文的内容,比如合约的hash值之类的。
结构化数据
用户也可以使用Byteball存储任意的结构化数据,消息格式为:
unit: {
...
messages: [
...
{
app: "data",
payload_location: "inline",
payload_hash: "hash of payload",
payload: {
key: "value",
another_key: {
subkey: "other value",
another_subkey: 232
}
}
},
...
],
...
}
投票
用户可以使用Byteball发起投票,消息格式为:
unit: {
...
messages: [
...
{
app: "poll",
payload_location: "inline",
payload_hash: "hash of payload",
payload: {
question: "Should the United Kingdom remain a member of the European Union or leave the European Union?",
choices: ["Leave", "Remain"]
}
},
...
],
...
}
同时,用户可以响应投票,其消息格式为:
unit: {
...
messages: [
...
{
app: "vote",
payload_location: "inline",
payload_hash: "hash of payload",
payload: {
unit: "hash of the unit where the poll was defined",
choice: "Leave"
}
},
...
],
...
}
投票的有效性需要由发起投票方来决定,Byteball仅仅检查投票选项是否在给定集合内。比如,如果发起投票方要求只允许经过认证的或在白名单上的用户进行投票,那些无效的投票也会被Byteball记录,需要由发起方自行判别。
认证
用户可以通过Byteball发布和存储个人信息,消息格式为
unit: {
...
messages: [
...
{
app: "profile",
payload_location: "inline",
payload_hash: "hash of payload",
payload: {
name: "Joe Average",
emails: ["joe@example.com", "joe@domain.com"],
twitter: "joe"
}
},
...
],
...
}
用户可以发布任意的个人信息,但是其真实性是无法保证的,只有通过认证的信息才是可信的。
认证消息用于确定用户发布的个人信息的真实性,其消息格式为
unit: {
...
messages: [
...
{
app: "attestation",
payload_location: "inline",
payload_hash: "hash of payload",
payload: {
address: "ADDRESS OF THE SUBJECT"
profile: {
name: "Joe Average",
emails: ["joe@example.com"]
}
}
},
...
],
...
}
认证消息中的个人信息不一定与用户自己发布的信息一致,事实上,用户甚至没有自己发布过个人信息。
Byteball中的认证者类似于现实世界中的实名认证,认证某个地址是归属于某个个人或组织。认证方可以向被认证方收取少量费用。一般来讲,见证人节点是需要通过认证的,这样可以提高手信任度。被认证方可以选择不公布认证信息,而只在Byteball中保存认证证据,并在合适的时机公布。
总结
Byteball是一种基于DAG结构的不可逆分布式数据库,它可以存储任何有价值的数据。Byteball中每一个新的数据单元都间接地确认了之前所有数据单元的存在性。对已达到稳定状态的数据单元的修改将变得不可实现。
相比于BTC和ETH,Byteball使用了DAG结构作为底层,并使用见证人作为共识机制,从而具有以下特点:
- 没有区块,只有交易单元,确认速度快
- 极少的手续费
- 交易单元具有最终状态
Byteball中发行了一种用于支付存储的货币bytes
,支付费用与所需要存储的数据大小相关。自由开发者可以在Byteball平台上自由开发各种应用,根据不同的应用场景发布相应的数字资产。在Byteball上面可以轻松地实现去中心化交易所、互助保险、赌球、彩票、投票、认证等等功能。Byteball还提供了类似telegram的加密端到端通道,可以实现用户之间的隐私通信。Byteball最与众不同的是,它提供了一种隐私数字资产blackbytes
,可以完整地保护使用者的隐私信息。
总的来说,不管从使用技术的先进性,还是其提供功能的多样性,Byteball都是区块链领域中的佼佼者。
版权所有。发布者:guantau,转载请注明出处:https://bbfans.org/2018/05/21/byteball-application-summary/