├── eros.jpg ├── eros_whitepaper_en.md ├── README.md ├── eros_install.md ├── eros_whitepaper.md └── eros_whitepaper_zh.md /eros.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AveiroPlatform/docs/HEAD/eros.jpg -------------------------------------------------------------------------------- /eros_whitepaper_en.md: -------------------------------------------------------------------------------- 1 | title: Whitepaper 2 | --- 3 | 4 | # 0 Introduction 5 | 6 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Eros documents 2 | 3 | ## 文档索引 4 | 5 | - [白皮书](./eros_whitepaper_zh.md) 6 | - [部署](./eros_install.md) 7 | -------------------------------------------------------------------------------- /eros_install.md: -------------------------------------------------------------------------------- 1 | # Eros 节点安装 2 | 3 | ## 1 系统要求 4 | 5 | - Ubuntu/Windows 64 位操作系统 6 | - Mysql 5.7 7 | - Redis 3.2 8 | - 必须有公网ip 9 | - 建议CPU 2GHZ以上 10 | - 建议内存2G以上 11 | - 建议带宽2Mb以上 12 | - 建议剩余硬盘空间20GB以上 13 | 14 | ## 2 安装 15 | 16 | 测试版(testnet)与正式版(mainnet)除安装包、配置文件内容不一样外,安装流程是一样的
17 | 只要端口不冲突,可以同时在一台机器安装,但不推荐这样做,除非机器配置足够好
18 | 节点使用Redis + Mysql做数据缓存/存储,Eros启动前必须先安装好他们 19 | 20 | ### 2.1 Windows版安装 21 | 22 | 0.Windows上确保开启了时钟同步服务 23 | 24 | 1.下载解压Eros,下载地址 25 | `http://7xqp0w.com1.z0.glb.clouddn.com/testnet-2.0.20.rar` 26 | 27 | 2.下载安装Mysql 5.7.22 28 | 29 | 直接在官网下载,下载链接为 30 | 31 | [https://dev.mysql.com/downloads/mysql/](https://dev.mysql.com/downloads/mysql/) 32 | 33 | 选择 Windows 64 位版本 34 | 35 | ![win-mysql-download](http://7xqoxy.com1.z0.glb.clouddn.com/wmysql_20180506091749.png) 36 | 37 | 3.下载安装 Redis 38 | 39 | 下载链接为 40 | [https://github.com/MicrosoftArchive/redis/releases](https://github.com/MicrosoftArchive/redis/releases) 41 | 选择Redis-x64-3.2.100.zip下载 42 | 43 | 解压之后,先打开 redis.windows.conf,将第60行 44 | ``` 45 | # bind 127.0.0.1 46 | ``` 47 | 改为 48 | ``` 49 | bind 127.0.0.1 50 | ``` 51 | 保存之后,命令行下运行 52 | ``` 53 | redis-server.exe --service-install redis.windows.conf --loglevel warning 54 | redis-server.exe --service-start 55 | ``` 56 | 将Redis注册为系统服务并启动 57 | 58 | 4.新建一个Mysql数据库 59 | 60 | 安装完毕Mysql后,您可以使用自带的Mysql Workbench,连接数据库服务端,并新建一个数据库,假设Schema的名字为blockchain,务必选择 utf8_general_ci 编码方式 61 | 62 | ![win-mysql-create](http://7xqoxy.com1.z0.glb.clouddn.com/win-databasename_20180506092955.png) 63 | 64 | 5.进入Eros目录,修改config/volatile.json 65 | ``` 66 | "__comment": "mysql connection configuration", 67 | "database": "", 68 | "username": "", 69 | "password": "", 70 | "host": "localhost", 71 | "dialect": "mysql", 72 | "port": 3306 73 | ``` 74 | database为第四步新建的Schema的名称,例如blockchain。username可以使用root,然后填入密码。如果您使用Mysql云服务,也需要修改host等字段 75 | ``` 76 | "port": 10086, 77 | "publicIp": "", 78 | ``` 79 | port默认10086,您可以选择任意一个未被占用的端口。然后填入您的公网ip 80 | ``` 81 | "forging": { 82 | "secret": [], 83 | "access": { 84 | "whiteList": [ 85 | "127.0.0.1" 86 | ] 87 | } 88 | }, 89 | ``` 90 | 在secret里填入您的受托人密钥。如果没有,则不填。可以去官网注册受托人 91 | ``` 92 | "forging": { 93 | "secret": [ 94 | "xxx1", 95 | "xxx2" 96 | ], 97 | }, 98 | ``` 99 | **注意** 不管是一台机器还是多台机器,绝不要配置重复的受托人密钥 100 | 101 | 6.进行到这步,命令行下运行 102 | ``` 103 | node ./bin/migrate.js --up 104 | ``` 105 | 然后运行 106 | ``` 107 | node startup.js --test 108 | ``` 109 | 如果没有报错,则说明一切正常 110 | 111 | 7.启动服务,运行 112 | ``` 113 | node startup.js 114 | ``` 115 | 116 | ### 2.2 Linux版安装 117 | 118 | 0.Linux上需要ntp服务,可运行`service --status-all`查看服务是否正常运行。可自行运行 119 | apt-get/yum/zypper等包管理器工具安装ntp 120 | 121 | 1.下载解压Eros,下载地址 122 | ``` 123 | wget http://7xqp0w.com1.z0.glb.clouddn.com/ltestnet-2.0.20.tar.gz 124 | ``` 125 | 126 | 2.安装Mysql 5.7.22 127 | 128 | 直接在官网下载,下载链接为 129 | 130 | [https://dev.mysql.com/downloads/mysql/](https://dev.mysql.com/downloads/mysql/) 131 | 132 | 选择 Linux - Generic 64位版本 133 | 134 | ![linux-mysql-download](http://7xqoxy.com1.z0.glb.clouddn.com/lmysql_20180506091835.png) 135 | 136 | 下载链接 (`https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.22-linux-glibc2.12-x86_64.tar.gz`) 137 | 138 | 安装完毕之后,启动服务,并创建一个新数据库,假设名称为 blockchain,创建数据库应使用下面的语句: 139 | 140 | ``` 141 | CREATE SCHEMA `blockchain` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; 142 | ``` 143 | 144 | 3.下载安装Redis,建议使用Redis3.x的版本,您可以在官网下载源码,本地编译生成可执行文件。启动前,注意将`redis.conf`中 145 | ``` 146 | # bind 127.0.0.1 147 | ``` 148 | 改为 149 | ``` 150 | bind 127.0.0.1 151 | ``` 152 | 并保存,运行 153 | ``` 154 | redis-server redis.conf 155 | ``` 156 | 启动redis,您也可以将redis注册为服务,以后重启机器会自动运行 157 | 158 | 4.进入Eros目录,修改config/volatile.json 159 | ``` 160 | "__comment": "mysql connection configuration", 161 | "database": "", 162 | "username": "", 163 | "password": "", 164 | "host": "localhost", 165 | "dialect": "mysql", 166 | "port": 3306 167 | ``` 168 | database为新建的Schema的名称,例如blockchain。username可以使用root,然后填入密码。如果您使用Mysql云服务,也需要修改host等字段 169 | ``` 170 | "port": 10086, 171 | "publicIp": "", 172 | ``` 173 | port默认10086,您可以选择任意一个未被占用的端口。然后填入您的公网ip 174 | ``` 175 | "forging": { 176 | "secret": [], 177 | "access": { 178 | "whiteList": [ 179 | "127.0.0.1" 180 | ] 181 | } 182 | }, 183 | ``` 184 | 在secret里填入您的受托人密钥。如果没有,则不填。可以去官网注册受托人 185 | ``` 186 | "forging": { 187 | "secret": [ 188 | "xxx1", 189 | "xxx2" 190 | ], 191 | }, 192 | ``` 193 | **注意** 不管是一台机器还是多台机器,绝不要配置重复的受托人密钥 194 | 195 | 5.进行到这步,命令行下运行 196 | ``` 197 | ./eros migrate --up 198 | ``` 199 | 然后运行 200 | ``` 201 | ./eros test 202 | ``` 203 | 如果没有报错,则说明一切正常 204 | 205 | 6.启动服务,运行 206 | ``` 207 | ./eros start 208 | ``` 209 | 210 | 7.其他命令 211 | 212 | ``` 213 | ./eros migrate --down 214 | 清空数据库 215 | 216 | ./eros status 217 | 查看服务运行状态 218 | 219 | ./eros upgrade 220 | 升级服务,如果有新版本,则会自动下载解压替换并重启服务 221 | 222 | ./eros ismainnet 223 | 是否是主网络 224 | 225 | ./eros stop 226 | 关闭服务 227 | ``` 228 | 229 | ### 2.3 问题定位 230 | 231 | ![redis-err](http://7xqoxy.com1.z0.glb.clouddn.com/redis-err.png) 232 | 233 | 出现这个报错的原因应该是redis没有启动起来 234 | 235 | 236 | ![mysql-err](http://7xqoxy.com1.z0.glb.clouddn.com/mysql-table-err.png) 237 | 238 | 出现这个报错应该是数据库的表还不存在 239 | 240 | ``` 241 | Incorrect string value 242 | ``` 243 | 244 | 出现这个报错应该是数据库编码问题。创建数据库的时候指定 utf8_general_ci 245 | -------------------------------------------------------------------------------- /eros_whitepaper.md: -------------------------------------------------------------------------------- 1 | title: Eros技术白皮书 2 | --- 3 | 4 | # 0 引言 5 | 6 | Eros是最新一代的去中心化应用开发平台。本文将详细描述Eros系统的设计原理,实现机制,优势以及应用场景。 7 | 8 | # 1 Eros是什么 9 | 10 | Eros系统是基于nodejs的区块链商业应用与开发平台。Eros本身的形成也是“站在巨人的肩上”,在研读了早期的一些开源项目之后,我们提出了Eros的设计目标: 11 | 12 | 1.使用Es6等新一代编程规范 13 | 14 | 2.底层对性能要求高的部分使用C++ 15 | 16 | 3.使用关系型数据库,支持多种数据源 17 | 18 | 4.实现运行JavaScript的防假死智能合约VM 19 | 20 | 5.改进DPOS,但不增加共识负担 21 | 22 | 6.支持内存型数据库 23 | 24 | 7.可应用于私有链、联盟链、公有链 25 | 26 | 8.支持松耦合的链-链价值互通 27 | 28 | # 2 Eros如何实现 29 | 30 | Eros大部分使用JavaScript语言实现,在耗费CPU计算资源的部分则采用C++实现,这可以显著加快代码执行速度。JavaScript不支持多线程,为此我们专门开发了一个多线程模块[hydra](https://github.com/ErosPlatfrom/hydra),这种设计方式可以有效提高对CPU多核的利用率进而提高整个系统并行度。 31 | 32 | 经过实际测试,用C++模块实现签名、校验等计算,比起Javascript实现快至少10倍,hydra模块提供的多线程编程模型又可以将这些复杂计算型任务交给CPU的其他核心完成。Eros的架构设计尽可能做到将系统的并行能力发挥到极致。 33 | 34 | 依托于nodejs技术平台,前端,客户端和App都可以使用一套技术栈,这将有效降低后续的研发和使用成本。这无论对Eros团队还是对Eros链的使用者,都是有帮助的。 35 | 36 | ## 账户系统与交易范式 37 | 38 | Eros使用帐户来存储用户的信息,这些信息包含余额、公钥、二级密码等字段。一笔交易按照既定规则改变这些字段的值。任何一笔交易都可以看作一个 矩阵算子,而所有账户信息的字段则组成一个向量。这样我们就可以采用数学的语言描述区块链系统了。 39 | 40 | 经过研究和思考,我们认为一个设计良好的区块链系统应该至少满足以下两个范式。现总结如下: 41 | 42 | **范式一** 任何一笔交易都对应一个矩阵,其作用于账户字段,而这样的矩阵应该是可逆的。 43 | 44 | **范式二** 作用于字段向量的每一个矩阵都应该是对角的。 45 | 46 | 满足范式一意味着交易容易被撤销,否则需要从头计算。举例说明,假设账户信息有一个字段只有0/1取值,如果存在一笔交易,将此字段值与1按位或然后将结果保存。因为0|1与1|1都为1,因此如果想要回滚这笔交易,那么无法判断之前的值为0还是为1,则这样的交易是不可逆的,不满足范式一。 47 | 48 | 满足范式二意味着数据库的字段对交易没有函数依赖,这对于提高交易执行效率有帮助,否则需要先读出字段信息,经过计算之后再写回数据库。 49 | 50 | Eros区块链系统所有交易类型满足范式一,除极个别的特殊交易类型外,都满足范式二。 51 | 52 | ## DPOS与控制型交易 53 | 54 | Eros使用DPOS作为共识算法。DPOS是一种基于委托人的权益证明类共识机制,可以用它来实现分布式账本的一致性。DPOS不像POW那样对算力有要求,DPOS的委托人锻造区块不需要算力,其优点是可大幅缩小参与验证和记账节点的数量,可以达到秒级的共识验证。DPOS的不足在于委托人的权利过高,可能会被滥用。Eros系统中的交易分两类,一类是通常的交易,一类是控制型交易。Eros系统利用控制型交易限制委托人的行为。任何一个节点一旦发现委托人作恶,则此节点立即广播一个包含作恶证据的控制型交易。这类交易将包含在下一个区块之中,最终会记录到数据库,并且引起作恶代理丧失代理权限,于是在之后的选举中,作恶者将被排除在外。委托人总数应该取一个质数,按照惯例,Eros系统使用101个委托人。委托人铸造区块会有奖励,并且赚取交易费用。Eros中的委托作恶代价是非常大的。Eros系统每隔10秒出一个区块,委托人获得的区块奖励将随着时间有一定幅度的变化。官方链代币单位定位AYS。 55 | 56 | Eros第一次提出了控制型交易的概念,并且Eros区块链系统已经实现了这类交易类型。这是用来增强系统一致性,防止出现区块分叉的一种全新思路。使用这种方案,不会增加通信成本,在对即时性要求高的场景中,势必能够最大限度的发挥DPOS本身的优势。 57 | 58 | ## 智能合约 59 | 60 | Eros智能合约VM的设计目标是 61 | 62 | 1.采用沙箱机制,Javascript低权限运行,只能调用安全的系统函数 63 | 64 | 2.独立进程运行,用户代码即使有缺陷导致VM运行出错,也不会影响主服务的稳定性 65 | 66 | 3.VM在执行智能合约的过程中,应该同时消耗一定数量的代币,比如这样一个死循环 67 | ``` 68 | var i = 0 69 | for (;;) { 70 | i++ 71 | } 72 | ``` 73 | VM不能无限执行下去,而是执行有限次然后报错退出。 74 | 75 | Eros在Javascript V8引擎的基础上实现了满足上述三点要求的智能合约虚拟机。 76 | 77 | 在Eros系统中,智能合约VM执行的结果是一笔交易,也会随着随后的区块广播到全网,其结果将受到全网节点验证。用户的智能合约代码是一份脚本文件。用户可以使用webpack等打包工具,将多个模块打包生成一份合约代码。 78 | 79 | ## Eros的数据存储方案 80 | 81 | Eros使用Redis做内存缓存,使用Mysql做数据存储。Redis是完全基于内存的数据库,将活跃数据缓存入Redis,可以有效的降低Mysql的I/O次数,进而提升整个系统的吞吐量。Mysql也有成熟的基于内存的存储引擎,因此不经修改,Eros就可实现完全基于内存的存储方案。Mysql作为老牌的关系型数据库,已被大量应用于电商等对数据一致性要求高的商业场景中,比起SQLite这种嵌入式关系型数据库,虽然安装稍微复杂了一些,但由此带来的性能提升和获得的满足多样化的商业场景的能力是显著的。 82 | 83 | Eros 还可选择 POLARDB 或者 Clustrix 等兼容Mysql协议的分布式关系型数据库作为存储方案。对于有条件的用户,可直接租用相应的云服务,免去安装的步骤。 84 | 85 | ## Eros使用的公钥密码算法 86 | 87 | Eros使用Ed25519算法作为签名算法,相比传统椭圆曲线算法有较大优势: 88 | 89 | 1.玩全开放设计,算法各参数的选择直截了当,非常明确,没有任何可疑之处; 90 | 91 | 2.安全性高,25519 系列椭圆曲线经过特别设计,是实践上最安全的加密算法; 92 | 93 | 3.速度快, 25519 系列曲线是目前最快的椭圆曲线加密算法,性能远远超过NIST系列,而且具有比P-256更高的安全性。 94 | 95 | ## SDK 96 | 97 | Eros主要基于nodejs技术栈,已经提供了支持网页、Electron客户端,RN App的应用程序开发包(sdk)。Eros的sdk实现了加密,密钥生成,数据签名,交易生成等功能接口。 98 | 99 | # 3 Eros生态的优势 100 | 101 | ## 简易部署,可视化配置 102 | 103 | Eros可在Windows/Linux服务器上部署。Eros本身是一个脚手架,使用者只需要进行简单的配置,就可以生成自己的一套区块链系统。官方提供了sdk和api以帮助开发者构建基于Javascript的去中心化应用。同时,针对不同业务场景,我们提供定制化开发,应用托管等一体化解决方案,帮助用户快速部署使用应用于自身需求的区块链系统。 104 | 105 | ## 企业级区块链系统 106 | 107 | 为满足大多数商用场景对性能的苛刻要求,Eros使用Reids做内存缓存,尽可能的提高对内存的命中率。同时底层有可观的C++实现,并采用多线程的方式处理计算型函数。Eros使用Mysql做数据存储,为金融等对数据一致性要求高的场景提供良好的支持。 108 | 109 | ## 交易完备的智能合约平台 110 | 111 | Eros的智能合约支持内置的所有交易类型,智能合约的执行采用时间触发和外部事件触发。使用者不需要从新学习一种新的语法,只用常见的Javascript即可编写自己的智能合约。 112 | 113 | ## 松耦合的区块链生态 114 | 115 | Eros是一个去中心化的应用平台,用户使用它为自己部署的区块链与官方链并没有直接联系,是独立的。但Eros提供了一种叫做“双向契入”的机制,打通了任意一个区块链和官方链之间的代币流通,并且实现的是浮动币率。这使得用户能用已有的代币换取其他Dapp的代币,进而使用相应服务,同时也实现了价值在链间的转移。Eros生态中,链之间的代币流通通过官方链进行,用户Dapp之间无法直接流通。假如Bob创建了一个Dapp,并且也是官方链的一个节点,那么拥有官方代币的Alice就可以与Bob采取浮动币率的方式,以一定的官方币换取Bob的Dapp发行的代币。举例说明,Alice首先创建一个交易,声明希望用1个AYS换取10个Bob Dapp一侧的代币,并且给出Dapp一侧自己的地址。交易广播到全网,等到交易执行之后,Alice账户中1个AYS就会被暂时冻结。Bob可以选择兑换,也可以拒绝,如果Bob接收这个币率,就需要在他的Dapp一侧,发起一笔需要签收的转账交易,打入相应地址。之后Alice需要在Dapp一侧发起一个签收交易,并且携带签收证据,Dapp 一侧的节点校验签收证据,只有合法Alice才可得到Bob在其Dapp一侧的代币。Bob 在Dapp一侧一旦收到Alice的有效签收证据,就可回官方链发起一笔签收交易,包含Alice的签收证据,全网验证之后,最终Bob可得到最初Alice的1个AYS。 116 | 117 | # 4 应用前景 118 | 119 | ## 供应链领域 120 | 121 | 供应链的特点是多主体,存在大量交互协作。如果信息被离散地保存在各自环节各自系统中,必然导致信息流通不畅,缺乏透明度,降低了供应链主体间的协同效率。当主体间一旦出现纠纷,举证和追债费时费力。区块链的去中心化,多点保存,数据可追溯不可篡改的机制,天然适用于供应链管理。只需几个简单的命令,用 Eros 就能生成一条全新的联盟链。Eros 提供的简易化部署程序帮助使用者非常方便的安装和使用自己的节点。 122 | 123 | ## 存在性证明 124 | 125 | 存在性证明可以用于登记文件版权、专利等,其基本原理是将要存储的文件的指纹信息以交易的方式存入到区块链的数据库中。因为每笔交易都有时间戳,交易人签名,因此可以证明至少在交易发生的时候,他/她是拥有相应文件的。Eros 的官方公有链提供这项服务。任何人都可以通过 Eros 官网将小信息写入官方公有链。 126 | 127 | ## 数字资产流通 && 分布式交易所 128 | 129 | 区块链作为价值互联的基础技术,可以方便的用来实现数字资产的交易。例如数字版权的登记,买卖,如果基于公有链进行,因为区块链数据库公开可追溯,我们可以清晰的看到数字资产的流转历史和最后拥有人。Eros的双向契入机制可以实现分布式跨链浮动币率的互兑。 130 | 131 | ## 公共服务领域 132 | 133 | 政务及公共服务的工作核心在于制定规则和有效监管,传统方式是通过抽查进行监管,存在不透明,取证困难等问题。如果搭建包含政府监管机构、第三方公共服务机构的联盟链,借助区块链的不可篡改、可追溯特性,可以有效提升监管透明度,取证效率等问题。 134 | 135 | ## 保险领域 136 | 137 | 中国保信在其发布的《移动科技在保险行业的应用及标准化研究》报告中强调,区块链能重新构建更加公平、高效的信用体系,大数据、云计算等将进一步强化风险管理等核心功能;智能投顾、智能合约将合力推动全新的营销模式;保险将转变为融合科技、服务和管理的新商业模式。Eros 既是一个企业级区块链应用与开发平台,对高并发和高数据一致性等业务提供良好的支持,同时也是一个完备的智能合约平台,为新模式的应用注入动力。 138 | 139 | ## 物联网 140 | 141 | 物联网中存在海量的联网设备,很难有一个中央机构来管理所有的设备和各节点的身份。Eros生态系统是一个可行的解决方案。它为节点与设备提供了信任机制,通过算法确保交易的实现,并且可追溯不可篡改。不同设备可以接入不同的链中,这样实现了负载均衡,避免了单独一条链交易拥塞和数据的爆炸增长。 142 | 143 | # 5总结 144 | 145 | Eros致力于打造一个满足多种商用场景的区块链系统。为满足大多数商用场景对性能和数据一致性的苛刻要求,它使用Mysql做数据存储,同时使用Reids做内存缓存,尽可能的提高对内存的命中率。同时底层有可观的C++实现,并采用多线程的方式处理计算型函数,最大限度提高代码执行速度和CPU利用率。而一般的业务逻辑和上层的sdk则完全使用Javascript实现,这极大的降低了开发和后期维护成本。Javascript无论在PC端,移动端还是服务端,都有成熟可靠的解决方案,相信这对开发者和中小型企业有很大的吸引力。Eros系统增加了控制型交易,用全新的思路改进了DPOS,而不增加共识过程的通信开销。Eros是一个具有前瞻性的、低成本的一站式区块链应用解决方案,相信将成为新一代去中心化应用的孵化器。 146 | 147 | # 6术语解释 148 | 149 | ### Es6 150 | 151 | Javascript语言规范,2015 发布。ES6是ECMAScript标准十余年来变动最大的一个版本,其中添加了许多新的语法特性。ES6的发布,标志着Javascript真正成为企业级编程语言。 152 | 153 | ### **交易** 154 | 155 | 在本文中是一个计算机术语,英文表述为 Transaction,等同于另一个计算机术语“事务”的含义,并非指商业语境中的交易,只因在区块链的语境中已经约定俗成地翻译为“交易”,本文遵循了这一习惯。 156 | 157 | ### **VM** 158 | 159 | 运行智能合约的虚拟机,执行合约代码并返回结果 160 | 161 | ### **共识机制** 162 | 163 | 共识是分布式系统中的一个过程,用于在涉及多个不可靠节点的网络中,在所有节点之间实现数据一致性并对某个提案达成一致。 164 | 165 | ### **POS && DPOS** 166 | 167 | Proof Of Stake 权益证明共识算法,PoW 的替代方案。根据节点所占权益比重,决定其获得区块记账权的概率,权益越多,越有机会获得区块记账权。DPoS 在 PoS 的基础上更近一步,节点将权益委托给其他节点,由其代表自己行使权力。 168 | 169 | ### **DAPP** 170 | 171 | 分布式应用,相对于APP 的一种提法。本文中的DAPP在一定语境中,也只用户使用Eros脚手架生成的自己的区块链系统。 172 | 173 | ### ed25519 174 | 175 | 一种椭圆曲线加密/签名/密钥交换算法,由美国著名密码学家Daniel Julius Bernstein在 2006 年独立设计。有关各种椭圆曲线加密算法的分析和比较,可参考如下网址[https://safecurves.cr.yp.to/index.html](https://safecurves.cr.yp.to/index.html "https://safecurves.cr.yp.to/index.html") 176 | 177 | 178 | `[版权] 本文由Eros创始团队编写,版权归Eros团队所有。如要引用,请注明引用来源` 179 | `https://github.com/ErosPlatform/docs/blob/master/eros_whitepaper.md` 180 | -------------------------------------------------------------------------------- /eros_whitepaper_zh.md: -------------------------------------------------------------------------------- 1 | title: Eros技术白皮书 2 | --- 3 | 4 | # 0 引言 5 | 6 | Eros是最新一代的去中心化应用开发平台。它意在使人们能够方便地构建简单、可靠、高效的分布式应用。本文将详细描述Eros系统的设计原理,实现机制,优势以及应用场景。 7 | 8 | # 1 Eros是什么 9 | 10 | Eros系统是基于nodejs的区块链商业应用与开发平台。Eros本身的形成也是“站在巨人的肩上”,在研读了早期的一些开源项目之后,我们提出了Eros的设计目标: 11 | 12 | 1.使用Es6等新一代编程规范 13 | 14 | 2.底层对性能要求高的部分使用C++ 15 | 16 | 3.使用关系型数据库,支持多种数据源 17 | 18 | 4.提供图灵完备的JavaScript智能合约虚拟机 19 | 20 | 5.改进DPOS,但不增加共识负担 21 | 22 | 6.支持内存型数据库 23 | 24 | 7.可应用于私有链、联盟链、公有链 25 | 26 | 8.支持松耦合的链-链价值互通 27 | 28 | Eros 项目具有“自带电池”的性质,其本身是一个脚手架,几行命令就可以产生一簇区块链的基础设施,包括底层链,配套的sdk,文档,部署脚本。 29 | 30 | # 2 Eros如何实现 31 | 32 | Eros主要使用JavaScript语言实现,在耗费CPU计算资源的部分则采用C++实现,这可以显著加快代码执行速度。JavaScript不支持多线程,为此我们专门开发了一个多线程模块[hydra](https://github.com/ErosPlatfrom/hydra),这种设计方式可以有效提高对CPU多核的利用率进而提高整个系统并行度。 33 | 34 | 经过实际测试,用C++模块实现签名、校验等计算,比起Javascript实现快至少10倍,hydra模块提供的多线程编程模型又可以将这些复杂计算型任务交给CPU的其他核心完成。Eros的架构设计尽可能做到将系统的并行能力发挥到极致。 35 | 36 | 依托于nodejs技术平台,前端,客户端和App都使用一套技术栈,这将有效降低后续的研发和使用成本。这无论对Eros团队还是对Eros链的使用者,都是有帮助的。 37 | 38 | 底层链一开始就带有一种设计图纸的性质,其机制和结构与编程语言松耦合,并确保其抽象层面的自洽和正确性。因此这就为未来提供多语言版本打下了良好的基础。 39 | 40 | ## 账户系统与交易范式 41 | 42 | Eros使用帐户来存储用户的信息,这些信息包含余额、公钥、二级密码等字段。一笔交易按照既定规则改变这些字段的值。任何一笔交易都可以看作一个 矩阵算子,而所有账户信息的字段则组成一个向量。这样我们就可以采用数学的语言描述区块链系统了。 43 | 44 | 经过研究和思考,我们认为一个设计良好的区块链系统应该至少满足以下两个范式。现总结如下: 45 | 46 | **范式一** 任何一笔交易都对应一个矩阵,其作用于账户字段,而这样的矩阵应该是可逆的。 47 | 48 | **范式二** 作用于字段向量的每一个矩阵都应该是对角的。 49 | 50 | 满足范式一意味着交易容易被撤销,否则需要从头计算。举例说明,假设账户信息有一个字段只有0/1取值,如果存在一笔交易,将此字段值与1按位或然后将结果保存。因为0|1与1|1都为1,因此如果想要回滚这笔交易,那么无法判断之前的值为0还是为1,则这样的交易是不可逆的,不满足范式一。 51 | 52 | 满足范式二意味着数据库的字段对交易没有函数依赖,这对于提高交易执行效率有帮助,否则需要先读出字段信息,经过计算之后再写回数据库。 53 | 54 | ## DPOS与控制型交易 55 | 56 | Eros使用DPOS作为共识算法。DPOS是一种基于委托人的权益证明类共识机制,可以用它来实现分布式账本的一致性。DPOS不像POW那样对算力有要求,DPOS的委托人锻造区块不需要算力,其优点是可大幅缩小参与验证和记账节点的数量,可以达到秒级的共识验证。DPOS的不足在于委托人的权利过高,可能会被滥用。Eros系统中的交易分两类,一类是通常的交易,一类是控制型交易。Eros系统利用控制型交易限制委托人的行为。任何一个节点一旦发现委托人作恶,则此节点立即广播一个包含作恶证据的控制型交易。这类交易将包含在下一个区块之中,最终会记录到数据库,并且引起作恶代理丧失代理权限,于是在之后的选举中,作恶者将被排除在外。委托人总数应该取一个奇数,Eros系统需要有101个委托人。委托人铸造区块会有奖励,并且赚取交易费用。Eros中的委托作恶代价是非常大的。Eros系统每隔10秒出一个区块,委托人获得的区块奖励将随着时间有一定幅度的变化。官方链代币单位定位AYS。 57 | 58 | Eros第一次提出了控制型交易的概念,并且Eros区块链系统已经实现了这类交易类型。这是用来增强系统一致性,防止出现区块分叉的一种全新思路。使用这种方案,不会增加通信成本,在对即时性要求高的场景中,势必能够最大限度的发挥DPOS本身的优势。 59 | 60 | ## 智能合约 61 | 62 | 受限于比特币系统的非图灵完备能力,其系统无法处理任意的业务逻辑。2015年诞生的以太坊将区块链的应用提升到一个更高的境界——允许使用者在以太坊上部署智能合约。智能合约允许在没有第三方干预的情况下进行可信交易,并且能够实现可追踪不可逆转,比传统合同更安全,还能减少交易成本。 智能合约是一段计算机程序,可以执行复杂多样的业务逻辑,而一旦部署并设定好触发条件之后,就无需人为干预,并且合约部署在公有链上公开透明。因此,可以被广泛用于涉及合同、所有权交易、数据交易、物联网、物流等场景。 63 | 64 | Eros智能合约VM的设计目标是 65 | 66 | 1.采用沙箱机制,Javascript低权限运行,只能调用安全的系统函数 67 | 68 | 2.独立进程运行,用户代码即使有缺陷导致VM运行出错,也不会影响主服务的稳定性 69 | 70 | 3.VM在执行智能合约的过程中,应该同时消耗一定数量的代币,比如这样一个死循环 71 | ``` 72 | var i = 0 73 | for (;;) { 74 | i++ 75 | } 76 | ``` 77 | VM不能无限执行下去,而是执行有限次然后报错退出。 78 | 79 | Eros在Javascript V8引擎的基础上实现了满足上述三点要求的智能合约虚拟机。 80 | 81 | 在Eros系统中,智能合约VM执行的结果是一笔交易,也会随着随后的区块广播到全网,其结果将受到全网节点验证。智能合约代码是一份脚本文件。用户可以使用webpack等打包工具,将多个模块打包生成一份合约代码。 82 | 83 | 以下代码是官方一次送token的活动中使用的合约 84 | 85 | ```js 86 | /* 87 | main 为合约的入口函数,返回一个 json 格式的字符串 88 | */ 89 | function main(args) { 90 | var strget = storageGet() 91 | var getObj = [] 92 | if (strget) { 93 | getObj = JSON.parse(strget) 94 | } 95 | if (getObj.length > 50) { 96 | return JSON.stringify({ 97 | amount: 0 98 | }) 99 | } 100 | if (getObj.indexOf(requesterKey) >= 0) { 101 | return JSON.stringify({ 102 | amount: 0 103 | }) 104 | } else { 105 | getObj.push(requesterKey) 106 | storageSet(JSON.stringify(getObj)) 107 | return JSON.stringify({ 108 | amount: 5 109 | }) 110 | } 111 | } 112 | 113 | ``` 114 | 115 | 执行合约代码会消耗token,测试网络下,一个token可以执行 10000 步。消耗的token与实际执行步数满足:`代笔消耗量=O(n)`。因此正常情况下,执行一个合约远不会消耗完一个token。合约执行导致token不够,往往是因为代码出错。VM 抛出此类异常将导致合约作废,并会扣除合约作者少量token。用这种方式防止此类合约不合理的消耗系统资源。Eros 合约足够灵活,一个甚至没有token的账户也可以安全的调用合约。Eros将会提供合约检测工具,帮助用户生产出安全高效的合约。 116 | 117 | ## Eros的数据存储方案 118 | 119 | Eros使用Redis做内存缓存,使用Mysql做数据存储。Redis是完全基于内存的数据库,将活跃数据缓存入Redis,可以有效的降低Mysql的I/O次数,进而提升整个系统的吞吐量。Mysql也有成熟的基于内存的存储引擎,因此不经修改,Eros就可实现完全基于内存的存储方案。Mysql作为老牌的关系型数据库,已被大量应用于电商等对数据一致性要求高的商业场景中,比起SQLite这种嵌入式关系型数据库,虽然安装稍微复杂了一些,但由此带来的性能提升和获得的满足多样化的商业场景的能力是显著的。 120 | 121 | Eros 还可选择 POLARDB 或者 Clustrix 等兼容Mysql协议的分布式关系型数据库作为存储方案。对于有条件的用户,可直接租用相应的云服务,免去安装的步骤。 122 | 123 | ## Eros使用的公钥密码算法 124 | 125 | Eros使用Ed25519算法作为签名算法,相比传统椭圆曲线算法有较大优势: 126 | 127 | 1.玩全开放设计,算法各参数的选择直截了当,非常明确,没有任何可疑之处; 128 | 129 | 2.安全性高,25519 系列椭圆曲线经过特别设计,是实践上最安全的加密算法; 130 | 131 | 3.速度快, 25519 系列曲线是目前最快的椭圆曲线加密算法,性能远远超过NIST系列,而且具有比P-256更高的安全性。 132 | 133 | 同时,Eros也提供了国密算法支持。 134 | 135 | ## SDK 136 | 137 | Eros主要基于nodejs技术栈,已经提供了支持网页、Electron客户端,RN App的应用程序开发包(sdk)。Eros的sdk实现了加密,密钥生成,数据签名,交易生成等功能接口。 138 | 139 | # 3 Eros生态的优势 140 | 141 | ## 简易部署,可视化配置 142 | 143 | Eros可在Windows/Linux服务器上部署。Eros本身是一个脚手架,使用者只需要进行简单的配置,就可以生成自己的一套区块链系统。官方提供了sdk和api以帮助开发者构建基于Javascript的去中心化应用。同时,针对不同业务场景,我们提供定制化开发,应用托管等一体化解决方案,帮助用户快速部署和使用满足自身需求的区块链系统。 144 | 145 | ## 企业级区块链系统 146 | 147 | 为满足大多数商用场景对性能的苛刻要求,Eros使用Reids做内存缓存,尽可能的提高对内存的命中率。同时底层有可观的C++实现,并采用多线程的方式处理计算型函数。Eros使用Mysql做数据存储,为金融等对数据一致性要求高的场景提供良好的支持。 148 | 149 | ## 交易完备的智能合约平台 150 | 151 | Eros的智能合约支持内置的所有交易类型,智能合约的触发方式包括发送交易调用触发和外部事件触发。JavaScript拥有众多开发者,往往不需要重新学习新的语言,只用常见的Javascript即可编写。 152 | 153 | ## 松耦合的区块链生态 154 | 155 | Eros是一个去中心化的应用平台,用户使用它为自己部署的区块链与官方链没有直接联系,是独立的。但Eros提供了一种叫做“双向契入”的机制,打通了不同链间的代币流通。这使得用户能用已有的代币换取其他Dapp的代币,进而使用相应链的服务,同时也实现了价值在链间的转移。Eros生态中,各链之间是平等的,用户Dapp之间相应的代币可直接流通。假如Bob创建了一个Dapp,那么拥有官方代币的Alice就可以与Bob采取浮动币率的方式,以一定的官方币换取Bob的Dapp发行的代币。举例说明,Alice首先创建一个交易,声明希望用1个AYS换取10个Bob Dapp一侧的代币,并且给出Dapp一侧自己的地址。交易广播到全网,等到交易执行之后,Alice账户中1个AYS就会被暂时冻结。Bob可以选择兑换,也可以拒绝,如果Bob接收这个币率,就需要在他的Dapp一侧,发起一笔需要签收的转账交易,打入相应地址。之后Alice需要在Dapp一侧发起一个签收交易,并且携带签收证据,Dapp 一侧的节点校验签收证据,只有合法Alice才可得到Bob在其Dapp一侧的代币。Bob 在Dapp一侧一旦收到Alice的有效签收证据,就可回官方链发起一笔签收交易,包含Alice的签收证据,全网验证之后,最终Bob可得到最初Alice的1个AYS。 156 | 157 | 这种链间的代币流通机制可以用来做分布式交易所,相比于传统的中心化交易,这种方式的安全性更好,几乎不用担心资产被盗取。并且节约了中心化运营的成本,使得交易费用更低。 158 | 159 | # 4 应用前景 160 | 161 | ## 供应链领域 162 | 163 | 供应链的特点是多主体,存在大量交互协作。如果信息被离散地保存在各自环节各自系统中,必然导致信息流通不畅,缺乏透明度,降低了供应链主体间的协同效率。当主体间一旦出现纠纷,举证和追债费时费力。区块链的去中心化,多点保存,数据可追溯不可篡改的机制,天然适用于供应链管理。只需几个简单的命令,用 Eros 就能生成一条全新的联盟链。Eros 提供的简易化部署程序帮助使用者非常方便的安装和使用自己的节点。 164 | 165 | ## 存在性证明 166 | 167 | 存在性证明可以用于登记文件版权、专利等,其基本原理是将要存储的文件的指纹信息以交易的方式存入到区块链的数据库中。因为每笔交易都有时间戳,交易人签名,因此可以证明至少在交易发生的时候,他/她是拥有相应文件的。Eros 的官方公有链提供这项服务。任何人都可以通过 Eros 官网将小信息写入官方公有链。 168 | 169 | ## 数字资产流通 && 分布式交易所 170 | 171 | 区块链作为价值互联的基础技术,可以方便的用来实现数字资产的交易。例如数字版权的登记,买卖,如果基于公有链进行,因为区块链数据库公开可追溯,我们可以清晰的看到数字资产的流转历史和最后拥有人。Eros的双向契入机制可以实现分布式跨链浮动币率的互兑。 172 | 173 | ## 公共服务领域 174 | 175 | 政务及公共服务的工作核心在于制定规则和有效监管,传统方式是通过抽查进行监管,存在不透明,取证困难等问题。如果搭建包含政府监管机构、第三方公共服务机构的联盟链,借助区块链的不可篡改、可追溯特性,可以有效提升监管透明度,取证效率等问题。 176 | 177 | ## 保险领域 178 | 179 | 中国保信在其发布的《移动科技在保险行业的应用及标准化研究》报告中强调,区块链能重新构建更加公平、高效的信用体系,大数据、云计算等将进一步强化风险管理等核心功能;智能投顾、智能合约将合力推动全新的营销模式;保险将转变为融合科技、服务和管理的新商业模式。Eros 既是一个企业级区块链应用与开发平台,对高并发和高数据一致性等业务提供良好的支持,同时也是一个完备的智能合约平台,为新模式的应用注入动力。 180 | 181 | ## 物联网 182 | 183 | 物联网中存在海量的联网设备,很难有一个中央机构来管理所有的设备和各节点的身份。Eros生态系统是一个可行的解决方案。它为节点与设备提供了信任机制,通过算法确保交易的实现,并且可追溯不可篡改。不同设备可以接入不同的链中,这样实现了负载均衡,避免了单独一条链交易拥塞和数据的爆炸增长。 184 | 185 | # 5总结 186 | 187 | Eros致力于打造一个满足多种商用场景的区块链系统。为满足大多数商用场景对性能和数据一致性的苛刻要求,它使用Mysql做数据存储,同时使用Reids做内存缓存,尽可能的提高对内存的命中率。同时底层有可观的C++实现,并采用多线程的方式处理计算型函数,最大限度提高代码执行速度和CPU利用率。而一般的业务逻辑和上层的sdk则完全使用Javascript实现,这极大的降低了开发和后期维护成本。Javascript无论在PC端,移动端还是服务端,都有成熟可靠的解决方案,相信这对开发者和中小型企业有很大的吸引力。Eros系统增加了控制型交易,用全新的思路改进了DPOS,而不增加共识过程的通信开销。Eros是一个具有前瞻性的、低成本的一站式区块链应用解决方案,相信将成为新一代去中心化应用的孵化器。 188 | 189 | # 6术语解释 190 | 191 | ### Es6 192 | 193 | Javascript语言规范,2015 发布。ES6是ECMAScript标准十余年来变动最大的一个版本,其中添加了许多新的语法特性。ES6的发布,标志着Javascript真正成为企业级编程语言。 194 | 195 | ### **交易** 196 | 197 | 在本文中是一个计算机术语,英文表述为 Transaction,等同于另一个计算机术语“事务”的含义,并非指商业语境中的交易,只因在区块链的语境中已经约定俗成地翻译为“交易”,本文遵循了这一习惯。 198 | 199 | ### **VM** 200 | 201 | 运行智能合约的虚拟机,执行合约代码并返回结果 202 | 203 | ### **共识机制** 204 | 205 | 共识是分布式系统中的一个过程,用于在涉及多个不可靠节点的网络中,在所有节点之间实现数据一致性并对某个提案达成一致。 206 | 207 | ### **POS && DPOS** 208 | 209 | Proof Of Stake 权益证明共识算法,PoW 的替代方案。根据节点所占权益比重,决定其获得区块记账权的概率,权益越多,越有机会获得区块记账权。DPoS 在 PoS 的基础上更近一步,节点将权益委托给其他节点,由其代表自己行使权力。 210 | 211 | ### **DAPP** 212 | 213 | 分布式应用,相对于APP 的一种提法。本文中的DAPP在一定语境中,也只用户使用Eros脚手架生成的自己的区块链系统。 214 | 215 | ### ed25519 216 | 217 | 一种椭圆曲线加密/签名/密钥交换算法,由美国著名密码学家Daniel Julius Bernstein在 2006 年独立设计。有关各种椭圆曲线加密算法的分析和比较,可参考如下网址[https://safecurves.cr.yp.to/index.html](https://safecurves.cr.yp.to/index.html "https://safecurves.cr.yp.to/index.html") 218 | 219 | 220 | `[版权] 本文由Eros创始团队编写,版权归Eros团队所有。如要引用,请注明引用来源` 221 | `https://github.com/ErosPlatform/docs/blob/master/eros_whitepaper_zh.md` 222 | --------------------------------------------------------------------------------