美文网首页比特币&区块链研究
Clemens Ley 关于 BitcoinToken 的微信问

Clemens Ley 关于 BitcoinToken 的微信问

作者: 1a8661c5a646 | 来源:发表于2018-09-16 16:36 被阅读2次

    翻译:Andy、linzheming   

    校对:老刘  

     AMA主持:邱少贤   

    英文原文采访内容整理:老刘

    背景资料

    阅读本文前,建议先看完老刘整理的《BitcoinToken的参考资料》a。本次问答的英文原文参见 ClemensLey BitcoinTokenWeChat AMA b

    AMA问答

    Clemens Ley 是 BitcoinToken 的创始人。开发人员很快就能用在BCH区块链上发token,并用javascript语言写智能合约了。Clemens 在本月早些时候的一次 聚会演讲中 首次介绍了他对 token 的一些想法 。

    2018年9月12日,他在一个微信群中举行了一次“你问我答”的活动。参与的人包括来自中国的矿工和开发者。其中有来自BTC.com,BTC.top和Rawpool的代表进行了提问。为清楚起见,问答的内容有稍做调整。

    来自矿工和开发者的问题

    1. BitcoinToken会像编译器一样将Javascript编译成比特币的汇编脚本吗?

    BitcoinToken可以被认为是一个编译器,它可以将(用Javascript编写的)智能合约编译成可以发布,传输和交易 token 的Javascript包。生成的Javascript包将非常容易使用,即使对于对比特币一无所知的人也是如此。例如,要发 token,用户只需如下几行 Javasript 代码:

    consttoken =newBitcoinToken()

    token.name ='MyToken'

    token.supply = 21000000

    await token.create('./ erc20.js')

    await token.send(500,myFriendsPublicKey)

    文件“./erc20.js”将包含用Javascript来编写的智能合约。以下是此类文件的示例:

    async function isValid (tx:Transaction): boolean{

    constsumInputs = tx.inputs.reduce((a,b)=> a.data + b.data,0)

    constsumOutputs = tx.outputs.reduce((a,b)=> a.data + b.data,0)

    returnsumInputs === sumOutputs

    }

    其他人可以编写其它如“erc20.js”的合约。如果写合约的人愿意和社区分享这个合约,任何人都利用此文件轻松地发布相同类型的 token 而无需创建新的合约。

    Javascript 代码是被翻译成 Bitcoin Script 里的操作码吗?

    不,它没有被翻译成操作码。比特币脚本中的操作码不足以表达智能合约。

    你在哪里放置 Javascript 文件:在比特币区块链或其他文件系统,如 IPFS?

    我的计划是将js文件存储在区块链中。我将JS文件存储在交易输出脚本上。

    这样我们就可以在发行token的转账中创建合约规则,然后由每个用户找到并以此规则验证,是这样吗?

    是的。

    由于比特币区块链存储有限,大的合约可能无法在链上保存?

    我们会把大的合约拆成小的,放在多个输出脚本里。

    BitcoinToken 不会把所有的 JS 代码保存到链上,只保存合约或是验证代码对吗?

    是的,只存验证 token 转移的合约代码。在大多数情况下,它不会非常大。它也可以链接到现有文件,这样我们只需要存储一次智能合约就够了。

    你使用 P2SH 来保存 Javascript 代码吗?

    是的。

    2. 是否有我们可以用来编译的 Javascript 子集?

    出于安全原因考虑,我们需要使用一些沙盒技术。这就可以包含一个有合适语言行为的 Javascript 子集。细节尚未完全确定。有一家非常好的计算机安全公司在给我们提供建议。

    3. BitcoinToken 的限制是什么,例如哪个用例很难实现?

    在表达能力(可以表达的智能合约类别)上,我认为没有限制。我认为 BitcoinToken 可以表达所有可以在以太坊中表达的智能合约。

    我现在还不确定哪些例子难以实现。像 erc20,erc721 这样的基本合约将非常简单,并且很容易在沙盒外用代码库实现。更复杂的智能合约,如投票、点对点打赌和拍卖,将需要更多的工作。一旦有人实现了这些智能合约之一并愿意与社区分享他们的工作,我们也可以将它们变成库文件。一旦发生这种情况,它们将像 erc20 token一样易于使用。

    4. 与 Solidity 或 WHC 相比,BitcoinToken 的实际成本是多少?它会为用户和矿工节省更多成本吗?我不是在谈论手续费。

    使用 BitcoinToken 一开始是免费的(矿工费除外)。之后,我可能会使用一种商业模式,开发人员可以免费创建和发行 token,但是一旦他们超过某个收入门槛就必须要付费了。他们可以用 bitcoin 或是他的自己创建的 token 来付费,因为这样对他们来说也是最简单的。

    在 WHC 中,用户需要为发行 token、向多个用户发送 token、以及其他交易付费,否则这些行为可能会有 DoS 风险。在我看来,这种方法存在两个问题:首先,用户哪怕想在主网上试一下,也需要付费。其次,他们必须先买 WHC 币来付费。这会让入门门槛变高。

    与以太坊相比,BitcoinToken 将更便宜,因为 BCH 的交易费的中位数通常比以太坊的1/100。

    5. BitcoinToken Javascript 是图灵完备的吗?

    我认为目前在智能合约里的图灵完备目前没有一个明确的定义。但是,我认为(约95%的确定性)BitcoinToken 可以表达以太坊中表达的每个智能合约。因此,如果您认为以太坊是图灵完成的话,那么 BitcoinToken 也是如此。

    6. 我们如何优化 Javascript 编译后的代码?

    这是一个很宽泛的问题。可以说在过去80年左右的时间,传统编程语言的编译器一直在进行优化,但仍然是一个难题。我还不知道我们将如何为 BitcoinToken 做到这一点。但是我想指出,传统的软件已经过优化,可以实现低时间或空间复杂度。在智能合约的情况中,我们必须为低成本而进行优化。这将在未来几十年为计算机科学家提供许多有趣的工作。

    7. 我们是否需要把编绎后的 Javascript 代码转换回去,这容易实现吗?

    BitcoinToken 需要在 Web 浏览器中工作,因为这样可以构建非托管应用程序。因此,最终到达用户终端的代码都会是 Javascript。可以对 Javascript 代码进行混淆,但是某种程度上是可以解混淆的。

    8. 我们如何使用比特币的输入来保存区块链中智能合约的状态?

    智能合约的状态将存储在输出脚本中。

    但这不是很有限吗?例如有一百万持有人的代币合约。

    一种思考方式是:数据将在区块链上,程序将用 JS 编写,也存储在区块链中(类似于以太坊)。每个持有者将有一个输出,存储着与他相关的状态(如他的账户余额)。

    9. token 转账是否支持零确认?

    BitcoinToken 上的零确认与 BCH 的零确认一样安全。如果您要转移 1 美元的 token,接收方将乐意接受零确认。如果 token 价值100美元,接受方可能会选择等待几个确认。

    BitcoinToken 的零确认足够安全吗?

    是的,BitcoinToken 的工作方式与 BCH 相同,所以是一样安全的。这与Omni(以及WHC)形成鲜明对比,他们的零确认不仅不安全,而且基本上不可能。这使得 WHC 在即使是中等吞吐量要求的应用中,也难以用现有形容满足。

    10. BitcoinToken 是否支持 SPV 钱包?普通用户使用它的门槛是什么?

    支持的,因为它就像比特币一样。用户的要求是客户端要能执行 JS 代码。

    11. 它是否设置了约束以防止无限循环,例如以太坊上的燃油手续费机制或其他方式?您将如何预防恶意代码所造成的风险?

    这些都是非常重要的问题,因为它们涉及到了矿工的安全问题,从而可能是整个比特币现金网络的安全问题。值得注意的地方是,BitcoinToken 所提供的智能合约不会被矿工执行。只有收到该token的用户才会运行实际的 Javascript 。如果 Javascript 包含一个(可能是隐藏的)无限循环,则用户的客户端进入无限循环,而不是矿工。结果将是没有人能够接受这样的token,这将使它变得毫无价值。攻击者发行使用户进入无限循环的 token 得不到一点好处。

    BitcoinToken 并没有给矿工带来新的可攻击点。它的工作方式与比特币完全相同,矿工甚至不会注意到它的存在。如果您是专业 BCH 矿工,您也同样能处理好 BitcoinToken 无需任何改变。

    12. 您对大量使用 op_return 并将数据放入其他节点以确定其含义的看法是什么?你认为从长远来看这会对比特币造成损害吗?

    我不认为 op_return 是放置数据的正确位置。其中两个原因:

    首先,op_return 未来可能会被修剪掉。我想把数据放在区块链上的原因正是因为我能保证它不会被修剪。可以被修剪的数据最好不要放在区块链中。

    第二个更重要的原因:op_return 中可以存 token 的转帐信息。但是它也可能以错误的方式被使用,这可能导致问题。比如说:Omni 容易受到块重组这一事实恰恰是因为 op_returns 中的 token 流以错误的方式编码。在 Omni 中修复它将非常混乱并且容易出错并且将导致非常糟糕的性能(在某些情况下,必须在重组后重新解析 token 的整个历史)。解决该问题的最简单方法是更改比特币并强制执行指定交易排序。但应用程序写入错误代码时,不应当去改 Bitcoin。

    你能解释一下这一句吗:“... omni容易受到块重新排序这一事实正是因为 op_return 中的令牌流以错误的方式编码。”

    不好意思我不能,因为我无法很好的解释这里面的细节。我是根据 Mastercoin(和Omni)创始人对别人的问题回答c来判断的。

    我对此的唯一解释是他们以错误的方式编码了token的传输信息。当我开发 BitcoinToken 时,我甚至没有想到这一点。我只是试着让它尽可能地与比特币相似。这样 BitcoinToken 不会受到块重组的干扰,就像比特币一样。

    13. 与其他 BCH token 方案比,BitcoinToken 的优缺点是什么?

    这是一个广泛的问题,因为现在有这么多新提案。我尽量长话短说。

    OP_GROUP 需要更改比特币协议,BitcoinToken 不需要。

    RSK使用一个基于不同的挖矿网络(联合挖矿,但仍然是不同的挖矿网络)的侧链,这比直接在比特币现金上构建的 token 安全性低

    Tokeda 需要一个(或多个)可信任的第三方。BitcoinToken 是无需第三方信用背书的

    我所知道的所有其他方法(Omni,SLP,Counterparty,EPOBC,Coinspark,Colu,Open Assets)都不可编程。每个只支持一种小范围的,硬编码的智能合约。这些智能合约仅对极少数应用程序有用。在过去10天里,我曾与七家公司进行了交谈,都希望使用我的软件。他们都不需要千篇一律的解决方案,他们都需要定制智能合约。目前,只有 BitcoinToken 可以做到这一点。

    14. 我们如何使用输出脚本存储一些复杂状态?持有人余额只是一个很简单的场景。

    好问题。我们必须要解决好这个问题。我有一些初步想法,但想以后再分享。

    15. BitcoinToken 是基于 UTXO 模型还是基于帐户模型?

    BitcoinToken 的构建与比特币类似。因此它像比特币一样基于 UTXO 模型。

    16. 再确认一下:我认为我们通过利用比特币交易来解决双花问题。我们不能在一个块中发生冲突,因此传输 token 是零确认安全的。是这样吗?

    它与接受比特币的零确认一样安全。双花 BitcoinToken 生成的 token 的唯一方法是将包含 token 传输的比特币双花掉。

    17. 您将如何支持不可交换的 token?有办法实现吗?

    一般的token要求输入所花费的数量等于输出创建的数量。要做一个不可交换的 token,必须验证比特币交易的输入和输出中 token 集合相等而不是数量相等

    async function isValid(tx:Transaction):boolean {

      const sumInputs = tx.inputs.reduce((a,b)=> a.data + b.data,0)

      const sumOutputs = tx.outputs.reduce((a,b)=> a.data + b.data,0)

      return sumInputs === sumOutputs

    }

    18. 如果钱包意外地将染色币用于错误的输出脚本,会发生什么情况?token 会被销毁吗?

    在某种程度上智能合约开发人员可以防止这种情况发生,但如果智能合约开发人员不关心或者一些边界情况,token 可能会丢失。有几种解决方案。最简单的方法是在初始化token钱包时使用新的私钥。不要在任何其他钱包中使用该密钥,也不能花费 token 承载交易。或者,我们可以使用特殊地址类型,如染色币,但这不会立即可用。

    你的意思是 token 可以被销毁,但不会影响 BCH 的交易正常进行?

    是。如果用户广播无效的 token 转账,那么他会销毁掉里面的 token。BCH是保持不变的(因为矿工根本不知道有只能合约这回事)。

    19. 我们可以使用 BitcoinToken 控制比特币(不仅仅是 token)的流转吗?如果可以,请分享一些例子。

    另一个好问题。可以,但我想不出有啥好的例子需要用这种方式的。您可以编写一份智能合约,要求您只能发送偶数个比特币。如果用户要发送奇数的比特币,他将使 token 无效(如果没有 token 则不是问题)。BCH 仍然是安全的。

    不是最好的例子,但我只是想说,你可以强制执行任何可以在 JS 中编码的属性,给定事务的 JSON 表示。

    20. 您刚才说我们需要将 JS 代码分到多个转账里。你现在如何存储 JS 代码,以及钱包需要做多少工作才能正确解码 token?

    目前我只能存一个输入脚本可以放得下的javascript代码长度。使用某种机制可以很容易地在多个输出上展开更长的文件。我只是还没有去实现这一点。

    21. 为什么选择直接存储Javascript而不是编译操作码?有什么好处?

    有许多 Javascript 程序无法用比特币脚本表达,因此我们无法编译成比特币脚本。当然,我们可以将JS代码编译成任何形式的汇编代码,这将同样可以工作。如果用户有需求,我将会创建这个工具。

    22. BitcoinToken项目现在如何进展?产品发布的任何时间表或路线图?

    我正努力在几周内准备好原型,以便让开发者把玩。如果一切顺利的话,主网的发布将计划在年底进行。我将把我的原型提供给选定的一些想要在BItcoinToken之上构建应用的开发人员。如果您想在BitcoinToken之上构建一些东西,请发送电子邮件至clemens@bitcointoken.com,我会为您安排。

    23. 是否需要 每个 相关用户都来运行嵌入在转账中的JS代码?

    有可能可以定制BitcoinToken,这样就不必让每个用户在每个实例里都运行代码。例如,token的发行方式受信任的。该发行方可以验证所有token转账。如果用户信任发行方,他们就不必验证任何内容。这在需要低延迟或高吞吐量的应用中非常有用。在这个模型中,用户只需检查区块链上是否存在转账,这会超级快。尽管一些用户可以出于效率原因选择信任发行方,但是其他用户可以很容易审核被信任的发行方。如果发行方欺诈,则会在区块链上留下证据,并可以被其他用户揭发。

    24. 鉴于最近社区发生的事情,如果链分裂成多条,token会怎样?在两个链上都有效,还是说用户需要选择其中一个?

    另一个好问题!BitcoinToken方案下,token就像比特币一样,会存在于两个链上。

    25. 存在一种攻击情形:我发行一个代码中带有无限循环的token。我将一个token发送到一个地址。此地址的钱包服务提供商需要运行合约代码,因为他们希望向其用户显示任何收到的token。当钱包服务提供商运行代码时,它们会受到攻击。钱包服务商如何避免此类攻击?不说矿工受到攻击,而是说钱包提供商受到攻击。钱包服务商需要运行代码,是那种基于客户端服务器模型的轻钱包。

    对于客户端钱包,只有接收方必须运行代码,而不是钱包提供商。获取令牌的用户的计算机进入无限循环,生态系统的其余部分不受影响。如果钱包在服务器上,那么服务器可以设置一个时间限制并说:我们只运行在一秒钟内终止的智能合约。如果用户想要运行计算成本更高的智能合约,他将不得不使用客户端钱包。

    26. 如果在11月15日升级时比特币现金出现拆分,那么BitcoinToken会选择哪种区块链 ?( 不要问你会选择哪一方,只想从开发人员的角度知道哪个方向对比特币更有前途)

    我不认为比特币现金足够大,可以再次分叉并且两个分叉都能存活下来。我会在那个幸存下来的链上。

    如果在比特币现金发生分叉,我认为这将是灾难性的。最大的问题是信任受到侵蚀。竞争总是存在的。

    你们(指矿工,译者注)恰恰是可以防止分叉的人。别让他们分叉。如果我们没有提前搞砸的话,我们可以将比特币现金变成令人惊奇的东西。

    27.oken数量如何被编码,在转账输出中的比特币的数额里,还是在转账输出的其他部分?金额或ScriptPubKey?

    token数量编码在交易输出中。令牌的所有者可以花费该输出并将token发送给另一个用户。

    那么在输数额里,不在ScriptPubKey里?

    哦对不起。不是在satoshi数额里。在ScriptPubKey里(这里应该是说在脚本里,译者注)。

    Clemens 对矿工的问题

    Clemens Ley也对出席的矿工和开发人员提出了一些问题。个别与会者从他们自己的角度提供反馈。

    1. 我可以请这个小组中的更多人评论他们对允许非标准脚本的看法吗?

    Xiaohui:我非常支持它,当然,必须找到一种确保安全的方法。

    Edward:我们确实需要非标准的脚本。

    linzheming:在我看来,这将给钱包服务提供商带来相当大的挑战。我将密切关注这一进展。

    Clemens回复linzheming:如果只允许我们用那一种非标脚本,那对于钱包提供者来说会更容易实现。

    2. 挖矿中的痛点/问题是什么?

    Jason:其实现在并不太多。但是对于更大的块,矿池需要协同工作以实现快速可靠的块广播。BCH的当前代码库在交易事务及区块的广播方面无法处理压力测试。

    imcoddy:我认为矿工们的竞争力不够。从压力测试来看,我认为有些矿池池可以在这部分做得更好。现在我看到Rawpool正在积极调查SV和ABC的好处,这对我来说是一个好兆头。我们也担心集中化,但我个人希望更多的矿工参与竞争并提供高可扩展性和服务,以使BCH成为真正的全球现金。

    3. 采矿当前的瓶颈是什么?也就是说,如果块太大,软件的哪一部分会出问题?

    Jason:我们已经设法在3月初使用比特币ABC 0.17.1测试32MB块。我们通过重构我们的矿池后端来为此做好准备。瓶颈是比特币客户端本身。它无法在测试中产生大块。虽然有些矿池还没有为大块做好准备,但是修复他们的后端应该不是大问题。在压力测试期间,通过观察我们池中的不同节点,块高度延迟达6分钟。大多数节点的mempool大小差异超过10 MB。

    程序只是崩溃?你是否看到一些有价值的错误信息?

    Jason:没有崩溃,但是块的延迟很高。我想很多人都应该注意到 TX Highway 和 TxStreet 在压力测试日的mempool大小的巨大差异 。转账没有在BCH网络中顺利广播。我们所有节点都运行相同的比特币ABC。我们需要进行更多测试和基准性能评测来形成一份精确的报告。现在,我只能通过观察来说。

    问题是验证大块需要太长时间吗?

    Jason:不,验证不是压力测试中的瓶颈。许多节点甚至可能都没有收到块。在我们3月份测试32MB的过程中,我们模拟了一个300MB的mempool并挖掘了32MB的块。区块校验在我们的测试中不是问题。但是,我们没有测试验证时的最差情况。

    4. 您是否知道有人确定了块验证时间如何与块大小一起缩放?也就是说,验证大小为100kb,1mb,10mb的块需要多长时间......

    Jason:目前,验证时间与大小呈线性关系。由于我们每MB有sigop限制。发送交易方面还有很大的提升空间。我们还没有像比特币中的 Fibre 这样的东西。我们也愿意在BCH上测试紧凑块实现。

    linzheming:如果系统是无权限的,我认为我们确实存在竞争,但我不知道比特币的系统是否迫使我们更加集中化。

    Lise:Amaury之前告诉我,他们认为传播和验证比CTOR本身复杂得多。这就是他们试图突破的目标。

    5. 块验证时间与网络延迟相比如何?

    Jason:是的,现在32MB可能会有问题。但我们需要测试CTOR可以带给我们多少收益以及是否还存在其他可能的解决方案?

    6. 您对CTOR与TTOR有什么看法?有没有人进行实验比较两者?

    imcoddy:我认为Rawpool目前正在测试SV和ABC,他们已经与双方的开发者联系。如果我们这次不急于推出CTOR,这次可能采取不升级策略吗?我们现在可能不会有大于32 MB的巨大块,但是新启用的SV操作码可能会导致分裂。

    Jason:我们愿意进行测试。目前,SV和ABC在主链上完全相同。为我们提供测试用例会很有帮助。我承认我们缺乏与开发者的沟通。我们在最近的0.18公告中才知道了这一点。

    Lise:作为一个矿池,David和我都认为社区很有可能达成协议而不是分裂。虽然ABC和nChain似乎有相反的意见,但还有很多其他利益相关方在双方支持更加实际的立场。例如,我刚刚翻译了比特币无限的Andrew Stone的一篇文章,他认为CTOR是一种不切实际的分片方式。一些团体表示他们支持CTOR,但也同意更大的块。

    Clemens:我认为我们应该在两者之间进行竞争。让两个团队准备他们的解决方案,然后我们测量每个解决方案验证不同大小的块所需的时间。我将很乐意提供帮助。在做出类似的重要决定之前,我们至少需要一些数据。我个人认为绝对没有必要急于求成。我们在比特币现金中没有扩容问题。我们知道现在的系统在目前还是有效的。如果我们要更改的话,我们应该非常确定我们在做什么。

    7. 您如何看待比特币现金的现有token解决方案?您希望token解决方案有什么功能?

    linzheming:我不太关注token解决方案,但我认为如果一个可信方能够以非常低的成本发行token作为数字票证,它将会有很大帮助。

    Edward:我们需要智能合约的token方案。BCH上已经有一些token方案了,但智能合约方案不多。Wormhole ,Keoken和BitcoinToken是目前仅有的三种智能合约解决方案。我们应该在这些解决方案中找到并选择最强大,最简单的一个。虫洞现在已经可以发token了,智能合约部分可能会在明年初上线。Keoken的token功能将在几周后发布,后续会增加智能合约。@姜家志JZ 是虫洞的主要开发者,我可以介绍你们认识。

    8. 您是否愿意扩展标准脚本集或甚至允许所有脚本?

    linzheming:我对开放所有脚本没有意见。我们可以看到我们可以用这些砖块建造什么。在此之前我甚至不知道边界在哪里。我认为关于比特币脚本的争论最多的是无状态的性质。

    imcoddy:我认为我们还没有完全理解比特币能做什么,脚本系统是个等待着人们去挖掘的隐藏宝藏。我个人认为,作为金钱,它需要稳定,问题在于脚本系统是否足以让人们在其上构建东西。BitcoinToken是一个很好的尝试,但我们确实需要更友好的工具来帮助开发人员更快地制作应用程序。我并不反对在基础层上添加更多内容,但我们需要知道协议的每次修改的优缺点,这真正需要更多的测试和良好的处理。


    a.《BitcoinToken的参考资料》

    链接地址:https://share.bitkan.com/zh/article/blog/20074

    b. Clemens Ley BitcoinToken WeChat AMA

    链接地址:https://share.bitkan.com/zh/article/blog/20781

    c. Mastercoin(和Omni)创始人对别人的问题回答  

    链接地址:https://bitcoin.stackexchange.com/questions/17935/how-is-the-security-of-mastercoin-different-than-that-of-bitcoin

    相关文章

      网友评论

        本文标题:Clemens Ley 关于 BitcoinToken 的微信问

        本文链接:https://www.haomeiwen.com/subject/qqlfnftx.html