EOS上如何实现UTXO功能?
UTXO 究竟是什么?
UTXO 的全称是 Unspent Transaction Output (未消费的交易输出)。这概念首先是在比特币中使用,是个输出类型,可以是 “没花出去的” (UTXO)或 “ 花出去的”。一个钱包的余额,是追踪所有可花费的 UTXO,把它们加起来的总和。在交易时,支出方钱包花出去多个 UTXO,主网系统将生成新的 UTXO 到收取方钱包,如果收取方要 “找零” 给支出方,新的找零 UTXO 也会生成并返回到支出方钱包。所有 UTXO 显示的额度都是固定的,也改变不了,用户不能只花一部分 UTXO,而是要全部花出去。
用 UTXO 模型实现交易环节
这些设计上的限制是 UTXO 的特色。UTXO 不可变的特点,让程序员可基于 UTXO 开发出隐私算法。CoinJoin 是个很好的隐私算法案例,它就是用我们今天公布的代码做出来的!
代码
pEOS 团队致力于提供实用工具,以保护全世界人民的经济隐私。我们在最先进的区块链平台上,通过先进且高效的算法,实现交易的不可追溯性。
这个目标比打造 pEOS 更艰巨,我们的使命也涵盖了:市场教育、用户支持、工具开发、为 EOS 区块链赋予隐私相关的功能与技术。我们深信这么做能加速 EOS 生态多方全面的成熟。
基于这个理念,我们今天发布了一个智能合约,为基于 EOS 的代币实现比特币的 UTXO 功能。
(我们知道 Everipedia 团队也有在尝试开发 UTXO,但可惜的是,他们的开发方向更像是 “pay to key” 系统,这个系统缺少一些特性,不能基于它之上开发隐私算法,跟真正的 UTXO 不一样。我们在本文章后面会详细展开)
我们今天发布的代码,是在 pEOS 项目早前探索期写的。虽然有段时间了,但仍然非常有用。我们希望能协助其他项目团队,把真正的 UTXO 应用于他们的项目代币或项目本身中。
这个智能合约在基本代币协议之上,新增两个指令:loadutxo 与 transferutxo。在一般的 EOS 账号中,用户可执行 loadutxo 指令将资金转换成新的 UTXO,执行 transferutxo 实现 UTXO 的完整交易。
在 UTXO 模型下的交易指的是输入一定数量的 UTXO ,输出一定数量新的 UTXO,和比特币的交易方式是一样的。对于最常见的交易指令(比如发送币到新的账号,加上一次账号更改,或发送到一个普通的 EOS 账号),可以执行 Github 代码库里的命令行工具。此工具也可做为钱包,用于钥匙管理。
在 Jungle 测试网络上体验
这个系统已经部署于 Jungle 测试网络,大家可以使用命令行工具做测试。在测试网络上的智能合约名是netpeostoken。不用任何实参调用此工具将显示帮助画面:
操作输入时,在命令名后面加上 --help 将可获得更多帮助信息。
获得钱包信息,请使用 balance 命令如下:
获得 UTXO 的分析画面,请使用 balance -u 命令如下:
我们可以看到,这个钱包一共有 98.0000 PEOS,由 2 个 UTXO 构成,其中一个是 88.0000 PEOS,而另一个是 10.0000 PEOS,上述余额在 EOS 账号中是看不到的!
现在,我们试着把 11.0000 PEOS 的资金转给另一个人,他的地址是 EOS8Dj5BLdUe1iAi6xNJnZ3bvNEMxDHX6bf4DGesA8USTwj4byJES 。操作非常简单:
依据工具的 UTXO 选择策略,这将会把我们的 2 个 UTXO 都花掉,同时生成 2 个新的 UTXO,其中一个进入收取方的账号,另一个 “找零” 回到我们的账号。现在我们执行新的 balance 命令,看看我们的 UTXO:
你可以看到,一个新的地址产生了,在这个地址里有我们的 “找零”,而原先的 UTXO 被花掉了。
transfer 命令也可以用来执行 “从” (from)一个 EOS 账号转 “到” (to)另一个 EOS 账号。如果操作者在 “from” 与 “to” 的地址填写处,输入 EOS 账号名而不是 EOS 地址,工具将执行合适的指令,完成转账交易。
如果你需要收进 PEOS,你可以使用 receive 命令,操作如下:
你就可以把这个地址发给对方,让对方付 PEOS 给你。
此工具版本用了 EOSIO 原生钱包来创造并保护钥匙,同时为交易签名。我们建议用户使用 cleos 工具创造新的钱包,并安置工具于 clpeos 的配置中。
这工具还有很多功能,但超出了本文章的介绍范围。其他功能包括,输出交易但不传递信息、传播已撰写的交易。
pEOS 的 UTXO 与Everipedia 的 Pay2Key “UTXO” 区别在哪?
我们实现 UTXO 的方案与 Everipedia 的区别在哪?哪个更匹配开发者的需求?来看看以下几点:
Everipedia 的解决方案不能结合多个 UTXO 为复合交易做新的输出,所以做不到 CoinJoin 那样的匿名性。
Everipedia UTXO 不具备独特性且数值是可改变的。pEOS 的 UTXO 方案完全遵循正真正 UTXO 的定义,与比特币、门罗币等主流币的 UTXO 定义一致。Everipedia 的方案需要持续追踪每个账号,记录 UTXO 的数值更改情况。如果开发者想要以太坊的记账系统, Everipedia 方案就更加合适。
按时间排序的额交易记录会出现问题。
Everipedia UTXO 方案使用 IQ_UTXO 代币为媒介,而不是 IQ。pEOS 的方案可配合任何代币使用,不需要使用其他指定代币。
可见,两种方案各有用处。Everipedia 的方案可实现简易的记账、便捷的钱包功能,但实现不了 CoinJoin、RingCT、MimbleWimble 的算法。
pEOS 提议的方案,复制了比特币的 UTXO 模型,能实现所有隐私算法,实现真正的匿名性。
结语及 pEOS 的下一步
随着本次源代码的发布,我们希望能帮助所有 EOS 智能合约开发者。在此必须强调,这不是我们在白皮书中承诺的 pEOS 技术, 这只是其中的 5%。这也不是我们的钱包架构,我们将在未来的文章中介绍钱包架构。代码库里的命令行钱包工具只适用于 UTXO 合约测试,未做用户体验优化。
在接下来的开发进度文章中,我们将聚焦在优化的议题上,讨论如何优化 UTXO 的验证、创造 “SegWit” 模式的交易以释放出 EOS 主网的带宽及 CPU 资源。