├── DDN区块链基础 ├── 1-运行起来.md ├── 2-DDN区块链加密库的选择.md └── 3-DDN区块链模块规范解读.md ├── README.md ├── SUMMARY.md ├── styles └── images │ ├── datm-ddn.jpeg │ ├── ddn-cli.png │ ├── foundation.png │ └── hashbase.jpg ├── 写在前面 ├── 0-前言.md └── 1-如何用区块链重塑产业生产形态.md └── 开发实践 ├── 0-planning.md ├── 1-Eslink的使用.md ├── 2-rollup和webpack的使用.md └── 3-buffer解读.md /DDN区块链基础/1-运行起来.md: -------------------------------------------------------------------------------- 1 | 建议收藏 | 中国版的Cosmos,是如何做到分分钟造链的? 2 | -------------------------- 3 | author: imfly 4 | 2020.1.24 5 | 6 | --- 7 | 8 | 今天,恰是全国抗击武汉肺炎的严峻时刻,中国武汉正式宣布关停所有离汉通道,全国各地群策群力、群防群控。作为一个区块链开发者,我只能选择呆在家里,持续更新区块链核心代码,撰写DDN区块链开发框架相关文档,做一个不添乱的支持者,衷心祝愿大家鼠年安康! 9 | 10 | 多年来,DDN区块链一直坚持“多链并行,跨链互通”的技术路线,坚持面向实体经济做国内最早的“企业级区块链系统”,所以被业界称为“中国版的Cosmos”。DDN区块链核心代码开源几个月来,得到众多小伙伴的关注和支持,应大家的要求,这篇文章就简单的介绍如何使用DDN快速造出自己的新区块链程序。 11 | 12 | --- 13 | 14 | ## 准备工作 15 | 16 | 默认你已经安装好了Node.js运行环境、git版本管理工具等,Node.js版本建议是`10.0.0`以上版本。另外,你最好在Linux环境或者Mac环境下,Win下使用虚拟机也可以,我没有在Win下的开发习惯,没有测试过,所以不保证下面的过程在Win下能如期运行。 17 | 18 | --- 19 | 20 | 特别说明的是,当前的DDN区块链,仍在快速迭代中,一些独立出来的模块还没有正式发布出去。另外,为了适配更多的数据存储方式、覆盖更多的资产类型,当前版本也没有刻意保持与主网2.0.2版本(仅能使用Sqlite数据库)的兼容性。待本版本升级发布之时,我会做兼容审查和适配。 21 | 22 | --- 23 | 24 | ## 下载源码 25 | 26 | 运行下面的命令,下载源码到本地: 27 | 28 | ``` 29 | $ git clone https://github.com/ddnlink/ddn.git 30 | ``` 31 | 32 | 进入源码目录 33 | 34 | ``` 35 | $ cd ddn 36 | ``` 37 | 38 | --- 39 | 40 | ## 本地构建 41 | 42 | 首先安装DDN源码使用到的工具包: 43 | 44 | ``` 45 | $ yarn 46 | ``` 47 | 48 | 然后,初始化DDN区块链每个组件: 49 | 50 | ``` 51 | $ lerna bootstrap 52 | ``` 53 | 54 | 构建代码 55 | 56 | ``` 57 | $ yarn build 58 | ``` 59 | 60 | --- 61 | 62 | ## 初始化命令行工具 63 | 64 | 进入DDN命令行工具`ddn-cli`所在的目录 65 | 66 | ``` 67 | $ cd packages/ddn-cli 68 | ``` 69 | 70 | `link`一下吧, 71 | 72 | ``` 73 | $ yarn link 74 | ``` 75 | 76 | 现在,输入下面的命令,查看是否安装成功 77 | 78 | ``` 79 | $ ddn 80 | ``` 81 | 82 | 如果出现下面的内容,安装成功 83 | 84 | ![ddn-cli](../styles/images/ddn-cli.png) 85 | 86 | 在开发状态下,上述命令可以使用下面一条命令代替: 87 | 88 | ``` 89 | $ yarn run init // 这里必须要使用 run 命令 90 | ``` 91 | 92 | 未来,我们将该工具发布之后,命令行工具安装方法为: 93 | 94 | ``` 95 | $ yarn global add @ddn/ddn-cli 96 | ``` 97 | 98 | --- 99 | 100 | ## 生产新链 101 | 102 | DDN区块链开发框架的使用非常简单,如果要生成属于自己的新链,只要下面一条命令即可 103 | 104 | ``` 105 | $ ddn generate blockchain MyName // 也可以使用别名 ddn g blockchain MyName 106 | ``` 107 | 108 | 这个过程,软件会问你几个问题,只要根据提示一一作答即可。 109 | 110 | --- 111 | 112 | ## 小结 113 | 114 | 本版本发布之后,上述过程本质上就是下面两条命令 115 | 116 | ``` 117 | $ yarn global add @ddn/ddn-cli 118 | $ ddn g blockchain MyName 119 | ``` 120 | 121 | -------------------------------------------------------------------------------- /DDN区块链基础/2-DDN区块链加密库的选择.md: -------------------------------------------------------------------------------- 1 | DDN区块链加密库的选择 2 | -------------- 3 | 4 | DDN是基于Node.js平台,无论前端还是后台都要使用 JavaScript 语言。所以,选择一个基于 JavaScript 语言的性能卓越的密码库是我们要考虑的重要问题之一。当然,最好是能够兼顾前端(浏览器端)和性能,这样就能实现前端和后台的统一了。 5 | 6 | ## 浏览器端加密的限制 7 | 8 | 目前,要把加密函数暴露给浏览器的 JavaScript,只有三个选项: 9 | 10 | ### 1、使用插件 11 | 12 | 插件是指运行在浏览器中,可以由 JavaScript 调用的,编译过的代码。比如,Java 和 Flash 中存在的加密库。另外一个选项是使用 Chrome 浏览器的 NaCl 客户端(Native Client) 程序,它允许运行由 C 或者 C++ 编译出的机器代码。 13 | 14 | 这样的做法通常性能很高,但是需要用户安装浏览器插件程序,或者NaCl客户端程序只能用于 Chrome 浏览器,所以可移植性不是很好,用户体验较差。 15 | 16 | ### 2、使用 Web 加密 API 17 | 18 | 人们已经提案给 JavaScript 提供原生的基本加密接口,让 Web 应用可以更快地加密解密。但是,要想主流浏览器采用这项技术还需要很长一段时间,远水解不了近渴。现在,能在多数浏览器中使用的只有crypto.getRandomValues()函数。 19 | 20 | ### 3、直接用 JavaScript 加密 21 | 22 | 这种方案的优点就在于高度的可移植性。所有的浏览器都可以执行 JavaScript,也就意味着所有的浏览器都可以调用 JavaScript 写成的加密库。但是,在 JavaScript 中加密存在两个缺陷:安全性和性能,不过现在可以找到替代方案。 23 | 24 | 安全性方面,Math.random()函数不是随机数的良好来源,所以不可能得到足够的随机数用来加密,这是事实。所以,建议在现代浏览器,全部使用 crypto.getRandomValues() 函数以取得足够数量的随机数,从而弥补该不足。 25 | 26 | 性能方面,浏览器端 JavaScript 加密在速度等诸多方面都不服务端。但是反过来,我们又何尝需要浏览器端提供那么高的性能呢?很多时候,在浏览器端,不需要大规模的加密计算,特别是在端到端的信息加密方面,现代浏览器的性能已经能够满足需求,比如:用户使用浏览器生成地址或者签名交易。这些正好是DDN区块链这种分布式的应用程序的使用场景。 27 | 28 | ## 加密库的选择 29 | 30 | 性能要求不高,不代表我们不追求性能。近年来,JavaScript 加密的性能有极大提升。以下两个库`js-nacl`和`TweetNaCl.js`就是这其中的代表,他们都可以在Node.js后台和浏览器前端执行,性能都有大幅度提升。不过,他们实现的原理完全不同。 31 | 32 | ### 两个库的逻辑关系 33 | 34 | js-nacl(js库) --> libsodium(C库,方便安装的NaCl封装版) --> NaCl(密码库) --> 加密算法(sha256等) 35 | 36 | TweetNaCl.js --> TweetNaCl(C库,可审计的高安全密码库) --> NaCl(密码库) --> 加密算法(sha256等) 37 | 38 | `NaCl` (读作 “salt”) 是一个 C 语言的库,提供对称式密钥加密解密和公钥签名认证的应用函数。当然,其他库也提供这方面的功能,不过 NaCl 在安全性、易用性和速度上都有所提升。它由密码学人士编写,在加密社区广为人知,受到信赖。问题之一是 NaCl 是 C 语言,而不是 JavaScript 编写的。 39 | 40 | libsodium 是 NaCl 的一个分支。着重于易于移植,可交叉编译和可安装打包。并有和 NaCL 兼容的 API,进一步增加了易用的扩展API。libsodium 的目标是提供构建高层密码学工具所需的核心算法。libsodium 的设计强调高安全,基础算法的性能也全面超越 NIST 标准下的绝大多数其他实现。libsodium 支持一系列编译器和操作系统,包括 iOS、Android。 41 | 42 | TweetNaCl 号称是世界上第一个可审计的高安全性密码库。TweetNaCl只支持100条Tweet,同时支持应用程序使用的所有25个C语言的 NaCl 函数。TweetNaCl 是一个自包含的公共域C库,因此可以很容易地集成到应用程序中。 43 | 44 | 总之,这两个库最终都是要实现使用 Javascript对 NaCl 的API接口调用。 45 | 46 | ### 两个库的区别 47 | 48 | **js-NaCl:编译成 JavaScript 的 NaCl 加密库** 49 | 50 | `js-NaCl`,是把 NaCl 编译成 LLVM 的字节码,然后用 `emscripten` 将这些字节码编译成 JavaScript。并且,LLVM 编译器能在编译时作许多优化,所以得到的 JavaScript 代码也会得到优化。 51 | 52 | 更好的是,`emscripten` 编译出的代码是 JavaScript 的子集,也叫做 `asm.js`。你可以将 asm.js 当作很像 JavaScript 的汇编语言。浏览器遇到了 asm.js 的代码块时,会将其编译成高效的机器码,运行速度接近原生代码。 53 | 54 | 目前主要只有 Firefox 浏览器支持 asm.js 的优化。这就使 js-nacl 在 Firefox 中的加密解密非常迅速,视具体操作的不同,比 Chrome 浏览器的速度快 2 至 8 倍。但是即使是 Chrome,js-nacl 也很快,超过了我们所测试的其他所有加密库。 55 | 56 | **TweetNaCl.js: TweetNaCl的纯 JavaScript 迁移实现** 57 | 58 | 官方的说法是: 59 | 60 | “The primary goal of this project is to produce a translation of TweetNaCl to JavaScript which is as close as possible to the original C implementation, plus a thin layer of idiomatic high-level API on top of it.” 61 | 62 | 简单解释就是:TweetNaCl.js的主要目的是生成一个将TweetNaCl转换为JavaScript的版本,该版本尽可能接近原始的C实现。 63 | 64 | ## 选择 TweetNaCl.js 的理由 65 | 66 | 我会在适当的时候对上述两个库做简单的性能测试,不过目前,我选择 `TweetNaCl.js` 的理由很简单,主要有这样几点: 67 | 68 | 1. 原生实现,让使用者更有主动权。我喜欢原生代码,纯 Javascript 实现,这样在必要的时候,我可以直接参与其中,提供必要的改善。当然,尽管不希望有这样的机会,但是作为程序员,谁又能保证未来某一天没有这个必要呢。 69 | 2. 良好的使用体验。该库提供的API比较清晰简单,使用起来更加直观。 70 | 3. 良好的社区支持。对比`js-NaCl` 590 的使用者,该库 4016274 的使用量,简直不是一个数量级的。 71 | 72 | ## 参考 73 | 74 | https://byronhe.gitbooks.io/libsodium/content/ 75 | 76 | http://cace-project.eu/nacl/ 77 | 78 | http://wiki.ucis.nl/NaCl#JavaScript_implementation 79 | 80 | https://tweetnacl.js.org/#/ 81 | 82 | http://tweetnacl.cr.yp.to/ 83 | 84 | http://nacl.cr.yp.to/ 85 | -------------------------------------------------------------------------------- /DDN区块链基础/3-DDN区块链模块规范解读.md: -------------------------------------------------------------------------------- 1 | # ES6模块体系及DDN开发规范 2 | 3 | 4 | ## 概述 5 | 6 | 得益于 ES6 和 TS的模块体系,DDN区块链可以快速拆解和迭代。没有这些模块化的基础,我们后面所有的工作都会受阻,可插拔、可视化、可配置等功能就成了一句空话,面向不同企业给予“多链并行,跨链互通”也就非常困难。 7 | 8 | 按照敏捷开发的思路,DDN区块链整体上同样基于“默认优于配置”,在底层开发的代码层面就规定了一些默认的约束和规范。本章咱们就简单的介绍DDN区块链开发中用到的关于模块的组织和实践,方便大家在使用DDN进行深度开发的过程中可以更加便捷。 9 | 10 | ## 关于 JavaScript 的模块体系 11 | 12 | JavaScript 最早用在浏览器上,而且很长一段时间里,没有自己的模块(module)体系,无法从小文件开始拆分并拼装成一个大程序,所谓的程序员大牛根本不认为它就是编程语言。与其形成鲜明对比的,就连 CSS 都有`@import`,更别说C/C++、Java、ruby、Python等语言了。 13 | 14 | 当然,今天这种情形得到改观,特别是在 ES6 出现之后,在语言层面上,实现了模块功能,而且相当简单,必将取代 CommonJS 和 AMD 规范,成为统一浏览器和服务器通用的模块解决方案。但是,在现阶段,还会有些小小的麻烦,核心就在于 ES6 的模块规范与 CommonJS 和 AMD 模块体系差别上。所以,只要搞明白这一点,使用起来就如虎添翼,简单明了了。 15 | 16 | ## ES6 模块特点 17 | 18 | 作为脚本语言,CommonJS 和 AMD 模块体系,只能在运行时确定模块的依赖关系,这个应该是理所当然的事情。而 ES6 模块的设计却是走了静态化的路线,与那些编译类的语言有些类似,在编译时就能确定模块关系,以及输入和输出的变量,这就为 Javascript 带来了很多可能。比如进一步拓宽 JavaScript 的语法,引入宏(macro)和类型检验(type system)这些只能靠静态分析实现的功能。 19 | 20 | 另一个方面是,ES6 模块自动采用严格模式,不管你有没有在模块头部加上`"use strict";`,默认限制如下: 21 | 22 | - 变量必须声明后再使用 23 | - 函数的参数不能有同名属性,否则报错 24 | - 不能使用`with`语句 25 | - 不能对只读属性赋值,否则报错 26 | - 不能使用前缀 0 表示八进制数,否则报错 27 | - 不能删除不可删除的属性,否则报错 28 | - 不能删除变量`delete prop`,会报错,只能删除属性`delete global[prop]` 29 | - `eval`不会在它的外层作用域引入变量 30 | - `eval`和`arguments`不能被重新赋值 31 | - `arguments`不会自动反映函数参数的变化 32 | - 不能使用`arguments.callee` 33 | - 不能使用`arguments.caller` 34 | - 禁止`this`指向全局对象 35 | - 不能使用`fn.caller`和`fn.arguments`获取函数调用的堆栈 36 | - 增加了保留字(比如`protected`、`static`和`interface`) 37 | 38 | 其中,尤其需要注意`this`的限制。ES6 模块之中,顶层的`this`指向`undefined`,即不应该在顶层代码使用`this`。 39 | 40 | ## Node.js 使用 ES6 语法 41 | 42 | DDN区块链基于Node.js平台,而 Node.js 遵从 CommonJS,对 ES6 模块的处理比较麻烦,因为它与 ES6 模块格式是不兼容的。目前,Node.js 解决方案是,将两者分开,ES6 模块和 CommonJS 采用各自的加载方案。 43 | 44 | 默认情况下,Node.js 要求 ES6 模块采用.mjs后缀文件名,或者在 `package.json` 里配置字段 `type` 为 `module`。也就是说,只要脚本文件里面使用import或者export命令,那么就必须采用.mjs后缀名。require命令不能加载.mjs文件,会报错,只有import命令才可以加载.mjs文件。反过来,.mjs文件里面也不能使用require命令,必须使用import。 45 | 46 | 目前,这项功能还在试验阶段。安装 Node v8.5.0 或以上版本,要用--experimental-modules参数才能打开该功能。 47 | 48 | ``` 49 | $ node --experimental-modules my-app.mjs 50 | ``` 51 | 52 | 在实际的开发过程中,我们采取的手段有两个。一是直接使用上面 Node.js 对 ES6 的规范,二是通过 Babel 等第三方工具,将 ES6 规范的代码编译(配置工具即可)成 对应格式 的代码来使用。DDN区块链采取的是后者,因为毕竟各种配套的工具比较齐备,不必操心其中的不兼容性等潜在问题。 53 | 54 | ## DDN区块链模块研发规范 55 | 56 | DDN区块链全部使用 ES6 的模块规则,并在此基础上,规定如下用法: 57 | 58 | - 模块名字与文件名字保持一致,比如:import Address from './address'; 59 | - 模块内部导出接口命令,只能使用一个`export { }`的命令形式,其他模块导入使用`import { } from `的形式导入,也就是说模块的变量名称可能是NPM包内部唯一的; 60 | - 使用NPM包的变量与包名字保持一致,比如:import Dapp from `@ddn/dapp`; 61 | - NPM包导出命令,只能使用`export default`命令。 62 | 63 | 下面,详细说明其中要点。 64 | 65 | ES6 模块功能主要由两个命令构成:`export`和`import`。`export`命令用于规定模块的对外接口,`import`命令用于输入其他模块提供的功能。 66 | 67 | ### 1. 集中输出 68 | 69 | 一个模块就是一个独立的文件,该文件内部的所有变量、方法、类等,我们这里统一称为变量,外部是无法获取的。如果你希望外部能够读取他们,就必须使用`export`关键字输出,即提供接口(不是常量,而是变量),确保与模块内部的变量建立一一对应关系。ES6 允许使用多个`export`逐个输出,且可以出现在模块的任何位置,但是那样的体验非常不直观,我们约定: 70 | 71 | 模块的导出: 72 | 73 | - 一个模块只能有一个`export`; 74 | - `export`只能放在文件最末尾,并确保处在作用域的最顶层(比如:不能放在`if`语句里,否则报错,这是因为处于条件代码块之中,就没法做静态优化了,违背了 ES6 模块的设计初衷); 75 | 76 | 77 | 78 | NPM包的导出: 79 | 80 | - 用`export default`指定默认输出,而不是使用单独的`export`命令,直接输出所要加载的变量名或函数名,这样无需了解模块细节,借助IDE代码补全,快速开发; 81 | - 代码中使用模块中的变量,尽量携带导入的模块名字,避免名字冲突,尽量不要使用 `{ Address } = Asset` 过渡; 82 | 83 | 格式如下: 84 | 85 | ```javascript 86 | // @ddn/utils/src/index.js 87 | import AssetTypes from './asset-types'; 88 | import RuntimeState from './runtime-states'; 89 | import Address from './address'; 90 | import Amount from './amount'; 91 | import LimitCache from './limit-cache'; 92 | import Utils from './utils'; 93 | import Bignum from './bignumber'; 94 | 95 | export default { 96 | AssetTypes, 97 | RuntimeState, 98 | Address, 99 | Amount, 100 | LimitCache, 101 | Utils, 102 | Bignum 103 | }; 104 | ``` 105 | 106 | 上面代码在`export default`命令后面,使用大括号指定所要输出的一组变量。这样做就可以在脚本尾部,一眼看清楚输出了哪些变量。通常情况下,`export`输出的变量就是本来的名字,如果想修改成别的名字,使用`as`关键字重命名即可,所以`export default`命令等同于`* as default`。 107 | 108 | `export default`命令用于指定模块的默认输出,本质上就是输出一个叫做`default`的变量或方法,然后`import`的时候,系统允许你为它取任意名字。显然,一个模块只能有一个默认输出,因此`export default`命令只能使用一次。所以,import命令后面不用直接加大括号。 109 | 110 | 另外,`export`语句输出的接口,与其对应的值是动态绑定关系,即通过该接口,可以取到模块内部实时的值。这与 CommonJS 规范完全不同。CommonJS 模块输出的是值的缓存,不存在动态更新。 111 | 112 | ```javascript 113 | export var foo = 'bar'; 114 | setTimeout(() => foo = 'baz', 500); // 输出变量`foo`,值为`bar`,500 毫秒之后变成`baz` 115 | ``` 116 | 117 | 下面比较一下默认输出和正常输出。 118 | 119 | ```javascript 120 | // 第一组 121 | export default function crc32() { // 输出 122 | // ... 123 | } 124 | 125 | import crc32 from 'crc32'; // 输入 126 | 127 | // 第二组 128 | export function crc32() { // 输出 129 | // ... 130 | }; 131 | 132 | import {crc32} from 'crc32'; // 输入 133 | ``` 134 | 135 | 上面代码的两组写法,第一组是使用`export default`时,对应的`import`语句不需要使用大括号;第二组是不使用`export default`时,对应的`import`语句需要使用大括号。 136 | 137 | ### 2. 集中输入 138 | 139 | 使用`export`命令定义了模块的对外接口以后,其他 JS 文件就可以通过`import`命令加载这个模块。 140 | 141 | - 在NPM包内的一个模块导入, 142 | 143 | 144 | - NPM包的导入,代码如下: 145 | 146 | ``` 147 | // 不正确 148 | import { Address } from '@ddn/utils' 149 | console.log(Address); // 输出 undefined 150 | 151 | // 正确 152 | import Utils from '@ddn/utils' 153 | console.log(Utils.Address); 154 | 155 | 或者 156 | // 正确 157 | const { Address } = Utils; 158 | console.log(Address); 159 | ``` 160 | 161 | 162 | ```javascript 163 | // main.js 164 | import { firstName, lastName, year } from './profile.js'; 165 | 166 | function setName(element) { 167 | element.textContent = firstName + ' ' + lastName; 168 | } 169 | ``` 170 | 171 | - `import`命令输入的变量都是只读的,因为它的本质是输入接口。也就是说,不允许在加载模块的脚本里面,改写接口。也就是说,凡是输入的变量,即便能改写,也都要当作完全只读,不要轻易改变它的属性。 172 | - `import`后面的`from`指定模块文件的位置,可以是相对路径,也可以是绝对路径,`.js`后缀可以省略。如果只是模块名,不带有路径,那么必须有配置文件,告诉 JavaScript 引擎该模块的位置。 173 | 174 | - `import`命令是编译阶段执行的,在代码运行之前。因此,`import`命令具有提升效果,会提升到整个模块的头部,首先执行。所以也不能使用表达式和变量,这些只有在运行时才能得到结果的语法结构。 175 | - `import`语句是 Singleton 模式。如果多次重复执行同一句`import`语句,那么只会执行一次,而不会执行多次。 176 | 177 | ```javascript 178 | import { foo } from 'my_module'; 179 | import { bar } from 'my_module'; 180 | 181 | // 等同于 182 | import { foo, bar } from 'my_module'; 183 | ``` 184 | 185 | - 目前阶段,通过 Babel 转码,CommonJS 模块的`require`命令和 ES6 模块的`import`命令,可以写在同一个模块里面,但是不要这样做。因为`import`在静态解析阶段执行,所以它是一个模块之中最早执行的。下面的代码可能不会得到预期结果。 186 | 187 | ```javascript 188 | require('core-js/modules/es6.symbol'); 189 | require('core-js/modules/es6.promise'); 190 | import React from 'React'; 191 | ``` 192 | 193 | - 模块整体加载所在的那个对象,应该是可以静态分析的,所以不允许运行时改变。下面的写法都是不允许的。 194 | 195 | ```javascript 196 | import * as circle from './circle'; 197 | 198 | // 下面两行都是不允许的 199 | circle.foo = 'hello'; 200 | circle.area = function () {}; 201 | ``` 202 | 203 | ### 3. 接口转发 204 | 205 | 在一个模块之中,先输入后输出**同一个模块**,`import`语句可以与`export`语句写在一起,这就是所谓的接口转发。转发出去的变量在当前模块是无法使用的(因为直接导出了)。 206 | 207 | ```javascript 208 | export { foo, bar } from 'my_module'; 209 | 210 | // 可以简单理解为 211 | import { foo, bar } from 'my_module'; 212 | export { foo, bar }; // 当前模块不能直接使用`foo`和`bar` 213 | ``` 214 | 215 | 接口转发的好处: 216 | 217 | - 主要是模块的接口改名和整体输出。对于第三方模块,具名接口改默认接口,更加适用。 218 | 219 | ```javascript 220 | // 接口改名 221 | export { foo as myFoo } from 'my_module'; 222 | 223 | // 整体输出 224 | export * from 'my_module'; // 与 默认接口有区别,这里忽略`my_module`模块的`default`方法,将其他各种变量都原封不动的输出,类似继承 225 | ``` 226 | 227 | 默认接口的写法如下。 228 | 229 | ```javascript 230 | export { default } from 'foo'; 231 | ``` 232 | 233 | 具名接口改为默认接口的写法如下。 234 | 235 | ```javascript 236 | export { es6 as default } from './someModule'; 237 | 238 | // 等同于 239 | import { es6 } from './someModule'; 240 | export default es6; 241 | ``` 242 | 243 | 同样地,默认接口也可以改名为具名接口。 244 | 245 | ```javascript 246 | export { default as es6 } from './someModule'; 247 | ``` 248 | 249 | - 实现模块的继承 250 | 251 | 假设有一个`circleplus`模块,继承了`circle`模块。 252 | 253 | ```javascript 254 | // circleplus.js 255 | 256 | export * from 'circle'; 257 | export var e = 2.71828182846; 258 | export default function(x) { 259 | return Math.exp(x); 260 | } 261 | ``` 262 | 263 | 上面代码中的`export *`,表示再输出`circle`模块的所有属性和方法。然后,又输出了自定义的`e`变量和默认方法。也可以将`circle`的属性或方法,改名后再输出。 264 | 265 | ```javascript 266 | // circleplus.js 267 | 268 | export { area as circleArea } from 'circle'; 269 | ``` 270 | 271 | 上面代码表示,只输出`circle`模块的`area`方法,且将其改名为`circleArea`。 272 | 273 | ### 4. 常量处理 274 | 275 | `const`声明的常量只在当前代码块有效。如果想设置跨模块的常量(即跨多个文件),或者说一个值要被多个模块甚至多个NPM包共享,DDN区块链采用下面的写法。 276 | 277 | ```javascript 278 | // constants.js 模块 279 | export const A = 1; 280 | export const B = 3; 281 | export const C = 4; 282 | 283 | // test1.js 模块 284 | import * as constants from './constants'; 285 | console.log(constants.A); // 1 286 | console.log(constants.B); // 3 287 | 288 | // test2.js 模块 289 | import {A, B} from './constants'; 290 | console.log(A); // 1 291 | console.log(B); // 3 292 | ``` 293 | 294 | 如果要使用的常量非常多,可以建一个专门的`constants`目录,将各种常量写在不同的文件里面,保存在该目录下。 295 | 296 | ```javascript 297 | // constants/db.js 298 | export const db = { 299 | url: 'http://my.couchdbserver.local:5984', 300 | admin_username: 'admin', 301 | admin_password: 'admin password' 302 | }; 303 | 304 | // constants/user.js 305 | export const users = ['root', 'admin', 'staff', 'ceo', 'chief', 'moderator']; 306 | ``` 307 | 308 | 然后,将这些文件输出的常量,合并在`index.js`里面。 309 | 310 | ```javascript 311 | // constants/index.js 312 | export {db} from './db'; 313 | export {users} from './users'; 314 | ``` 315 | 316 | 使用的时候,直接加载`index.js`就可以了。 317 | 318 | ```javascript 319 | // script.js 320 | import {db, users} from './constants/index';◊ 321 | ``` 322 | 323 | ### 5. 动态加载 324 | 325 | 为了根据运行时需要加载不同模块,或者根据不同条件或路径加载不同模块,就需要用到动态加载。鉴于DDN区块链的灵活架构,必然大量用到这一功能,ES5阶段使用的是`require`函数,但是上面说了,不建议与`import`混用,我们将慢慢规范统一处理成这里的方法逻辑。 326 | 327 | `import()`方法负责动态加载,可以取代`require`的动态加载功能。`import`命令能够接受什么参数,`import()`函数就能接受什么参数,两者区别主要是后者为动态加载。`import()`类似于 Node 的`require`方法,区别主要是前者是异步加载,后者是同步加载。 328 | 329 | `import()`返回一个 Promise 对象。比如: 330 | 331 | ```javascript 332 | const main = document.querySelector('main'); 333 | 334 | import(`./section-modules/${someVariable}.js`) 335 | .then(module => { 336 | module.loadPageInto(main); 337 | }) 338 | .catch(err => { 339 | main.textContent = err.message; 340 | }); 341 | ``` 342 | 343 | 另外,`import()`函数与所加载的模块没有静态连接关系,这点也是与`import`语句不相同。`import()`加载模块成功以后,这个模块会作为一个对象,当作`then`方法的参数。 344 | 345 | 如果想同时加载多个模块,可以采用下面的写法。 346 | 347 | ```javascript 348 | Promise.all([ 349 | import('./module1.js'), 350 | import('./module2.js'), 351 | import('./module3.js'), 352 | ]) 353 | .then(([module1, module2, module3]) => { 354 | ··· 355 | }); 356 | ``` 357 | 358 | 或者用在 async 函数之中 359 | 360 | ```javascript 361 | async function main() { 362 | const myModule = await import('./myModule.js'); 363 | const {export1, export2} = await import('./myModule.js'); 364 | const [module1, module2, module3] = 365 | await Promise.all([ 366 | import('./module1.js'), 367 | import('./module2.js'), 368 | import('./module3.js'), 369 | ]); 370 | } 371 | main(); 372 | ``` 373 | 374 | ## 参考 375 | 376 | - https://nodejs.org/dist/latest-v12.x/docs/api/modules.html 377 | - https://www.cnblogs.com/myfirstboke/p/10563597.html 378 | - http://es6.ruanyifeng.com/#docs/module-loader 379 | - https://www.jianshu.com/p/ad427d8879cb -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # blockchain-on-nodejs 2 | 《Node.js区块链开发2》 3 | 4 | ## 说明 5 | 6 | 时隔3年,《Node.js区块链开发》影响了一批人,代码也升级到了3.0,站在新的起点,计划推出《Node.js区块链开发》第二版,新的技术、新的视角和新的模式,但是不知道大家到底是否需要,如果您喜欢,请在第一条PR的下方回复,`期待+1`,如果有100个,我放下一起工作,启动新的分享。 7 | 8 | 2019年9月7日 imfly于北京 9 | 10 | ## 日志(Log) 11 | 12 | 13 | - [x] 2020-2-15 [DDN区块链模块规范解读](./DDN区块链基础/3-DDN区块链模块规范解读.md) 14 | - [x] 2020-1-28 [DDN区块链加密库的选择](./DDN区块链基础/2-DDN区块链加密库的选择.md) 15 | - [x] 2020-1-24 [运行起来](./DDN区块链基础/1-运行起来.md) 16 | - [x] 2019-11-19 [前言视频](https://www.bilibili.com/video/av76296940) 17 | - [x] 2019-11-11 [前言](./写在前面/0-前言.md) 18 | 19 | ## 案例 20 | 21 | - [DDN 主网](http://mainnet.ddn.link) 22 | - [DDN 钱包](http://wallet.ddn.link) 23 | - [DDN手机钱包](https://www.ddn.link/product/wallet) 24 | 25 | ## 社区 26 | 27 | | Github Issue | DATM | 28 | | ------------------------------------------------------- | ------------------------------------------------------------------------------------------- | 29 | | [ddnlink/ddn/issues](https://github.com/ddnlink/ddn/issues) | ... | 30 | 31 | > PS:DATM 是基于DDN区块链的 分布式任务管理工具,大家可以在上面领取任务、讨论问题,任务完成,系统通过`智能合约`支付给你DDN 32 | 33 | ## 捐赠 34 | 35 | 你可以通过[DDN钱包](http://wallet.ddn.link)或者[DDN手机钱包](https://www.ddn.link/product/wallet)向下面的地址捐赠`DDN`,这些DDN将被用于奖励本项目的贡献者. 36 | 37 | | DDN基金会钱包转账地址 | DDN手机钱包扫码转账 | 38 | | ------------------------------------------------------- | ------------------------------------------------------------------------------------------- | 39 | | DLjrrVwnmMXstcAYVjcrpwyYb3kY1ehABU | ![](./styles/images/foundation.png) | 40 | 41 | ## 贡献者(Contributors) 42 | 43 | @imfly 44 | 45 | ## 协议 46 | 47 | 原创作品许可 [署名-非商业性使用-禁止演绎 3.0 未本地化版本 (CC BY-NC-ND 3.0)](http://creativecommons.org/licenses/by-nc-nd/3.0/deed.zh) 48 | -------------------------------------------------------------------------------- /SUMMARY.md: -------------------------------------------------------------------------------- 1 | # Nodejs开发加密货币2 2 | 3 | - 开篇的话 4 | * 前言 5 | 6 | - 区块链基础 7 | * 利益,魔鬼与天使的共同目标(了解一下真实的世界) 8 | * 区块链的本质(不同的人,有不同的理解,那么区块链的本质到底如何?) 9 | * 区块链能做什么?(加密货币是很好的场景,为什么加密货币就是货币?) 10 | * 共识机制,可编程的“利益”转移规则(略) 11 | * 区块链架构和知识图谱(略) 12 | * 区块链如何入门(略) 13 | - DDN区块链基础 14 | * DDN是什么,为什么 15 | * DDN能干什么 16 | * DDN现有的产品和生态如何 17 | * DDN与青色组织 18 | - ES6编程入门 19 | * Nodejs原来在币圈如此流行? 20 | * Nodejs让您的前端开发像子弹飞一样 21 | * Nodejs让后台开发像前端一样简单 22 | * 您必须知道的几个Nodejs编码习惯 23 | - DDN区块链开发框架(源码不解读了,直接开干应用) 24 | * DDN的架构设计,先让它运行起来 25 | * DDN-Core核心模块设计 26 | * DDN的插件机制 27 | * P2P网络实现 28 | * 加密和验证 29 | * 签名和多重签名 30 | * 区块与DPOS机制 31 | * 交易与扩展 32 | * 链上资产开发 33 | * 侧链开发 34 | * 可视化定制与部署新链 35 | * 浏览器开发 36 | * 钱包设计 37 | * 测试 38 | - 开发实践(更多的必知知识) 39 | - 加密与解密 40 | * 三张图让你全面掌握加密解密技术 41 | - 命令行设计 42 | * commander介绍 43 | - 优化 44 | * Js对数据计算处理的各种问题 45 | * 一张图学会使用Async组件进行流程控制 46 | * 关于时间戳及相关问题 47 | - 方法论 48 | * 函数式编程入门经典 49 | * 轻松从Js文件生成UML类图 50 | 51 | -------------------------------------------------------------------------------- /styles/images/datm-ddn.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imfly/blockchain-on-nodejs/1edf311c35c49d074c128ee2598d5e52651c8a06/styles/images/datm-ddn.jpeg -------------------------------------------------------------------------------- /styles/images/ddn-cli.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imfly/blockchain-on-nodejs/1edf311c35c49d074c128ee2598d5e52651c8a06/styles/images/ddn-cli.png -------------------------------------------------------------------------------- /styles/images/foundation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imfly/blockchain-on-nodejs/1edf311c35c49d074c128ee2598d5e52651c8a06/styles/images/foundation.png -------------------------------------------------------------------------------- /styles/images/hashbase.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imfly/blockchain-on-nodejs/1edf311c35c49d074c128ee2598d5e52651c8a06/styles/images/hashbase.jpg -------------------------------------------------------------------------------- /写在前面/0-前言.md: -------------------------------------------------------------------------------- 1 | 写在前面 2 | ---------- 3 | 4 | 习总书记关于区块链的最高指示精神,给了区块链行业发展的未来。从2016年春节后的第一天,直到今天(2019年11月11日)这个双11,转眼3年有余。这段时间,经历了太多的事情,产品研发、技术积累、社区运营、市场推广等等,我和团队共进退,做了很多,也学习了很多,回望来路,是该整理整理,整装再出发了。 5 | 6 | 这一次,比起3年多前的状态,我们可以分享的东西实在太多了。技术上,我们的区块链从最初的1.0版本,升级到了当前的3.0版本,功能更强大、开发更简单、代码更稳定、落地应用更广泛;技术栈更加全面,Typescript成为核心开发语言,前端摒弃Ember,全面拥抱React和React Native,从底层区块链到移动端钱包应用,模块化、扩展性更强。 7 | 8 | 产品上,我们的亿书进行了4次大的版本更新,当初使用“亿书分享亿书”的梦想已经实现;还推出了DATM(分布式自治组织管理工具),把我们当年的区块链社区管理《绿皮书》也进行了产品化,任何人参与区块链研发、运营,真的可以直接使用DATM进行贡献奖励了,无需人工记录和参与,真正公平、公正、透明,总之,2016年5月推出亿书白皮书和社区管理绿皮书以来,我们已经全部实现了当初的研发目标,并且在此基础上,进行了大量延伸和扩展。 9 | 10 | 这些延伸,包括推出的升级版区块链技术——DDN区块链,包括基于DDN区块链的各种大型应用产品,也包括与DDN底层技术配套的移动端钱包、多终端浏览器等产品。这些产品已经被纳入我们的新的里程碑——《DDN区块链白皮书》的范围,我希望,DDN能够成为未来互联网的底层架构,这不是一条公链能够承担得了的,必须是一套技术体系,而DDN就是,本书将给您详细介绍如何去达成这一目标。 11 | 12 | 所以,亲爱的读者朋友,以及一直以来关注亿书、DDN社区发展的朋友们,在习总书记的感召之下,DDN区块链这一国产区块链技术将大放异彩,本书将带您从零基础开始,一步一步走进这些技术的殿堂,让我们一起去改变这个世界! 13 | 14 | 本书是《Nodejs区块链开发》的第2版,但是,我并不想简单的延续或修改原来的内容,所以比起第一版,改动可能会比较大,大致的内容包括如下几部分: 15 | 16 | - 前言 17 | - 区块链解读(增加部分全新的解读,概念、场景、价值等) 18 | - 区块链底层解析(源码解读部分,源码全部改掉,需要新增架构设计以及几个重要的包,比如:ddn-cli、ddn-ui等内容) 19 | - 区块链钱包开发(全新内容) 20 | - 区块链浏览器开发(全新内容) 21 | - 区块链DAPP开发(全新内容) 22 | - 区块链应用案例解析(全新内容) 23 | - 开发最佳实践(Node.js入门、React和React Native入门、函数式编程等都放到这里吧) 24 | - 附录 25 | - 后记 26 | 27 | 与这些内容配合而来的,我们也会推出对应的视频讲解,更重要的是接纳社区的朋友们直接参与其中。虽然上述内容没有涉及到运营,但是本书的完成,将完美诠释区块链运营和社区运作的所有内容。所以,很多朋友希望书完成之后再阅读,其实那个时候,你会错失很多有价值的东西和内容。 28 | 29 | 一起参与进来,边学习、边开发、边挣钱,这是一种什么样的生活体验呢?! 30 | 31 | imfly 32 | 2019年11月11日 -------------------------------------------------------------------------------- /写在前面/1-如何用区块链重塑产业生产形态.md: -------------------------------------------------------------------------------- 1 | 如何用区块链重塑产业生产形态 2 | ---------------------- 3 | 4 | 我个人来自于传统实体企业,2015年之前,主要从事企业自动化方向,也就是物联网与辅助生产领域,所以如何通过互联网技术帮助生产企业一直是我的思考方向。做了区块链,就变成了如何用区块链技术服务实体企业。 5 | 6 | 区块链重塑产业生产形态,这个题目比较大,这里包含几层意思,一是区块链要辅助生产,辅助产业;二是区块链能改变传统产业,而且能更好。 7 | 8 | 但是,大家知道,现状可能并不如此,一定会有很多朋友提出异议,比如:有人会认为区块链来自金融领域,用于其他领域都是生搬硬套,必死无疑;也有人认为即便能够用于生产企业,其性能只能拖累其效率,无疑是饮鸩止渴。 9 | 10 | 当然,如果仅仅“为了区块链而区块链”的时候,这些问题一定存在,而且也一定会持续的讨论下去。不过,今天,我的分享不是反驳这些疑虑,我的关注点在于积极的正面的促进作用,其他的还是让它暂时搁置,让时间去回答好了。 11 | 12 | 所以,我思来想去,还是从具体的案例讲起比较好。第一个案例,就是我们的LIMSChain产品,我把它定义为全国首款基于区块链的检验检测管理平台。第二个案例,就是我们的DATM产品,我把它定义为基于区块链的组织管理工具(不仅限于去中心化组织)。 13 | 14 | ## 案例1:关于LIMSChain 15 | 16 | ### 检验检测行业 17 | 先说说该产品面向的行业,检验检测行业。这是一个与大家很近,但又很遥远的行业,可以理解为“因为太熟悉,所以不认识”。大家都知道,我们每天吃的、穿的、用的,都需要从市场上购买,这些商品是否合格,是否有危害大家的农药、甲醛或重金属等等? 18 | 19 | 更具体一点,例如:近些年来,发生的毒奶粉事件、假疫苗事件、地沟油事件等,这类大的食品、药品安全事故,是如何产生的呢?更值得一提的是,今年 6 月 7 日为首届“世界食品安全日”,其主题是“食品安全—与每个人都息息相关。”据世界卫生组织报道,全球每年发生6亿例食源性疾病(几乎每 10 人中就有 1 例),其中 5 岁以下儿童承担了 40% 的食源性疾病负担,不安全食品对人类健康和经济构成了严重威胁。 20 | 21 | 那么,谁来为我们提供保障呢?是政府市场监管部门,他们怎么来提供保障?他们会定期抽查检验。这类抽查检验,就是我说的检验检测。这类检验检测每天都会进行,而且需要专业的独立资质的检测机构才行。这就是检测行业的重要性,产品质量合格是商品经济有序运行的基础,同时也是人类社会正常运转的重要保证。而检验检测是产品质量的技术保障,也是社会各方共同依赖的质量技术基础。 22 | 23 | 目前,这类检测机构,国内有39472家,市场规模达到2800多亿元,据官方数据统计,2013年至2018年,中国检测行业市场规模平均增长率高达15%。这些检测机构,每年的检测报告达到4.28亿份,其中80%约3.42亿份报告是通过人工处理的。也就是80%连信息化都没有。 24 | 25 | 这些检测机构,少则投入几百万,多的上亿元,大部分是实验室设备,其余的都是人工成本。但是,他们的收益,却限制在实验员的数量,即23多万元/实验员,如果想多挣钱,就多加设备、多雇实验员。所以,原本一个技术门槛很高、前景广阔的行业,却因为成本无法控制,沦落成按照人头计算的人口密集型行业。显然,无论从哪方面来说,这个行业都需要重塑,都需要大大的进步,对人、对己、对国家都有好处。 26 | 27 | ### 关于LIMSChain 28 | 于是,我们的产品,LIMSChain出现了。这款产品,是一套产品质量基础设施,目标就是构建一套简单的、国际化的、去中心的优质产品聚合系统和产品质量管理基础设施,让人人都可参与、人人都可监管、人人都可收益。 29 | 30 | 它由3部分组成,一部分,面向检测机构提供了一套专业的实验室信息管理系统(简称为LIMS),目前客户反馈的数据是,能为客户降低30%的人工成本,这个数据很吸引人了,50人规模的检测机构,就是15人,按照6万/年的人工成本,就是90万/年。 31 | 32 | 另一部分,就是我们自主知识产权的区块链系统,把检测数据、检测报告、检测资质全部存证到区块链上,后面我来解释为什么这么架构,为什么使用区块链。 33 | 34 | 第三部分,就是面向监管部门的公共安全监管系统,这个已经有多个地市陆续会上。这里,需要解释的是,这三个部分实际上是一体的,只不过,为了方便表述和理解,我把它人为的分拆成了三个部分而已。 35 | 36 | ### 区块链的价值 37 | 那么,为什么使用区块链?或者说,区块链在系统中起到了什么作用? 38 | 39 | 首先,检测报告的重要性,大家应该理解,它可能会给某类商品造成正面或者负面的影响,是极具利害关系的一种数据,是生产企业接受惩罚的一种证据,更是好产品被市场认可的背书,同时,天生就是政府或生产企业花钱购买的数字资产。所以,检测报告通过区块链进行数字化、资产化,再正常不过,我想很多人对此不会怀疑。 40 | 41 | 那么问题是,有必要吗?我们上面说了,不要为区块链而区块链,那么这个一定要用区块链的更深层次的原因是什么呢?这就涉及到行业特点,可以解释的有很多,我仅解释3点。 42 | 43 | 一是检测流程的规范性。检测机构自身要接受政府部门监管,如果出假报告,就会被吊销资质,损失惨重,所以检测机构非常需要自证清白,LIMSChain将每一个步骤关键的数据都进行存证,正好能满足了检测机构合规的需求,所以他们很欢迎。 44 | 45 | 二是,传统互联网可以将报告数字化存储,但是终端消费用户开放的时候(要脱敏),不具有公信力,价值变现的认可度不高,使用区块链就能很好的解决这个问题。 46 | 47 | 三是,该行业监管部门,目前没有任何产品能帮助他们在线监管报告数据,更无从知晓整个市场的检测情况。而这款产品可以在脱敏的情况下进行统计和监管,更好把控市场趋势。 48 | 49 | 当然,还有更多好处,这里就不多解释了。另一方面,我也相信很多朋友,有很多疑问,比如:报告造假怎么办?检索到报告,手动传播到网上怎么办?检测机构修改报告怎么办?很多问题我们都被问到了,也找到了解决方案,有兴趣咱们私下交流,这些不是今天的主题,暂时不多解释了。 50 | 51 | ### 运行效果 52 | 接下来,运行的效果怎么样呢?向大家汇报一下我们的市场情况,目前,签约的检测机构已经几十家了,遍布北京、山东、辽宁、河北等,政府部门也有2个地级市达成合作,将逐步试点推开,到时候这些地区的检测机构也必然会用上这个产品。所以,正式推向市场这半年多来,总体反馈还是很好的,特别是一些检测机构使用之后,省心又省钱,对我们那个客气,很让人高兴。 53 | 54 | 总之,一句话,我们通过区块链技术,正在帮助检验检测这个涉及民生的行业更加高效、透明。 55 | 56 | ## 案例2:关于DATM 57 | ### DATM诞生的背景 58 | 区块链技术性很强,LIMSChain作为行业解决方案,研发是非常重的,这类技术属性很强的产品,最大的风险就是研发失败,没有深厚的项目管理经验、行业经验和团队建设能力,失败的概率在80%以上。 59 | 60 | 大家也看到了,目前90%的区块链应用,包括一些融资很高的所谓明星产品,两年多了都没能上线,有的甚至压根就没有见过他们的代码,所以,空气项目盛行,再正常不过的事情了。 61 | 62 | 举两个小例子,当然,大家不要对号入座,一个是传统互联网产品,总投资3000多万,研发团队顶峰时段200人左右,仅产品经理就有10多个,项目不到2年死掉,连个试运行的demo都没有拿出来; 63 | 64 | 另一个例子,区块链行业,一家上市公司,在17、18年最火的时间,花重金组建了区块链团队,最多时段400多人,总投资4个多亿人民币,最后也是什么产品都没有拿出来,团队解散。 65 | 66 | 人们常说,成功的结果只有一个,失败的原因却有千万种。对一个真正的区块链项目(空气就不要提了)而言,我个人觉得,最大的原因就是项目管理。说实话,与其说是我的经验,不如说是我的教训。 67 | 68 | ### DATM的历程 69 | 也因此,我们自己开发了一套项目管理工具,也就是要跟大家聊的DATM,他的全称翻译成中文就是”分布式任务管理系统“,经过多次迭代升级,现在融入了社区组织的概念,真正成为了适合我们进行分布式组织管理的工具。 70 | 71 | 2016年,我们率先推出《社区管理绿皮书》,就是通过社区协作来发展区块链项目,但当时,就是通过人工来操作,借助QQ群、github网站等,我们的规则和管理都不很完善,分配不能做到及时公正、公开,社区成员时常出现抱怨的声音,也流失了一些忠实的粉丝。 72 | 73 | 再后来,我们赶工做产品,各种因素一度导致我们项目进展不畅,浪费时间和成本,我们使用过盯盯,也用过其他各种项目管理工具,但是都不能很好的解决我们的问题。 74 | 75 | 其中,主要问题有3个,一个是产品与运营的协同问题,很多时候,产品出来了,或者开发到某个程度了,运营却无从了解,即便在一起开会,运营也听的一知半解。 76 | 77 | 另一个是社区管理问题。因为我们要维护一个大的开源社区,除了公司这几十号人,还有社区几百号技术人员和运营贡献人员,每一次贡献统计,就让大家忙活很久,更不要说即时公正了。 78 | 79 | 第三个就是社区反馈问题。通过微信、QQ或者网站,可以解决部分问题,但是在繁忙的时段,很多信息被忽视甚至忽略,客户或社区的声音不能及时反馈给团队,造成很多浪费。 80 | 81 | 我们的第一期产品,是web端的DATM,我的要求不高,就是要团队每个人任务清晰、彼此都能方便查看,任务和绩效随时统计,互相监督,事事留痕。团队仅花费1周时间就上线了第一个Demo,又花了2周进行了打磨升级,初见成效。 82 | 83 | 现在,我们推出了移动版,正式面向社区开放,集成了Token奖励、红包和任务悬赏,既可以有私有任务,也有公开任务;既方便团队管理,也可以面向社区,对社区成员进行管理,社区管理模式也逐步清晰。 84 | 85 | ### 未来组织形态 86 | 当前,自治组织、分布式组织,特别是青色组织的概念,正在被越来越多的人和企业接受。从DATM的用户反馈来看,大家的态度比较积极。但是,目前包括盯盯、飞书在内的很多产品,仍然偏重于中心化的组织管理模式,是不适合这类管理的。 87 | 88 | 所以,我们的DATM想走一条差异化的道路,也是跟我们作为区块链团队的特点有关,那就是半中心化的道路。我个人是自治组织的推崇者,我认为未来一定会有市场,但是目前各种条件不够成熟,需要时间过度,DATM正好可以担此重任。 89 | 90 | ### 运行情况 91 | 截止目前,DATM正式推出20几天,用户数量达到xxx人。欢迎群里的朋友们测试使用,狠狠拍砖。也欢迎项目方入驻,接下来的版本可以支持各自的Token定制,完全去中心化。 92 | 93 | 总之,第二句话,我们通过区块链技术,让我们自己的管理更加高效、透明,对未来的组织形态有了新的尝试。 94 | 95 | ## 结语 96 | 最后,回归到今天的话题,区块链是如何重塑产业生产形态的呢?我想,无非就是将区块链存证、授权和追溯的特点,融合进产业自身的特性中去,给传统产业插上金融的翅膀,让那些原本离钱很远的事情变得与钱更近了,让那些原本有价值的东西得以凸显和变现。**真正的改变,一定是从本质上去撼动,所以,产业形态的重塑,也只能区块链能做到。** 97 | -------------------------------------------------------------------------------- /开发实践/0-planning.md: -------------------------------------------------------------------------------- 1 | 1. Eslink及其工具; 2 | 2. Rollup和Webpack的使用; 3 | 3. Ci 4 | 4. Test 5 | 5. Deploy 6 | 6. 函数式编程 7 | 7. 编程技巧 -------------------------------------------------------------------------------- /开发实践/1-Eslink的使用.md: -------------------------------------------------------------------------------- 1 | Eslint、TSLink及其插件的使用 2 | ----------------- 3 | 4 | ## 是什么 5 | 6 | ## 为什么 7 | 8 | ## 怎么用 9 | 10 | ## 更多技巧 -------------------------------------------------------------------------------- /开发实践/2-rollup和webpack的使用.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/imfly/blockchain-on-nodejs/1edf311c35c49d074c128ee2598d5e52651c8a06/开发实践/2-rollup和webpack的使用.md -------------------------------------------------------------------------------- /开发实践/3-buffer解读.md: -------------------------------------------------------------------------------- 1 | # Buffer解读 2 | 3 | 进行中... --------------------------------------------------------------------------------