• [quote="@lome"]

    说一声抱歉,由于最近比较忙,没有注意到你的问题。首先,如果你要发型一种通用货币,你肯定要说明该币的用途,及实现细节,这就是一个项目的白皮书,至于项目的代币分配百分比,肯定不能通过投票决定,当你准备发型一种加密货币,你肯定要在白皮书中说明你代币的分配及其用途。 [/quote]

    我的意思是怎么用EOS的代码实现投票决定新产生的两种币的分配比例,比如教学视频里的token a和token b,这两个币可以和eos以一定的比率兑换,但是应用场景是电商,所以不直接用eos,而是用token a和token b在电商系统里完成一些工作,比如支付。

    我不是很明白eos的投票机制,尤其是eos系统的代码层面,而网上这方面的资料又很少,所以想问问看你的想法。

  • [quote="@loyo"] 本文翻译自https://steemit.com/dpos/@dantheman/dpos-consensus-algorithm-this-missing-white-paper

    这篇缺失的白皮书是对DPOS(委托权益证明)的分析,这篇文章的目的是分析DPOS的工作原理和其鲁棒性的根源。DPOS的早期描述在https://bitshares.org,但是那篇文章包含了许多DPOS实际的共识过程之外的内容。

    所有区块链基本上都是一个通过交易驱动的确定性状态机,达成共识是就交易的确定性顺序达成一致并过滤无效交易的过程。有许多不同的共识算法可以产生等价的交易排序,但是DPOS已经通过多年来在多个区块链上的可靠运行证明了其鲁棒性、安全性、高效性。

    像所有的共识算法一样,块生产者可能造成的最大的危害是审查。所有的块必须严格的基于确定性开源状态机逻辑。

    DPOS算法总结

    DPOS算法被分为两部分:块生产者的选举和调度生产。选举过程确保利益相关者最终得到控制,因为当网络运行不顺利时,利益相关者会失去最大的收益。选举方法对于如何快速达成共识几乎没有影响,因此本文集中讲述块生产者产生之后共识的达成过程。

    为了分析算法,我假设三个快生产者A,B和C。由于共识需要2/3+1来解决所有的情况,这个简单的模型将假定生产者C是决定性因素。在现实中会有21个或者更多的生产者。像工作量证明,通常是最长链获胜。无论什么时候一个可信的节点获取到一个更长的链,它以更长的链为主链。

    我将通过例子展示DPOS在大部分可以想象的网络条件下是怎样运行的。这些例子可以帮助你了解DPOS的鲁棒性。

    正常情况

    正常情况下块生产者每三秒轮流生成区块。假设没有人错过它们的轮次,那么这将产生最长的链。一个区块生产者在任何它的轮次之外生成一个区块都是无效的。 aa.png

    少数情况

    多于1/3的几点是恶意的,故障的并且产生了少量的分叉。在这种情况下分叉链上每9秒生成一个区块,主链上每9秒生成2个区块,下一次轮询,这个主链会比分叉链更长。 bb.png

    少数离线节点双倍生产

    离线节点尝试去生成无数的分叉,但是所有的分叉比主链都更短,因为分叉上生产者只有少数,生产速度是受限制的比起主链生产者。 cc.png

    网络碎片

    网络碎片化很可能导致大部分块生产者丢失,在这种情况下,最长链会是最长的分叉链。当网络正常链接,除了最长链之外的链将自然的选择最长链为主链,并且达成明确的共识。 dd.png

    也可能这个三个分叉中有两个是一样长的,在这种情况下较短链的加入将打破僵局。块生产者人数为奇数,所有不可能一直保持分叉状态。稍后会将块生产者重新洗牌,随机化生产顺序去保证即使两个分叉链上块生产者有相同的数量,两个分叉的长度会不同情况的爆炸性增长,从而使得其中一条链成为主链。

    在线的少数生产者多重生产

    这种情况下,B生产者生产了两个或者多个可选择的块,下一个计划生产者c,可能选择在B所产生的任何一个块上生成区块。一旦c选择,那么他所选的这条链就是最长链,而所有选择B1的生产者都会切换到这条链上生产区块。少数的恶意生产者试图广播再多可选块也是无关紧要的,它们作为最长链的一部分永远不会超过一个轮训。 ee.png

    最新的不可逆块

    在网络碎片化情况下,可能会产生多个持续时间很长的分叉,在长时间的运行中,最长链将会胜出,但是观察者需要一种方法去确认一个块是最长链的一部分,这可以通过2/3 + 1的块生产者的确认来确定。

    在下面的图中,块B已经被A和C确认代表2/3+1的生产者确认,因此我们可以判定如果这2/3的生产者是诚实的,那么没有其他链比这条链更长。 ff.png

    请注意,这个“规则”类似于比特币的6块确认“规则”。一些聪明的人可以设计一系列事件使得两个节点的不可逆转块不同。这种边缘性的例子需要一个完全控制通信延迟的攻击者,并且长期利用这种控制,而不是两次或者几次。如果这种情况发生,那么,最长链的长期规则仍然起作用。我们估计这种攻击的可能性接近0,经济后果如此微不足道,以至于不值得担忧。

    缺乏生产者法定人数

    在不太可能的情况下,生产者没有明确的法定人数,少数人也可以继续生产区块。在这些块中,可以包含利益相关者的投票的交易。这些选票可能选出一组新的生产者,并将出块参与率恢复到100%,一旦如此,分叉链将最终超过所有其他以低于100%参与率运行的链。

    在这个过程中,所有的观察者都会知道,网络状态是不断变化的,直到一个有67%参与度的链条出现。这些选择在这些条件下进行交易的人所承担的风险与选择接受少于6个确认的风险类似。他们知道共识最终在另一个的分叉上建立起来的可能性很小。在实践中,这种情况比接受少于3个比特币交易确认的块要安全多了。

    大部分的恶意生产者

    如果大多数的生产者是恶意的生产者,那么将会出现无限的分叉,每一个分叉块都有多于2/3的确认使得链继续处于分叉状态,在这种情况下最新的不可逆转快将恢复到最长链算法,这个最长链将是最多支持的一个,这将由少数的诚实节点决定。这种行为不会长久,因为利益相关人将会投票代替这些生产者。

    gg.png

    交易作为权益证明(TaPoS)

    当用户在区块链的确定性假设的情况下才会签署一笔交易,他们的假设基于对最近的一些区块的看法。如果最长链上的共识发生变化,那么它可能会使签署者同意交易时的假设无效。 对于TaPoS,所有事务都包含最近块的哈希,如果该块不存在于链历史中,则被视为无效。任何在孤立分叉处签署交易的人都会发现交易无效,无法迁移到主分叉。 这个过程的一个副作用是防止企图产生替代链的远程攻击。每个利益相关者在每次交易时直接确认区块链,随着时间的推移,所有的利益相关方都会证实这一点,这是不能在伪造的链条中复制的。

    确定性生产者洗牌

    在所有的例子中,我们展示了块生产者的循环调度。实际上,每N个区块都有一组区块生产者被洗牌,其中N是生产者的数目。这种随机化确保块生产者B并不总是忽略块生产者A,并且任何时候都有多个相同生产者计数的分支,这些关系最终被打破。

    结论

    在每一个可以想象的自然网络中断的情况下,授权证明是强大的,甚至在少数生产者面临腐败的情况下也是安全的。与一些竞争算法不同,当大多数生产者失败时,DPOS可以继续运行。在这个过程中,社区可以投票替换失败的生产者,直到它恢复100%的参与。我认为没有其他的共识算法,在这样一个高度多样的故障条件下是稳健的。

    最终,DPOS从选择算法来选择块生产者和验证节点的质量和唯一性中获得显着的安全性。通过批准投票程序,即使是拥有50%有效投票权的人也不能单独选择一个单独的生产者。DPOS 旨在优化拥有强壮网络连接的诚实节点100%参与(共识过程)的这种虚拟状况。这使DPOS有能力以99.9%的确定性平均在1.5秒内确认交易,同时以优雅,可察觉的方式降级,这是微不足道的。

    其他一致性算法设计了一个网络条件较差的不诚实节点的虚拟状况。替代设计的最终结果是性能较低,延迟较高,通信开销较高的网络,如果有33%的节点出现故障,则会完全停止。

    在BitShares和Steem一年的成功运营中,我们经历了各种网络条件和软件错误。DPOS已经成功地驾驭了这个环境,并且证明了它能够在处理比其他任何区块链更多的交易的同时保持一致性。 [/quote]

    对于EOS里的DPoS, 如果我在智能合约里生成两种加密货币,怎么实现通过(选举的代理人)投票决定产生的两种加密货币(token a和token b)的分配百分比?有什么教学文档和视频吗?

  • DPOS 区块生产者的选举 at March 09, 2018

    @lome

    本文翻译自 https://bitshares.org/technology/delegated-proof-of-stake-consensus/ 的一部分

    选举矿工

    选择'witness(证人)'这个词是因为它是法律中代表中立的词汇(在这里我用矿工表示)。通常的智能合约都是需要矿工的签名。对于尤其重要的合约是需要一个公共的公证员来签名。矿工和公正员都不是合约的一员,但是他们对于合同是在指定的时间由指定的个人签署的的认证中起着非常重要的作用。在比特股中,矿工有一个和认证块中包含的交易的签名和时间戳相似的作用。

    在DPOS下,利益相关者可以选择任何数量的矿工来生成块,块是一组更新数据库状态的交易。每个账户允许给每个矿工投一票,这个过程被称为批准投票。通过总审批的前N名矿工被选中,证人的数量(N)被定义至少有50%的利益相关者认为这个数字可以分权。当利益相关者表达了他们期望的证人数字N,他们也必须给至少N个证人投票。利益相关者不能投票支持比实际投票的证人更多票。

    矿工每生成一个区块,他们会得到一些奖励,他们的奖励由利益相关者通过他们选出的代表来决定。如果一个矿工生产区块失败,那么他将不回得到奖励,并且在未来可能被投出。

    活跃矿工的名单在每次维护间隔(1天)内更新一次。然后被洗牌,并且每个矿工轮流在每2秒一个固定的时间表内产生一个块。所有的矿工都轮到以后,将进行一次洗牌。如果矿工在他们的时间段内没有产生一个区块,那么该时隙将被跳过,然后下一个矿工挖下一个区块。

    任何人都可以监控网络健康通过观察矿工的参与率,任何时候矿工的参与低​​于一定水平,网络用户可以允许更多的时间进行交易确认,并且对他们的网络连接要格外警惕。此属性为BitShares提供了独特的优势,即在故障发生后不到1分钟,就可以提醒用户潜在的问题。

    通过选定的代表进行参数更改

    代表以与矿工类似的方式选出。 代表成为特殊帐户的共同签名者,该特殊帐户有权提出对网络参数的更改。 这个帐户被称为创始帐户。 这些参数包括交易费用,块大小,矿工工资和块间隔。 在大多数代表批准了拟议的变更之后,利益相关者被授予2周的审查期,在此期间他们可以对代表投票并使提议的变更无效。

    这种设计的选择是为了确保代表在技术上没有直接的权力,网络参数的所有变化最终都得到了利益相关者的认可。 这样做是为了保护代表不受可能适用于加密货币的经理或管理员的规定的影响。 在DPOS下,我们可以确切地说,行政权力掌握在用户手中,而不是代表或证人。

    与矿工不同的是,代表们不是有偿职位。 但是,这些参数预计不会经常变化。

    起源账户在技术上可以执行任何其他账户可以执行的任何操作,这意味着可以将资金发送到起始账户或指定起始账户作为托管代理。 创始账户也可以用来发行新的资产。 选举代表可以帮助利益相关者执行需要高度信任和责任感的任务,其数量不胜枚举。

    更改规则

    有时需要升级网络来添加新的功能。 在DPOS下,所有的改变都必须由积极的利益相关者的批准来触发。 虽然矿工在技术上可能单方面串通和改变他们的软件,但这样做并不符合他们的利益。 矿工的选择是基于他们对区块链政策保持中立的承诺。 保持中立保护矿工免受网络的管理人员/管理人员/业主/经营人的指控。 矿工只是利益相关者的雇员。

    开发人员可以实施他们认为合适的任何更改,只要这些更改取决于利益相关方的批准。 这一政策对开发者的保护就像保护利益相关者一样,并确保没有任何人单方面控制网络的方向。

    改变规则的门槛与替换51%的当选矿工相同。 利益相关者参与选举矿工越多,就越难改变规则。

    最终,更改规则取决于网络上的每个人升级他们的软件,没有区块链协议可以强制如何改变规则。 这意味着只要坚持代码普遍预期的行为,就可以在不需要利益相关方投票的情况下推出硬分支“错误修复”。

    在实践中,只有安全关键的硬件应该以这种方式来实施。 开发商和矿工应该等待利益相关者批准即使是最微小的变化。

    最大限度地分散

    在DPOS下,每个利益相关者的影响力与其利益成正比,没有利益相关者被排除在影响之外。 市场上的其他每一个共识系统都不包括绝大多数利益相关者的参与。 有许多不同的方法可以替代利益相关者。 一些替代方案使用仅限邀请的系统。 其他人通过让参与费用高于他们的收入来排除参与。 其他的系统在技术上允许每个人都参与,但是他们可以安全地被一些产生绝大多数块的大型玩家所忽视。 只有DPOS确保块生产平均分配给大多数人,每个人都有一个经济上可行的方式来影响这些人是谁。 [/quote]

    对于EOS里的DPoS, 我在智能合约里生成两种加密货币,怎么实现通过(选举的代理人)投票决定产生的多种加密货币的分配百分比?有什么教学文档和视频吗?

  • @Lwu97

    对于EOS里的DPoS, 我在智能合约里生成两种加密货币,怎么实现通过投票决定产生的多种加密货币的分配百分比?有什么教学文档和视频吗?

  • EOS 编程学习日志 (1) at March 08, 2018

    [quote="@lome"] [quote="@orangetime"] 有例子说明如何在智能合约里发新的币吗?(比如新的币要应用在电商场景) [/quote] 官方给的 currency 实例。 [/quote]

    补充一个教学视频:

  • EOS 编程学习日志 (1) at March 06, 2018

    有例子说明如何在智能合约里发新的币吗?(比如新的币要应用在电商场景)

  • 注册 eosfans 送 eos 啦 at March 06, 2018

    0xcD2c17611D0130383EEB70022639c4ba383C5E06

  • I used your code for hello contract, any idea to fix the following error?

    ./eosioc set contract currency ../../tools/hello/hello.wast ../../tools/hello/hello.abi
    Reading WAST...
    Assembling WASM...
    Publishing contract...
    1006357ms thread-0   main.cpp:981                  main                 ] Failed with error: Assert Exception (10)
    status_code == 200: Error code 500
    : {"code":500,"message":"Internal Service Error","error":{"code":10,"name":"assert_exception","message":"Assert Exception","details":"!\"unresolvable\": env.assert","stack_trace":[{"level":"error","file":"wavm.cpp","line":34,"method":"resolve","hostname":"","thread_name":"thread-0","timestamp":"2018-03-05T22:16:46.348"},{"level":"warn","file":"wavm.cpp","line":36,"method":"resolve","hostname":"","thread_name":"thread-0","timestamp":"2018-03-05T22:16:46.350"},{"level":"error","file":"wasm_interface.cpp","line":207,"method":"fetch_entry","hostname":"","thread_name":"thread-0","timestamp":"2018-03-05T22:16:46.352"},{"level":"warn","file":"apply_context.cpp","line":31,"method":"exec_one","hostname":"","thread_name":"thread-0","timestamp":"2018-03-05T22:16:46.352"},{"level":"warn","file":"chain_controller.cpp","line":256,"method":"push_transaction","hostname":"","thread_name":"thread-0","timestamp":"2018-03-05T22:16:46.353"}]}}