From 401795b9d69f697032f6109f2ace38907f48995d Mon Sep 17 00:00:00 2001 From: zhangliang <55269778@qq.com> Date: Wed, 13 Mar 2019 00:07:31 +0800 Subject: [PATCH] robots.txt --- 2019-02-20.md | 1 + source/_drafts/2019-02-22.md | 92 ++++++ ...44\271\240\345\221\250\346\212\245-01W.md" | 15 + ...44\271\240\345\221\250\346\212\245-02W.md" | 13 + ...44\271\240\345\221\250\346\212\245-03W.md" | 13 + ...44\271\240\345\221\250\346\212\245-04W.md" | 13 + ...44\271\240\345\221\250\346\212\245-05W.md" | 13 + ...44\271\240\345\221\250\346\212\245-06W.md" | 13 + ...44\271\240\345\221\250\346\212\245-07W.md" | 13 + ...01\347\232\204\351\225\277\346\200\247.md" | 52 ++++ ...44\271\240\345\221\250\346\212\245-08W.md" | 58 ++++ source/_posts/20190128-eossmart-c-basic.md | 120 ++++++++ source/_posts/20190128-eossmart-c-intro.md | 56 ++++ source/_posts/20190214-rebuildbrain-habit.md | 58 ++++ ...50\257\206-ABI\346\226\207\344\273\266.md" | 265 ++++++++++++++++++ ...72\350\203\275\345\220\210\347\272\246.md" | 125 +++++++++ 16 files changed, 920 insertions(+) create mode 100644 2019-02-20.md create mode 100644 source/_drafts/2019-02-22.md create mode 100644 "source/_drafts/20190110_HackDApp\345\255\246\344\271\240\345\221\250\346\212\245-01W.md" create mode 100644 "source/_drafts/20190121-HackDApp\345\255\246\344\271\240\345\221\250\346\212\245-02W.md" create mode 100644 "source/_drafts/20190122-HackDApp\345\255\246\344\271\240\345\221\250\346\212\245-03W.md" create mode 100644 "source/_drafts/20190123-HackDApp\345\255\246\344\271\240\345\221\250\346\212\245-04W.md" create mode 100644 "source/_drafts/20190124-HackDApp\345\255\246\344\271\240\345\221\250\346\212\245-05W.md" create mode 100644 "source/_drafts/20190125-HackDApp\345\255\246\344\271\240\345\221\250\346\212\245-06W.md" create mode 100644 "source/_drafts/20190126-HackDApp\345\255\246\344\271\240\345\221\250\346\212\245-07W.md" create mode 100644 "source/_posts/2019012102-\345\235\232\346\214\201\347\232\204\351\225\277\346\200\247.md" create mode 100644 "source/_posts/20190127-HackDApp\345\255\246\344\271\240\345\221\250\346\212\245-08W.md" create mode 100644 source/_posts/20190128-eossmart-c-basic.md create mode 100644 source/_posts/20190128-eossmart-c-intro.md create mode 100644 source/_posts/20190214-rebuildbrain-habit.md create mode 100644 "source/_posts/EOS\347\247\221\346\231\256\345\260\217\347\237\245\350\257\206-ABI\346\226\207\344\273\266.md" create mode 100644 "source/_posts/\344\275\277\347\224\250EOS-js\345\217\221\345\270\203EOS\346\231\272\350\203\275\345\220\210\347\272\246.md" diff --git a/2019-02-20.md b/2019-02-20.md new file mode 100644 index 00000000..4e768b56 --- /dev/null +++ b/2019-02-20.md @@ -0,0 +1 @@ +# \ No newline at end of file diff --git a/source/_drafts/2019-02-22.md b/source/_drafts/2019-02-22.md new file mode 100644 index 00000000..282be598 --- /dev/null +++ b/source/_drafts/2019-02-22.md @@ -0,0 +1,92 @@ +--- +abbrlink: 1 +--- +# 基于EOS/Node.js的DApp项目实战---去中心化交易所 + +## 一、介绍 +### 1.1 去中心化交易所简介 +众所周知,在传统中心化交易所的选择上,用户往往最担心的就是资金安全问题,原本想通过投资赚钱却惨遭意外损失,所以会优先选用那些信用度较高且知名机构背书的交易所。 + +但在区块链行业发展初期, 很多兴起的TOKEN中心化交易所都是由一些初创型或者稍有名气但不足以完全信任的公司所运营, 所以提高了用户心理上的资金风险指数。而且通过过往发生的各种交易所事件,也佐证了交易所资金私自挪用、暗箱操作、黑客攻击等事件发生的可能性;除此之外,还要面临公司内部运营风险、交易不透明等问题。 + +与此同时, 随着区块链的进一步发展,出现了不同解决方案的去中化交易所, 用来解决中心化所带来的各种风险问题。其核心优势在于规避集中式资产管理, 用户对自己的资产拥有绝对的所有权与控制权,因此资产被盗的可能性极低,很大程度上降低了用户对交易所的信任成本。但由于资产的交易操作是由区块链来驱动的,所以也会受到区块确认速度的限制,近而影响用户体验。 +目前的商业典型案例有: EtherDela、0x、Kyber、Loopring、bitshares等。 + +### 1.2 项目介绍 +本项目是使用EOS、SmartContract、Node.js、React等技术架构, 采用链上搓合与资产清算的方案实现的去中心化交易所。 + +在交易所中, 用户可以直接使用自己的钱包进行帐号登录;然后使用自己的用户权限直接创建买/卖订单,而无需进行币种充值;当系统发现订单薄中存在符合搓合价格要求的订单后,则由系统直接进行搓合,并将搓合日志记录至区块链上;最后,由系统将搓合成功的部分或完全成交的TOKEN转帐到对方帐号地址。 + +另外,当系统调度发现链上存在成交日志时,会自动将成交记录同步至后端服务数据库,并同步更新K线图报表数据以及实时更新币价信息;最后,根据变动的信息数据, 通过socket服务将消息推送到前端展示页。 + +本系统核心业务逻辑主要是通过智能合约进行实现的, 其中包括搓合逻辑的处理、关键数据的定义、买卖单的创建以及订单薄的维护;而后端服务主要是以node.js技术进行功能实现,一方面用于与区块链的接口交互,比如:查询合约内数据以及链上区块数据;另一方面主要用于对外提供http及socket接口服务,通过整合业务数据及合约数据,以供前端页面的数据展示;除此之外,后端还有配套的调度服务,实时同步链上数据,并生成不同维度的报表数据。 + +### 1.3 项目详情 + +本项目从功能结构上,主要划分为六大模块: +- 基础数据管理; +- 订单管理 +- 搓合管理 +- 系统管理 +- 报表管理 +- 调度管理 + +**基础数据管理**,主要用于维护币种及交易对数据。 币种管理主要用于定义当前交易所所支持的币种, 比如币种名称, 合约名称及资金精度等;交易对管理主要用于定义基准代币可兑换的币种、交易对最小订单量以及手续费等信息; + +**订单管理**, 主要用于维护用户订单数据以及交易所订单薄数据。用户订单功能主要用于记录用户实时创建的买/卖单交易数据, 其中包括交易对、购买价格、订单量、订单状态等数据信息;而订单薄功能主要用于对交易所所有的订单按卖买类型进行分队列排序,从而方便展示当前交易对的交易深度以及供搓合功能处理; + +**搓合管理**, 主要用于实时将订单薄中符中搓合条件的订单进行数据处理,并同时更新用户订单数据以及资金清算等业务; + +**系统管理**, 主要用于维护交易所配置数据以及运营状态。比如,是否锁定或开启交易所; + +**调度管理**, 主要用于实时监控链上搓合成交记录,并实时同步订单数据至数据库,供前端K线图的数据展示; + +**报表管理**, 主要用于通过交易市场的交易情况实时展示K线图报表数据以及实时更新所有交易对币价信息, 比如:24小时成交量, 当前币种价格、涨跌幅等信息。 + +### 1. 4 技术需求 +要成功完成本项目开发, 您应该对以下语言有基本的了解: +- C/C++编程基础 + EOS智能合约本身是用C++语言进行编写的,所以需要对一些基础的数据类型、结构体、函数库有一些简单的了解; +- Docker容器 + 为了提供最佳的实践环境,考虑EOS链的搭建时间成本较高,所以使用Docker技术快速构建链环境,方便大家在开发过程对链环境的快速启动或还原; +- Node.js + Node主要用于链接前端页面与智能合约间的交互,其中包括: 调用合约方法、同步数据、提供服务接口等工作。 +- Jest + 为了保证功能在持续完善过程中,可能出现的各种不确定的代码影响。所以使用测试用例可以提高验证效率,降低代码bug风险。 + +### 1.5 涉及技术点 + +![](http://assets.processon.com/chart_image/5c6cee61e4b07fada4ec47a0.png) + +## 二、项目架构 + +![](http://assets.processon.com/chart_image/5c6ccd91e4b07fada4ec1a3a.png) + +## 三、业务流程图 + +![](http://assets.processon.com/chart_image/5c6e043ee4b056ae2a109843.png) + +## 四、实现步骤 +1. 配置运行环境及IDE工具: Git、Node、npm、vscode; +2. 配置工程环境; +3. 合约设计; 数据结构、接口定义; +4. 编写测试用例,对合约方法进行测试; +5. 封装智能合约SDK,供业务系统调用; +6. 使用Node-Express开发业务系统,并整合调度、数据库、日志、缓存、日期、多配置等组件服务; +7. 实现同步区块调度服务; +8. 实现同步区块数据至报表服务; +9. 实现对外HTTP服务接口; +10. 实现对外SOCKET服务接口; +11. 集成PM2守护启动线程; +12. 与前端界面对接接口并整体测试 +13. 项目发布与部署。发布合约至测试网或正式网, 启动前后端项目系统。 + +## 五、项目进度安排 + +![](http://assets.processon.com/chart_image/5c6baaf8e4b0fa03ceb804b2.png) + +## 五、项目成果展示 + +![](https://ws3.sinaimg.cn/large/006tKfTcly1g0cmwln6fzj315i0u00vk.jpg) + + diff --git "a/source/_drafts/20190110_HackDApp\345\255\246\344\271\240\345\221\250\346\212\245-01W.md" "b/source/_drafts/20190110_HackDApp\345\255\246\344\271\240\345\221\250\346\212\245-01W.md" new file mode 100644 index 00000000..bdc5b245 --- /dev/null +++ "b/source/_drafts/20190110_HackDApp\345\255\246\344\271\240\345\221\250\346\212\245-01W.md" @@ -0,0 +1,15 @@ +--- +title: 'HackDApp学习周报01W:习惯与仪式感' +categories: 周报(2019) +url: weekly01 +tags: + - EOSDApp教程 +keywords: + - EOS开发环境 + - EOS开发工具 + - EOS实战开发 +abbrlink: 44014 +date: 2019-01-09 20:17:23 +--- + +最近,纠正了自己一个关于精力方面的概念理解。就是 自律 VS 习惯。 diff --git "a/source/_drafts/20190121-HackDApp\345\255\246\344\271\240\345\221\250\346\212\245-02W.md" "b/source/_drafts/20190121-HackDApp\345\255\246\344\271\240\345\221\250\346\212\245-02W.md" new file mode 100644 index 00000000..be30cc63 --- /dev/null +++ "b/source/_drafts/20190121-HackDApp\345\255\246\344\271\240\345\221\250\346\212\245-02W.md" @@ -0,0 +1,13 @@ +--- +title: 'HackDApp学习周报02W:关于工具与产品' +categories: 周报(2019) +url: weekly02 +tags: + - EOSDApp教程 +keywords: + - EOS开发环境 + - EOS开发工具 + - EOS实战开发 +abbrlink: 58600 +date: 2019-01-21 00:38:26 +--- diff --git "a/source/_drafts/20190122-HackDApp\345\255\246\344\271\240\345\221\250\346\212\245-03W.md" "b/source/_drafts/20190122-HackDApp\345\255\246\344\271\240\345\221\250\346\212\245-03W.md" new file mode 100644 index 00000000..7adcc1a0 --- /dev/null +++ "b/source/_drafts/20190122-HackDApp\345\255\246\344\271\240\345\221\250\346\212\245-03W.md" @@ -0,0 +1,13 @@ +--- +title: 'HackDApp学习周报03W:关于工具与产品' +categories: 周报(2019) +url: weekly03 +tags: + - EOSDApp教程 +keywords: + - EOS开发环境 + - EOS开发工具 + - EOS实战开发 +abbrlink: 58600 +date: 2019-01-21 00:38:26 +--- diff --git "a/source/_drafts/20190123-HackDApp\345\255\246\344\271\240\345\221\250\346\212\245-04W.md" "b/source/_drafts/20190123-HackDApp\345\255\246\344\271\240\345\221\250\346\212\245-04W.md" new file mode 100644 index 00000000..39cf5705 --- /dev/null +++ "b/source/_drafts/20190123-HackDApp\345\255\246\344\271\240\345\221\250\346\212\245-04W.md" @@ -0,0 +1,13 @@ +--- +title: 'HackDApp学习周报02W:关于工具与产品' +categories: 周报(2019) +url: weekly04 +tags: + - EOSDApp教程 +keywords: + - EOS开发环境 + - EOS开发工具 + - EOS实战开发 +abbrlink: 58600 +date: 2019-01-21 00:38:26 +--- diff --git "a/source/_drafts/20190124-HackDApp\345\255\246\344\271\240\345\221\250\346\212\245-05W.md" "b/source/_drafts/20190124-HackDApp\345\255\246\344\271\240\345\221\250\346\212\245-05W.md" new file mode 100644 index 00000000..bb721f09 --- /dev/null +++ "b/source/_drafts/20190124-HackDApp\345\255\246\344\271\240\345\221\250\346\212\245-05W.md" @@ -0,0 +1,13 @@ +--- +title: 'HackDApp学习周报02W:关于工具与产品' +categories: 周报(2019) +url: weekly05 +tags: + - EOSDApp教程 +keywords: + - EOS开发环境 + - EOS开发工具 + - EOS实战开发 +abbrlink: 58600 +date: 2019-01-21 00:38:26 +--- diff --git "a/source/_drafts/20190125-HackDApp\345\255\246\344\271\240\345\221\250\346\212\245-06W.md" "b/source/_drafts/20190125-HackDApp\345\255\246\344\271\240\345\221\250\346\212\245-06W.md" new file mode 100644 index 00000000..4335afe1 --- /dev/null +++ "b/source/_drafts/20190125-HackDApp\345\255\246\344\271\240\345\221\250\346\212\245-06W.md" @@ -0,0 +1,13 @@ +--- +title: 'HackDApp学习周报02W:关于工具与产品' +categories: 周报(2019) +url: weekly06 +tags: + - EOSDApp教程 +keywords: + - EOS开发环境 + - EOS开发工具 + - EOS实战开发 +abbrlink: 58600 +date: 2019-01-21 00:38:26 +--- diff --git "a/source/_drafts/20190126-HackDApp\345\255\246\344\271\240\345\221\250\346\212\245-07W.md" "b/source/_drafts/20190126-HackDApp\345\255\246\344\271\240\345\221\250\346\212\245-07W.md" new file mode 100644 index 00000000..9f59a106 --- /dev/null +++ "b/source/_drafts/20190126-HackDApp\345\255\246\344\271\240\345\221\250\346\212\245-07W.md" @@ -0,0 +1,13 @@ +--- +title: 'HackDApp学习周报02W:关于工具与产品' +categories: 周报(2019) +url: weekly07 +tags: + - EOSDApp教程 +keywords: + - EOS开发环境 + - EOS开发工具 + - EOS实战开发 +abbrlink: 58600 +date: 2019-01-21 00:38:26 +--- diff --git "a/source/_posts/2019012102-\345\235\232\346\214\201\347\232\204\351\225\277\346\200\247.md" "b/source/_posts/2019012102-\345\235\232\346\214\201\347\232\204\351\225\277\346\200\247.md" new file mode 100644 index 00000000..b45ccbcc --- /dev/null +++ "b/source/_posts/2019012102-\345\235\232\346\214\201\347\232\204\351\225\277\346\200\247.md" @@ -0,0 +1,52 @@ +--- +title: 坚持的长性 +categories: 重塑思维 +url: think_habit +tags: + - 习惯养成 + - 仪式感 + - 内心的满足 + - 2019要做的事 +keywords: + - 习惯养成 + - 仪式感 + - 内心的满足 + - 2019要做的事 +abbrlink: 22134 +date: 2019-01-21 09:31:24 +toc: true +--- + +![](https://ws1.sinaimg.cn/large/006tNc79gy1fzdyksu0ykj30qy0dw400.jpg) + +今天早上算是被媳妇嘲笑了一番,为啥呢? + +因为之前自己有一段时间,为了背英语单词,所以早起了一个月,而如今早一天晚一天,早起完全看心情。 + +媳妇给出的评价就是:用劲过猛,要么及早要么极迟,完全是一种过激行为。 + +同时她也给出建议:只要比上班的时间多出一小时其实就可以做很多事情。重要的是常态化。 + +---- + +2019开始了,自己确没开始。以前都早早给自己作出各种规划,对比现在,还不如之前的自己吗?不应该是每年比前一年好一些吗或者每天比昨天好一些吗? + +哦,也可能是最近超忙,导致各种规划的推迟。但内心同时又会想起另外一种声音:不,你不是,你只是懒。事情没把你逼到一种绝境上,你是不会立即行动的。 + +## 2019要做的事 + +1. 早起,不早起怎么做重要的事;而且希望能找到一些习惯思维方式; +2. 持续写作,写一本自己的技术书籍,打造自己的硬核; +3. 持续总结,不犯过去犯的错,少走弯路; +4. 思考习惯养成路径,以便培养自己新习惯的有效成功率 + +注:事情不在多,夯实好这几点。 + +## 目前的状态 + +- 时不时早起起来做一些事情,可能是工作上的,也可能是生活上的,但缺少对书的阅读;另外,感觉早上精力特别出奇的好,是否应该做一些最重要的事情,而读书的化放在晚上的时候。 +- 未达到持续写东西的地步,需要检讨;可能存在的原因: 对于第二天早上要写的东西,前一天没有大致规划;或者说并不需要规划,每天早上写的时候就按之前的套路写就可以了,不讲究一次写完写完美,而是持续写出自己的每个内容点,草稿结束后再修改,也是告诉自己好文章是持续修改出来的,不可能写完就扔那儿了,而是要持续完善。包括今天写的这篇,其实也是由之前早上写的卡片扩展而来的。 +- 总结之前过于重视形式化。总结对于我来讲,总感觉认可但又未给予足够的重视,因为总是断断续续的写一些自检清单。可能这个和习惯的养成也是一样,归根到底是没有成长的即视感,也就是没有反馈。比如:刮胡子,为什么要举这个例子呢?因为之前用电动剃须刀时,总是时不时刮一次;而用手动刮胡刀后,发现自己几乎每天都会坚持这件事。当时再想为什么这件事能坚持的如此之前呢?那其他事情怎么不能坚持下去呢?我是否能够从刮胡子这件事情中找到自己内心的那一份认识与感受呢。后来才发现,那是因为刮胡子这件事能让我内心出现一份好形象不邋遢的意识。洗漱的时候就是在潜意识里调动这份动力,而且在刮完胡子后更加让自己内心得以满足,这不正是一种仪式感吗? +- 正在有意识,感受自己每天坚持做一件事情的内心是如何的? + +所以,如果要让某个行为成为你的习惯,你就要从内心上提高对它的认可,以及最重要的一件事,你要寻找你的内心感受,是什么让你满足。如果这个不好理解的话,我给你的建议就是观察你已有的习惯中想想那是一种什么感觉,做个比较可能会更形象一些。 diff --git "a/source/_posts/20190127-HackDApp\345\255\246\344\271\240\345\221\250\346\212\245-08W.md" "b/source/_posts/20190127-HackDApp\345\255\246\344\271\240\345\221\250\346\212\245-08W.md" new file mode 100644 index 00000000..150bf96a --- /dev/null +++ "b/source/_posts/20190127-HackDApp\345\255\246\344\271\240\345\221\250\346\212\245-08W.md" @@ -0,0 +1,58 @@ +--- +title: 'HackDApp学习周报02W:如何成为演讲的高手' +categories: 周报(2019) +url: weekly08 +tags: + - 学习周报 +keywords: +abbrlink: 58600 +date: 2019-01-21 00:38:26 +--- + +# 知识学习 + +- [TED深度学习四步法](http://joinwee.com/lesson/20/#4) +何为组块 +- [如保成为演讲的高手](得到) + +---- + +# 思维成长 + +---- + +# 软件工具 + +---- + +# 书籍阅读 + +- 变量 + 罗振宇推荐, 从现象中看到本质; +- 创新算法 + 阳志平博客推荐 + +---- + +# 好玩的事 + +- + +---- + +# vlog + +1. 如何制作自己的vlog + 风格确定; 编写脚本; 根据脚本选择镜头录制; 视频剪辑。 +2. 如何制作转场、添加字幕 + youtube里资源还是蛮多的,购买相关插件 +3. 如何找免费音乐 + B站资源推荐 + +---- + +# 其他 + +[https://www.datascienceweekly.org/newsletters/data-science-weekly-newsletter-issue-272](https://www.datascienceweekly.org/newsletters/data-science-weekly-newsletter-issue-272) + +![xx](https://ws1.sinaimg.cn/large/006tKfTcly1g0e568svouj30t64cs7k4.jpg) \ No newline at end of file diff --git a/source/_posts/20190128-eossmart-c-basic.md b/source/_posts/20190128-eossmart-c-basic.md new file mode 100644 index 00000000..8e3343b4 --- /dev/null +++ b/source/_posts/20190128-eossmart-c-basic.md @@ -0,0 +1,120 @@ +--- +title: C++基础语法(EOS完全开发指南) +categories: EOS完全开发指南 +url: eosdev_cplus_basic +tags: + - EOS完全开发指南 + - C++导读 + - EOS合约开发教程 +keywords: + - EOS完全开发指南 + - C++导读 + - EOS合约开发教程 +abbrlink: 7231 +date: 2019-01-28 18:16:50 +toc: true +--- +`Author: zhangliang | WeChat: rushking2009 | Mail: zhangliang@cldy.org` + +```c +/* filename: myapp.cpp + date: 2019-01-28 3:06 PM + auth: zhangliang */ + +#include //定义头文件 +#include + +int main() +{ + using namespace std; //命令空间, 简化后续变量或方法调用。e.g. std::string 等同于 string + + string msg = "hi, my first dapp"; //定义变量 + + cout << msg < + +## 1. `#include ` + +头文件定义主要用于引用第三方函数库,通过调用第三方函数可以减少开发代码量,提高开发效率,同时也避免了不必要的重复造轮子。 + +比如:通过引用``库,可以帮助我们快速使用里面的函数进行一些数学运算。 + +![函数列表](https://ws3.sinaimg.cn/large/006tNc79ly1fzmer35re6j30l30j6myt.jpg) + +所以,后续我们需要学会便是如何查阅C++文档库,不断积累与完善对于第三方标准库的方法学习与理解。 + +## 2. `int main()` + +`main`函数区别于其它普通函数之处在于: main函数默认被系统定义为应用入口调用方法。除此之外,与其他函数无任何区别。 + +```c +#include +#include + +using namespace std; + +string sayHi(string username) +{ + return string("hi, ").append(username).append("!"); +} + +int main() +{ + cout << sayHi("www.hackdapp.com") << endl; +} +//tryit: http://tpcg.io/uHUkzy +``` + +函数定义,其实对于所有编程语言的定义方式大致相同, 都可以表现为以下形式 + +```c +<返回类型|void> 方法名(参数定义1, 参数定义2,参数定义...) +{ + //do some stuff + return <返回数据> +} +``` + +如果你之前已经在使用其他编程语言,那么应该对于C++其实也可以很好的理解它的程序结构。 + +注: 在后续的第二部分,我们会详细介绍函数的多种定义及使用方式,包括形参实参、重载以及虚函数等。 + +## 3. `string message = "hi, my first app"` + +变量定义,在程序开发过程,往往需要定义一些临时变量,用于存储在数据逻辑处理过程所必须的临时存储。 + +而变量的类型,主要分为字符、整型,长/短整型、单精度、双精度、布尔类型以及字符串。 +我们在实际应用场景中,需要明确了解与知道这些基础数据类型的定义及边界范围,比如,无符号整型、单精度。 + +尤其是对数字类型的字段,如果不了解其边界范围,很可能会导致运算溢出等问题,特别是在合约开发过程中,数字溢出很可能导致的便是相当大的经济损失。 + +换个角度讲,合理的使用变量类型,也可能在一定程序中节省资源的浪费。因为在EOS合约中存储数据是需要消耗资源的。 + +另外,对于变量的名称定义,其名称只能是由数字、字母以及下划线组成且不可能以数字开头,而且根据不同平台,对于名称的长度其实也是存在限制的。 + +## 4. `cout << msg < + +另一个角度讲,正是由于这种限制,也是减小了我们的学习范围,这样我们就不需要完全掌握的整个C++的语言体系,便可以开发智能合约。比如:文件操作读取,时间函数,随机数,这些在EOS合约里是都不可用的。 不过,有一个问题就是你无法明确知道哪些功能被禁用了,只能去试。或者官网有说明,可能我没有看到而已。 + +在整个开发过程,你只需要学会使用一些基础语法,简单数据类型、数据结构以及常用的一些工具库。比如:如何处理字符串,如何存储或操作数据结构。 + +除此之外,再掌握一些程序设计技巧,就可以实战开发自己的DApp应用了,而本身程序设计其实是与哪种程序语言不存在直接关系的,只是让你的程序有更好的应对扩展。 + +通过本章节内容你可以学会: + +- 对基础数据类型以及它们的数据边界有清晰的认识; +- 学会如何使用不同数据结构处理业务场景中的问题; +- 学会如何定义自己的函数; +- 学会如何面对对象的思维设计自己的合约; +- 学会如何通过模板封装形成自己的工具库; +- 了解一些常用的标准库文件及常用的函数工具方法; +- 学会如何通过手册查找工具函数 + +---- + +本章节,将会从以下八个部分进行分类介绍: + +1.1 C++基础语法 +1.2 基础数据类型及变量、常量定义 +1.3 结构体及函数定义 +1.4 数据结构 +1.5 面向对象编程 +1.6 高级应用(模板定义) +1.7 标准库及库函数 +1.8 资源及经验分享 + +---- + +`注:` 在教程中如出现不易理解或存在错误的问题🐛,欢迎评论留言! \ No newline at end of file diff --git a/source/_posts/20190214-rebuildbrain-habit.md b/source/_posts/20190214-rebuildbrain-habit.md new file mode 100644 index 00000000..2a87210f --- /dev/null +++ b/source/_posts/20190214-rebuildbrain-habit.md @@ -0,0 +1,58 @@ +--- +title: 重塑思维:自律 VS 习惯 +categories: 重塑思维 +url: rebuildbrain_habit +tags: + - 重塑思维 + - 自律与习惯 + - 思维认知 +abbrlink: 53231 +date: 2019-02-14 15:46:39 +keywords: +--- + +**自律使我压抑,习惯助我成长。** 自律与习惯,其实目标都是一致的,只是所产生的行动动力源是不相同的。 + +相信每个人都在不停的思考一个问题,“我如何才能使明天的自己比今天的自己更加优秀一些呢?” + +为了让自己变得更好,我们去总结规律,改变自我认知,希望能从不断的思维升级过程中,锻造出属于自己的思维工具,培养及丰富问题症结的方案库。 + +为了让自己变得更好,我们需要靠意志去坚持去做一件让自己变得优秀的事情,但你发现一段时间之后,这件事不了了知,扔那儿放下了,因为这样的事在我的人生当中简直太熟悉不过了。 + +相反,有一些行为却长期固化下来了,比如我们的一些日常洗漱习惯,即使你中途有一段时间没去做,那你也不会放弃这件事。 + +当某一种行为已经成为你的习惯时,如果你有意识的去观察一下,会发现一些许规律。比如:刷牙,可能现在没有不早晚刷牙的童鞋吧。不妨想一想这个行为大家保持了多少年,到现在是否还需要各种精神动力去推着自己去做这个事吗? + +明显不需要,可以说这已经是写入自己骨头里的一种惯性行为,你要是不注意都不发现它原来其实就是一个号的学习榜样。因为它太习以为常了,平常的都忘掉它的存在。 + +那既然刷牙可以养成习惯,那我们其他行为为啥就不能养成一种习惯呢? + +首先,处于习惯性的行为执行过程并不会让你特别有心理负担; +其次,习惯中的行为并不会消耗自己稀缺的精力; +最后,行为关联及导向性。也就是习惯行为之间的联动开关。比如:洗漱的时候总能与刷牙这件事产生一定的链接,而这个链接往往就是我们通过意识去不断增强脑回路而形成的。 + +之所以总结这些,就是因为我身上的一件事,当时看李笑来的专栏里曾经提到一种感受,就是“不做这件事就难受”。 当时是在是无法理解这种状态,除了吃饭这件事,找不出天天不做就难受的事来,当你无法从自身找到可以参考的例子时,你总是无法理解其概念。 + +直到我发现身上这件事,`刮胡子`。对,你没看错,就是刮胡子。 + +为什么讲呢?因为之前总是用电动剃须刀,总是容易忘记用,时做时不做的,而且刮的也不是太干净。直到有一天看到京东做活动卖手动剃须刀,想着买来试一试,但当时也犹豫,每天早上用这个会不会特花时间啊。 + +但事实证明,相比电动剃须刀,手动的虽然要麻烦一些,时间也要多花费一些。但这件事我却坚持了一年,直至今日从心理感受来讲,自己并没有感觉每天要逼着自己去做这件事,而是很自觉的每天洗漱后自动进入刮胡子状态。 + +为什么会这样呢?因为每一次刮完胡子,对着镜子一照,感觉干净清爽,漂亮,帅气。让我从内心看到一个舒服的自己,这算不算是一种仪式感呢。 + +后来,我总结了一下习惯养成的一个关键因素:持续的心理反馈。反馈可以让我们感受到变化与进步,或是一种心理满足;而持续性一来可以增强行为的动力,二过可以慢慢促进脑回路的链接建立。 + +那么,如何建立自己的习惯养成路径呢?那就是 + +1. 先制定一个你绝对认可其价值的目标; +2. 在意识中建立诱导因子,也就是你需要在已形成的习惯之中,建立一个与新行动的触感连接; +3. 持续反馈,每天都要总结,让自己内心见证成长,而后通过持续达到巩固行动的动力。 + +## 小结 + +好的习惯、应用技巧及思维方式是可以产生复利效应价值的,关键在于它不是形式上的应用,不是为技巧而技巧,一定是在我们的生活或工作实际场景中解决实际问题,并以此不断反馈价值收获,而持续的价值收益又会加强我们执行的动力,最终形成一个正向向上的良性循环♻️。 + +执行力其实是落实行动的第一要素,所以我们需要学会如何去补充这项能源。而最好的方式就是让自己认可这件事的价值。并且能够在做事的过程中,有深刻的反馈与心理感受,学会记录自己的心理变化。 + +最后,通过不断的执行与反馈,增强我们的脑回路链接。久而久之,就会成为我们的习惯。 diff --git "a/source/_posts/EOS\347\247\221\346\231\256\345\260\217\347\237\245\350\257\206-ABI\346\226\207\344\273\266.md" "b/source/_posts/EOS\347\247\221\346\231\256\345\260\217\347\237\245\350\257\206-ABI\346\226\207\344\273\266.md" new file mode 100644 index 00000000..a1ed302d --- /dev/null +++ "b/source/_posts/EOS\347\247\221\346\231\256\345\260\217\347\237\245\350\257\206-ABI\346\226\207\344\273\266.md" @@ -0,0 +1,265 @@ +--- +title: EOS科普小知识---ABI文件 +categories: EOS完全开发指南 +url: eosdev_contract_abi +tags: + - EOS完全开发指南 + - ABI + - EOS合约开发教程 +keywords: + - EOS完全开发指南 + - ABI + - EOS合约开发教程 +abbrlink: 64309 +date: 2019-03-07 19:33:14 +--- + +相信不少开发者朋友在进行EOS合约开发时,都看到发布智能合约时的ABI文件。那ABI文件到底是什么东西?在EOS公链环境中到底发挥怎么样的作用呢以及如何解读ABI文件内容呢? + +那么本章节将带你了解ABI文件与智能合约间的关系以及了解并学会ABI文件的编写。 + +**ABI**, 简称(Application Binary Interface), 是一个基于JSON语言的接口描述文档,用于描述EOS合约以及如何对合约方法进行调用。如果大家曾经接触过websocket、avro、hession、thrift等这类技术的化,那么是大体逻辑是相向的。比如websocket所提供的wsdl其实也是对websocket本身对外所提供服务的接口描述。 + +在EOS合约,ABI文件是由开发组件eosio.cdt工具包中的eosio-cpp命令执行所生成的文件。但在实际开发时,时常会碰到一些情况无法生成ABI文件。因为在合约开发,我们往往会根据业务自定义一些数据结构,或者使用一些第三方方法,而eosio.cdt本身对所有特隆并不是支持的很完善,所以时常导致编译失败,这时就需要我们理解ABI是如何定义智能合约的,以便于我们定制化修改自己的合约描述。 + +ABI文件结构是由什么组成的呢?让我们先看一个示例 + +```bash +{ + "version": "eosio::abi/1.0", + "types": [], + "structs": [], + "actions": [], + "tables": [], + "ricardian_clauses": [], + "abi_extensions": [], + "___comment" : "" +} +``` + +上面json示例展示了一个标准智能合约所应具备的完整属性定义。 + +**数据类型(type)** +在项目开发过程,有时为了便于代码的理解,我们会将一些通用数据类型或数据结构进行别名定义,用一个在业务场景中更加贴合业务的名称代替。在`types`数组中便是对这种情况的定义描述。 + +比如: +```bash +{ + "new_type_name": "age", + "type": "int" +} + +或者 + +{ + "new_type_name": "name", + "type": "string" //此处user为自定义数据结构 +} +``` +对于合约内嵌类型,是不会在此展示的。诸如: uint64\_t、name、asset、symbol等。下图展示了EOS合约所支持的所有内置数据类型 +![](http://image.chaindesk.cn/2019-03-07-095044.jpg) + +---- + +**结构体(struct)** +在业务处理逻辑中,为了方便数据的传输与调用,往往我们会对针对业务数据进行建模并以结构体的形式展现。同样,它也需要在ABI文件中进行描述。 + +比如: eosio.token合约中的account结构体定义 +- ABI文件定义 + ```bash + { + "name": "account", + "base": "", + "fields": [ + { + "name": "balance", + "type": "asset" + } + ] + } + ``` +- eosio.token.hpp实现 + ```bash + struct account { + asset balance; + + uint64_t primary_key()const { + return balance.symbol.code().raw(); + } + }; + ``` + +另外,需要注意的就是除了以上这种结构体定义,其实还存在一种隐性结构体,即:合约方法参数 +示例: +- eosio.token.hpp中transfer方法定义 + ```bash + void transfer( name from, + name to, + asset quantity, + string memo ); + ``` +- eosin.token合约中transfer方法在ABI文件中定义 + ```bash + { + "name": "transfer", + "base": "", + "fields": [ + { + "name": "from", + "type": "name" + }, + { + "name": "to", + "type": "name" + }, + { + "name": "quantity", + "type": "asset" + }, + { + "name": "memo", + "type": "string" + } + ] + } + ``` + +可以看出,隐性结构体与前面所定义显性结构体定义是并没有什么不同,只是在智能合约业务逻辑中,我们仅用到显性结构体来存储我们的业务数据进行逻辑判断。 + +---- + +**方法(Action)** +` Action`数组主要用于描述外部可调用的方法列表以及具体的参数列表。在智能合约中,如果需要对外公开合约方法,往往会在合约头文件中进行如下定义: +```bash +[[eosio::action]] +void transfer(name from,name to, asset quantity, string memo); +``` +而ABI的表现形式为: +```bash +{ + "name": "transfer", + "type": "transfer", + "ricardian_contract": "" +} +``` +从上述描述可以看出,在方法的类型定义关联了前面的隐性结构体类型。虽然在此处,方法名与隐性结构体类型命名一致,但实际情况并不一定非要相同。 + +---- + +**表定义(Table)** +关于表的ABI定义,相比其他几种定义要稍复杂一些。具体JSON定义如下 +```bash +{ + "name": "", + "type": "", + "index_type": "", + "key_names" : [], + "key_types" : [] +} +``` +JSON中字段说明如下: +- name + 合约初始化表时所要使用的名称 +- type + 表对应的数据结构体。也就是前面所说的显性结构体类型 +- index \_type + 此类型为表主键类型 +- key \_names + 索引字段列表 +- key\_types + 索引字段数据类型列表。数据长度与索引字段列表长度一致。需要说明的是索引字段类型,只支持uint64\_t,uint128 \_t,uint256 \_t,double,long double五种类型 +示例:eosio.token合约中的accounts表 +- ABI表定义 + ```bash + { + "name": "accounts", + "type": "account", + "index_type": "i64", + "key_names": ["primary_key"], + "key_types": ["uint64"] + } + ``` +- 表合约代码 + ```bash + struct [[eosio::table]] account { + asset balance; + + uint64_t primary_key()const { return balance.symbol.code().raw(); } + }; + ``` +从表合约代码可以看来,只需要在数据结构体代码中添加eosio-table标签就可以完成对表的定义操作。 + +之所以提供多索引的实现,主要还是为了应对业务场景中不同维度的数据查询,而且支持按升序或降序的遍历方式处理业务。 + +---- + +**ricardian条款(ricardian\_clauses)** +该数组主要用于定义一种基于文本的合约宪法。通过其与智能合约的整合,来解决一些无法通过程序来判定的情况。 + +示例如下: +```bash +"ricardian_clauses": [{ + "id": "Warranty", + "body": "WARRANTY. The invoker of the contract action shall uphold its Obligations under this Contract in a timely and workmanlike manner, using knowledge and recommendations for performing the services which meet generally acceptable standards set forth by EOS.IO Blockchain Block Producers.\n\n" + },{ + "id": "Default", + "body": "DEFAULT. The occurrence of any of the following shall constitute a material default under this Contract: \n\n" + },{ + "id": "Remedies", + "body": "REMEDIES. In addition to any and all other rights a party may have available according to law, if a party defaults by failing to substantially perform any provision, term or condition of this Contract, the other party may terminate the Contract by providing written notice to the defaulting party. This notice shall describe with sufficient detail the nature of the default. The party receiving such notice shall promptly be removed from being a Block Producer and this Contract shall be automatically terminated. \n \n" + } + ] +``` + +我们可以针对智能合约或者具体的合约方法,附加上对应的文本合约描述。比如针对方法的文本合约定义: +- ABI定义 + ```bash + "actions": [{ + "name": "hi", + "type": "hi", + "ricardian_contract": "# CONTRACT FOR hello::hi## ACTION NAME: hi\n### Parameters### Parameters\nInput parameters:Input parameters:\n\n* `user` (string to include in the output)* `user` (string to include in the output)\n\nImplied parameters: Implied parameters: \n\n* `account_name` (name of the party invoking and signing the contract)* `account_name` (name of the party invoking and signing the contract)\n\n### Intent### Intent\nINTENT. The intention of the author and the invoker of this contract is to print output. It shall have no other effect.INTENT. The intention of the author and the invoker of this contract is to print output. It shall have no other effect.\n\n### Term### Term\nTERM. This Contract expires at the conclusion of code execution.TERM. This Contract expires at the conclusion of code execution.\n" + }] + ``` +- 代码及文件定义(hello.hi_rc.md) + ```bash + # CONTRACT FOR hello::hi + + ## ACTION NAME: hi + + ### Parameters + Input parameters: + + * `user` (string to include in the output) + + Implied parameters: + + * `account_name` (name of the party invoking and signing the contract) + + ### Intent + INTENT. The intention of the author and the invoker of this contract is to print output. It shall have no other effect. + + ### Term + TERM. This Contract expires at the conclusion of code execution. + ``` +---- + +**ABI Extensions** +该功能将允许用户进行自定义区块扩展, 包括对数据的签名、编码等。不过现在该属性暂未被应用支持。 + +---- + +到此,相信大家对于整个ABI文件的结构应该有了大体的认识与理解。这样大家可以在研究其他智能合约时,可以首先阅读对方的ABI文件,就可以熟悉对方的整体接口框架。 + +---- + +> 在教程中如出现错误🐛或不易理解的知识点,欢迎加我微信指正! +> Name: zhangliang | WeChat: rushking2009 | Mail: zhangliang@cldy.org + +---- + +**changelog** +2019-03-07 [zhangliang](mailto:zhangliang@cldy.org) + - 初次发稿 + + + diff --git "a/source/_posts/\344\275\277\347\224\250EOS-js\345\217\221\345\270\203EOS\346\231\272\350\203\275\345\220\210\347\272\246.md" "b/source/_posts/\344\275\277\347\224\250EOS-js\345\217\221\345\270\203EOS\346\231\272\350\203\275\345\220\210\347\272\246.md" new file mode 100644 index 00000000..a92929ca --- /dev/null +++ "b/source/_posts/\344\275\277\347\224\250EOS-js\345\217\221\345\270\203EOS\346\231\272\350\203\275\345\220\210\347\272\246.md" @@ -0,0 +1,125 @@ +--- +title: 使用EOS.js发布EOS智能合约 +categories: EOS完全开发指南 +url: eosdev_contract_deploy +tags: + - EOS完全开发指南 + - deploy contract + - EOS合约开发教程 +keywords: + - EOS完全开发指南 + - deploy contract + - EOS合约开发教程 +abbrlink: 10133 +date: 2019-03-12 18:59:46 +--- + +在之前的EOS合约开发文章,你可能学会了如何通过EOS系统命令**cleos set contract**的方式进行智能合约的发布与升级。 + +但在开发过程中,可能有的同学持续在命令容器与开发IDE间频繁切换,对开发效率有一定程序的影响,那是否有一种更好的方式帮助我们在一个窗口里快速发布合约呢? + +那么本文将带你了解**如何通过EOS.js进行智能合约的发布**。 + +![](http://cdn.hackdapp.com/2019-03-12-083806.jpg) +如上图所示,在进行合约发布时,需要用到eos系统合约中的两个方法:setcode、setabi。而这两个方法分别会用到智能合约编译后的两个文件: \*.wasm、\*.abi。 + +**注意** : 本文示例中使用的eosjs的版本为`16.0.9 `。 + +**首先**,需要初始化EOS-SDK实例。 事先准备好初始化SDK所必需的参数: +- chainid + 所要发布的目标EOS链chainid. 例如:正式chainid: aca376f206b8fc25a6ed44dbdc66547c36c6c33e3a119ffbeaef943642f0e906; jungle测试网chainid: e70aaab8997e1dfce58fbfac80cbbb8fecec7b99cf982a9444273cbc64c41473等等 +- httpEndpoint + EOS链环境http接口地址。 例如: http://localhost:8888 +- keyProvider + 合约帐户私钥,主要用于交易签名。 + +```bash +//config.js +const Eos = require('eosjs') + +const eos = Eos({ + chainId: "cf057bbfb72640471fd910bcb67639c22df9f92470936cddc1ade0e2f2e7dc4f", + httpEndpoint: "http://localhost:8888", + keyProvider: "5K7mtrinTFrVTduSxizUc5hjXJEtTjVTsqSHeBHes1Viep86FP5", + broadcast: true, + sign: true +}) + +module.exports = { + eos, +} + +//https://gist.github.com/hackdapp/2522411b98b1acdadc0d842f712ca6e0 + +``` + +**下一步**,需要代码实现对合约文件夹中的.wasm及.abi文件的读取; + +```bash +function getDeployableFilesFromDir(dir) { + const dirCont = fs.readdirSync(dir) + const wasmFileName = dirCont.find(filePath => filePath.match(/.*\.(wasm)$/gi)) + const abiFileName = dirCont.find(filePath => filePath.match(/.*\.(abi)$/gi)) + if (!wasmFileName) throw new Error(`Cannot find a ".wasm file" in ${dir}`) + if (!abiFileName) throw new Error(`Cannot find an ".abi file" in ${dir}`) + return { + wasmPath: path.join(dir, wasmFileName), + abiPath: path.join(dir, abiFileName), + } +} + +//https://gist.github.com/69b29103e5cc114f4478390076d8ad39 +``` + +**然后**,通过调用eos实例,分别执行系统合约的setcode/setabi方法,从而达到智能合约的发布; + +```bash +function deployContract({ account, contractDir }) { + const { wasmPath, abiPath } = getDeployableFilesFromDir(contractDir) + + const wasm = fs.readFileSync(wasmPath) + const abi = fs.readFileSync(abiPath) + + const codePromise = eos.setcode(account, 0, 0, wasm) + const abiPromise = eos.setabi(account, JSON.parse(abi)) + return Promise.all([codePromise, abiPromise]) +} + +//https://gist.github.com/69b29103e5cc114f4478390076d8ad39 +``` + +**最后**,调用deployContract方法,测试合约发布功能。 + +```bash +deployContract({ account: "eosio.token", contractDir: "./contract" }).then((result) => { + console.log(`Deployment successful`, JSON.stringify(result, null , 4)) +}) +.catch(err => { + console.error(`Deployment failed`, err) +}) + +//https://gist.github.com/69b29103e5cc114f4478390076d8ad39 +``` + +---- + +**小结** + +通过本文我们学习了如何通过eos实例的setcode/setabi方法将合约编译文件快速发布到指定链环境。 + +另外,如果为了提高发布合约效率,我们还可以在package.json中定义发布合约的运行脚本,并配合IDE工具中的快捷键,便可达到开发效率的进一步提升。 + +---- + +> 在教程中如出现错误🐛或不易理解的知识点,欢迎加我微信指正! +> Name: zhangliang | WeChat: rushking2009 | Mail: zhangliang@cldy.org + +![Show me your code.](http://cdn.hackdapp.com/2019-03-11-IMG_1625.JPG-weixin "加群了解")![](http://cdn.hackdapp.com/2019-03-11-IMG_1626.jpg-weixin) + +注: 有想了解**愿码全思维IT工程师加速器**的朋友,可以扫码加群咨询。 + +---- + +### **changelog** +2019-03-12 [zhangliang](mailto:zhangliang@cldy.org) + - 初次发稿