ApacheCN-活动汇总-2019712

公告欢迎大家在我们平台上投放广告。如果你希望在我们的专栏、文档或邮件中投放广告,请准备好各种尺寸的图片和专属链接,联系咸鱼(QQ 1034616238)。我们组织了一个开源互助平台,方便开源组织和大 V 互相认识,互相帮助,整合资源。请回复这个帖子并注明组织/个人信息来申请加入。请回复这个帖子来推荐希望翻译的内容。如果大家遇到了做得不错的教程或翻译项目,也可以推荐给我们。我们会联系项目的维护者,一起把它变得更好。我们的各个公众平台接受个人学习博文,论文解读,比赛心得等 AI 相关文章投稿,请将文章链接发到这里,我们会每日从所有投稿博文中精选两篇,在 ApacheCN 全平台推送。为了能够将开源事业做大做强,ApacheCN 需要与公益基金会(IT、教育类)合作,欢迎大家提供帮助。同时我们也接受社会各界的捐助。如果你不希望再收到我们的邮件,请直接拉黑我们,不要浪费彼此的时间,谢谢合作。ByteInAI 是我们和 Datawhale、AI 有道、黄海广博士等组织或个人联合推出的 AI 垂直自媒体,是一个纯商业项目。如果你有意向投资这个项目,请联系 Datawhale(微信二维码)或咸鱼(QQ 1034616238)。组织任务 认领须知: 请私聊片刻(529815144)、咸鱼(1034616238)、或飞龙(562826179)来认领任务,我们会把你拉进合伙人群。除了列出的翻译项目之外,现有翻译项目不接受新的负责人。如果你打算贡献,请直接提交Pull Request。如果你的想法没有列出(包括但不仅限于翻译项目),同样欢迎私聊我们。翻译校对活动UIUC CS241 系统编程中文讲义【校对】参与方式:https://github.com/apachecn/u... 整体进度:https://github.com/apachecn/u... 项目仓库:https://github.com/apachecn/u... 认领:1/78,校对:0/78 章节贡献者进度#Informal词汇表 #Piazza:何时以及如何寻求帮助 编程技巧,第1部分 系统编程短篇小说和歌曲 C编程,第1部分:简介@blue-bird1 C编程,第2部分:文本输入和输出 C编程,第3部分:常见问题 C编程,第4部分:字符串和结构 C编程,第5部分:调试 C编程,复习题 进程,第1部分:简介 分叉,第1部分:简介 分叉,第2部分:Fork,Exec,等等 进程控制,第1部分:使用信号等待宏 进程复习题 内存,第1部分:堆内存简介 内存,第2部分:实现内存分配器 内存,第3部分:粉碎堆栈示例 内存复习题 Pthreads,第1部分:简介 Pthreads,第2部分:实践中的用法 Pthreads,第3部分:并行问题(奖金) Pthread复习题 同步,第1部分:互斥锁 同步,第2部分:计算信号量 同步,第3部分:使用互斥锁和信号量 同步,第4部分:临界区问题 同步,第5部分:条件变量 同步,第6部分:实现障碍 同步,第7部分:读者编写器问题 同步,第8部分:环形缓冲区示例 同步复习题 死锁,第1部分:资源分配图 死锁,第2部分:死锁条件 死锁,第3部分:餐饮哲学家 死锁复习题 虚拟内存,第1部分:虚拟内存简介 管道,第1部分:管道介绍 管道,第2部分:管道编程秘密 文件,第1部分:使用文件 调度,第1部分:调度过程 调度,第2部分:调度过程:算法 IPC复习题 POSIX,第1部分:错误处理 网络,第1部分:简介 网络,第2部分:使用getaddrinfo 网络,第3部分:构建一个简单的TCP客户端 网络,第4部分:构建一个简单的TCP服务器 网络,第5部分:关闭端口,重用端口和其他技巧 网络,第6部分:创建UDP服务器 网络,第7部分:非阻塞I O,select()和epoll RPC,第1部分:远程过程调用简介 网络复习题 文件系统,第1部分:简介 文件系统,第2部分:文件是inode(其他一切只是数据...) 文件系统,第3部分:权限 文件系统,第4部分:使用目录 文件系统,第5部分:虚拟文件系统 文件系统,第6部分:内存映射文件和共享内存 文件系统,第7部分:可扩展且可靠的文件系统 文件系统,第8部分:从Android设备中删除预装的恶意软件 文件系统,第9部分:磁盘块示例 文件系统复习题 过程控制,第1部分:使用信号等待宏 信号,第2部分:待处理的信号和信号掩码 信号,第3部分:提高信号 信号,第4部分:信号 信号复习题 考试主题 C编程:复习题 多线程编程:复习题 同步概念:复习题 内存:复习题 管道:复习题 文件系统:复习题 网络:复习题 信号:复习题 系统编程笑话 Cython 3.0 中文文档【校对】参与方式:https://github.com/apachecn/c... ...

July 12, 2019 · 7 min · jiezi

蚂蚁金服-3-个项目进入-CNCF-云原生全景图-开源

2019 年 6 月 25 日,全球知名开源组织云原生计算基金会 CNCF 宣布,蚂蚁金服正式成为 CNCF 黄金会员,蚂蚁金服表示将持续加大对开源项目的支持,包括 Kubernetes,ServiceMesh,Serverless,安全容器等方向,并发挥自己的力量。SOFAStack 作为蚂蚁金服重要的开源项目,最近也与 CNCF 有故事发生。近期,CNCF 发布了最新版本的 Cloud Native Landscape,蚂蚁金服金融级分布式架构 SOFAStack 中有 3 个项目被纳入,分别是 Service Mesh 数据平面代理 SOFAMosn、分布式链路跟踪系统 SOFATracer 和 RPC 服务框架 SOFARPC。 CNCF & CNCF Cloud Native LandscapeCNCF(Cloud Native Computing Foundation),是由 Google 牵头创立的云原生计算开源软件基金会。它致力于云原生(Cloud Native)技术的普及和可持续发展。2016 年 11 月,CNCF 开始维护 Cloud Native Landscape,汇总流行热门的云原生技术与工具,并加以分类,为企业构建云原生体系提供参考,在云生态研发、运维领域具有广泛影响力。 SOFAStack & CNCF Cloud Native Landscape蚂蚁金服金融级分布式架构 SOFAStack 中的 3 个项目加入这次最新版本的 Cloud Native Landscape ,分别是 Service Mesh 数据平面代理 SOFAMosn 、分布式链路跟踪系统 SOFATracer 和 RPC 服务框架SOFARPC。 ...

July 9, 2019 · 1 min · jiezi

蚂蚁金服-SOFAStack-荣获云计算开源产业大会尖峰开源技术创新奖

2019 年 7 月 3 日,在 2019 云计算开源产业大会上,蚂蚁金服自主研发的金融级分布式架构 SOFAStack(Scalable Open Financial Architecture Stack)荣获 OSCAR 尖峰开源技术创新奖(自主研发)。云计算开源产业大会由中国信息通信研究院主办,是中国云计算开源领域最权威和专业的行业盛会。 本次大会上,中国信息通信研究院还发布了《混合云白皮书(2019年)》,该白皮书梳理了混合云的最新发展现状、关键能力、应用案例和技术发展趋势。基于完全自主研发的 SOFAStack 金融级分布式架构的网商银行三地五中心异地多活部署方案被作为典型应用案例入选其中。 完全自主研发的金融级分布式架构 SOFAStackSOFAStack 是蚂蚁金服完全自主研发的金融级分布式架构,包含了构建金融级云原生架构所需的各个组件,如微服务研发框架、RPC 框架、服务注册中心、分布式定时任务、限流/熔断框架、动态配置推送、分布式链路追踪、Metrics 监控度量、分布式高可用消息队列、分布式事务框架和分布式数据库代理层等。 据了解,经过数代架构演进和“双十一”考验的 SOFAStack,已于 2018 年 4 月正式对外开源,仅一年时间,SOFAStack 所有相关的开源代码,累计获得 16,000+ 个 Star,并有 110+ 个代码贡献者参与其中。 SOFAStack 助力客户数字化转型作为一套分布式架构的完整的解决方案,SOFAStack 在真实的金融场景里锤炼出不少最佳实践。 2017 年 10 月,SOFAStack 与南京银行共同打造出“鑫云+”互金开放平台。该平台具备高性能承载、敏捷开发、强数据一致性和容灾能力等特性,从而使得南京银行互金核心系统在贷款交易处理能力、成本控制和对接效率都得到了极大的提升。南京银行与互联网平台合作开展线上业务仅一年时间,业务量就已经达到了过去十年传统线下消费金融业务的总和。南京银行“鑫云+”平台上线后,业务快速增长,贷款交易处理量增长了数倍。 据介绍,SOFAStack 还帮助中国人保健康打造行业领先的互联网保险云核心业务系统,助力网商银行成为中国第一家将核心系统架构在金融云上的银行。 SOFAStack 引领开源技术创新2019 年 6 月 25 日,蚂蚁金服正式成为 CNCF 云原生计算基金会黄金会员,SOFAStack 云应用引擎产品 CAFE 已通过 CNCF 一致性认证,积极拥抱云原生的同时,满足严苛金融业务场景需求、保障金融技术风险。 蚂蚁金服是金融级云原生的首倡者,主张金融级的云原生容器产品必须拥有稳定性与高可用保障、无限弹性扩展、运行时安全的能力,这些理念也集中体现在蚂蚁金服的金融级分布式开源项目 SOFAStack 里。 蚂蚁金服一直积极参与开源社区共建。截至目前,蚂蚁金服已经有 400 多个开源项目。除了 SOFAStack 系列,Ant Design、SQLFlow、EggJS、Seata(与阿里巴巴共建)等也成为社区热门。 ...

July 8, 2019 · 1 min · jiezi

ApacheCN-活动汇总-201975

公告欢迎大家在我们平台上投放广告。如果你希望在我们的专栏、文档或邮件中投放广告,请准备好各种尺寸的图片和专属链接,联系咸鱼(QQ 1034616238)。我们组织了一个开源互助平台,方便开源组织和大 V 互相认识,互相帮助,整合资源。请回复这个帖子并注明组织/个人信息来申请加入。请回复这个帖子来推荐希望翻译的内容。如果大家遇到了做得不错的教程或翻译项目,也可以推荐给我们。我们会联系项目的维护者,一起把它变得更好。我们的各个公众平台接受个人学习博文,论文解读,比赛心得等 AI 相关文章投稿,请将文章链接发到这里,我们会每日从所有投稿博文中精选两篇,在 ApacheCN 全平台推送。为了能够将开源事业做大做强,ApacheCN 需要与公益基金会(IT、教育类)合作,欢迎大家提供帮助。同时我们也接受社会各界的捐助。如果你不希望再收到我们的邮件,请直接拉黑我们,不要浪费彼此的时间,谢谢合作。ByteInAI 是我们和 Datawhale、AI 有道、黄海广博士等组织或个人联合推出的 AI 垂直自媒体,是一个纯商业项目。如果你有意向投资这个项目,请联系 Datawhale(微信二维码)或咸鱼(QQ 1034616238)。组织任务 认领须知: 请私聊片刻(529815144)、咸鱼(1034616238)、或飞龙(562826179)来认领任务,我们会把你拉进合伙人群。除了列出的翻译项目之外,现有翻译项目不接受新的负责人。如果你打算贡献,请直接提交Pull Request。如果你的想法没有列出(包括但不仅限于翻译项目),同样欢迎私聊我们。翻译校对活动百页机器学习小书参与方式:https://github.com/apachecn/m... 整体进度:https://github.com/apachecn/m... 项目仓库:https://github.com/apachecn/m... 认领:7/12,翻译:1/12 章节贡献者进度零、前言@PEGASUS1993100%一、介绍@PEGASUS1993 二、符号和定义@PEGASUS1993 三、基本算法@Rachel-Hu 四、线性算法剖析@P3n9W31 五、基本实践@chengchengbai 六、神经网络和深度学习@Everfighting 七、问题和答案 八、高级实践 九、无监督学习 十、其它学习形式 十一、总结 短篇集(校对)参与方式:https://github.com/apachecn/m... 整体进度:https://github.com/apachecn/m... 项目仓库:https://github.com/apachecn/m... 关于卷积神经网络:认领:2/12,校对:2/12 章节贡献者进度关于卷积神经网络--1@daewis100%2.1.1-2.1.3@daewis100%2.1.4-2.1.6 2.2.1 2.2.2-2.2.3 2.3-2.4 3.1 3.2 3.3 3.4-3.5 4.1 4.2 写给不耐烦程序员的 JavaScript(校对)参与方式:https://github.com/apachecn/i... 整体进度:https://github.com/apachecn/i... ...

July 5, 2019 · 6 min · jiezi

蚂蚁金服胡喜金融服务将成为开源的下个前沿领域

近日,全球知名开源组织云原生计算基金会 CNCF 宣布,蚂蚁金服正式成为 CNCF 黄金会员。为什么蚂蚁金服会拥抱开源,科技公司和开源社区如何实现双赢且可持续发展?蚂蚁金服副CTO胡喜在TechCrunch上发表专栏阐述了自己的见解。 自诞生以来,开源软件在许多行业有效地推动了技术普及、开放与公平竞争。然而,金融服务业一直是个罕见的例外:金融机构依然倾向于使用私有技术进行开发和运营。 传统上,金融服务业只为少数人提供服务。全球有 20 亿人和 2 亿小微企业无法获得银行和信贷等基本服务。在这样的情况下,开源技术可能会是推动普惠金融的关键。 Gartner 报告称,在汇率不变情况下,银行和证券业的 IT 支出 2018 年增长了 4.6%。银行和证券公司仍坚定不移地将数字化转型放在未来发展的首要位置。不过在很大程度上,有能力与资源投入技术开发的主要是全球性的大银行,规模较小的地区性银行则没有这样的机会。 小银行,例如来自发展中国家和农村地区的银行往往缺乏专业技术知识,也难以承担当代信息技术系统,例如下一代数据库、先进的分布式计算架构和金融级人工智能的建设成本。但是,如果这些机构愿意利用集众人之力、低成本的开源创新,那么就可以更好地服务它们的市场。 金融科技开源基金会(FINOS)的成立是朝着这个方向迈出的重要一步。该基金会的成员包括美国资产管理规模最大 30 家银行中的 10 家,例如高盛和摩根大通。 出于同样的原因,蚂蚁金服加入了云原生计算基金会(CNCF),成为黄金会员。位于硅谷的 CNCF 管理着云原生软件体系的关键部分,包括 Kubernetes 和 Prometheus,也是 Linux 基金会旗下领先的开源组织。通过与 CNCF 及其旗下成员分享我们的技术知识,支付宝致力于向全球金融机构和合作伙伴开放我们的技术,同时与中国的地区性和农村地区银行合作,基于成熟的开源技术提供产品,助力它们的数字化转型。 成立于 2004 年的支付宝在中国开创了安全可靠的支付系统。自那时以来,支付宝不断发展,为数百万小微企业提供各类服务,包括支付,小额信贷和保险等等。 我们正在给行业提供技术帮助,为 200 多家金融机构提高效率、降低成本。这些机构包括中国全国范围内的 100 多家银行、60 多家保险公司,以及 40 多家基金公司和证券公司。 借助过去多年服务支付宝这种任务关键型金融应用的经验,蚂蚁金服启动了多个开源项目,例如热门 UI 设计语言 Ant Design,以及 SOFAStack。后者在帮助用户顺利参加“双 11”活动的过程中发挥了关键作用。按交易量来看,“双 11”是全球最大的购物节。 利用 SOFAStack,各种规模的企业都可以轻松实现类似支付宝的规模和可靠性,在购物高峰期将关注重点转向如何更好地给顾客提供服务。 通过 SOFAStack 的开源,我们已经帮助南京银行等合作伙伴建设强大的技术系统。在 SOFAStack 和支付宝其他开源技术的帮助下,南京银行最近为自己和第三方合作伙伴开发了下一代核心银行系统“鑫云+”。 鑫云+带来了强大的性能,灵活的可扩展性,强数据一致性和重要的容灾机制。截止 2018 年底,鑫云+签约了近 1000 万新客户,日贷款申请处理能力上升了 10 倍,从 10 万笔提升至 100 万笔。贷款审核流程也因此加快,一些客户不到 1 秒就能获得贷款审批。同时,单账户的管理成本下降了 80% 至 90%。 ...

July 4, 2019 · 1 min · jiezi

TiDB-30-GA-Release-Notes

Overview2019 年 6 月 28 日,TiDB 发布 3.0 GA 版本,对应的 TiDB Ansible 版本为 3.0.0。相比于 V2.1,V3.0.0 版本在以下方面有重要改进: 稳定性方面,显著提升了大规模集群的稳定性,集群支持 150+ 存储节点,300+ TB 存储容量长期稳定运行。易用性方面有显著的提升,降低用户运维成本,例如:标准化慢查询日志,制定日志文件输出规范,新增 EXPLAIN ANALYZE,SQL Trace 功能方便排查问题等。性能方面,与 2.1 相比,TPC-C 性能提升约 4.5 倍,Sysbench 性能提升 50%+。 因支持 View,TPC-H 50G Q15 可正常运行。新功能方面增加了窗口函数、视图(实验特性)、分区表、插件系统、悲观锁(实验特性)、SQL Plan Management 等特性。TiDB新功能 新增 Window Function,支持所有 MySQL 8.0 中的窗口函数,包括 NTILE,LEAD,LAG、PERCENT_RANK、NTH_VALUE、CUME_DIST、FIRST_VALUE、LAST_VALUE、RANK、DENSE_RANK、ROW_NUMBER 函数新增 View 功能(实验特性)完善 Table Partition 功能: Range PartitionHash Partition新增插件系统,官方提供 IP 白名单(企业版特性),审记日志(企业版特性)等插件新增 SQL Plan Management 功能,通过绑定 SQL 执行计划确保查询的稳定性(实验特性)SQL 优化器 优化NOT EXISTS 子查询,转化为 Anti Semi Join 提升性能优化 Outer Join 常量传播,新增 Outer Join 消除优化规则,避免无效计算,提升性能优化 IN 子查询,先聚合后执行 Inner Join,提升性能优化 Index Join,适应更多的场景,提升性能优化 Range Partition 的 Partition Pruning 优化规则,提升性能优化 _tidb_rowid 查询逻辑,避免全表扫描,提升性能当过滤条件中包含相关列时,在抽取复合索引的访问条件时尽可能多地匹配索引的前缀列,提升性能利用列之间的顺序相关性,提升代价估算准确度基于统计信息的贪心算法及动态规划算法改进了 Join Order,提升多表关联的执行速度新增 Skyline Pruning,利用规则防止执行计划过于依赖统计信息,提升查询的稳定性提升单列索引上值为 NULL 时行数估算准确度新增 FAST ANALYZE,通过在各个 Region 中随机采样避免全表扫描的方式提升统计信息收集性能新增单调递增的索引列增量 Analyze 功能,提升统计信息收集性能支持 DO 语句中使用子查询支持在事务中使用 Index Join优化 prepare/execute,支持不带参数的 DDL 语句修改变量 stats-lease 值为 0 时系统的行为,使其自动加载统计新增导出历史统计信息功能新增导入导出列的关联性信息功能SQL 执行引擎 ...

June 29, 2019 · 3 min · jiezi

TiDB-30-GA稳定性和性能大幅提升

作者:段兵 TiDB 是 PingCAP 自主研发的开源分布式关系型数据库,具备商业级数据库的数据可靠性,可用性,安全性等特性,支持在线弹性水平扩展,兼容 MySQL 协议及生态,创新性实现 OLTP 及 OLAP 融合。 TiDB 3.0 版本显著提升了大规模集群的稳定性,集群支持 150+ 存储节点,300+TB 存储容量长期稳定运行。易用性方面引入大量降低用户运维成本的优化,包括引入 Information_Schema 中的多个实用系统视图、EXPLAIN ANALYZE、SQL Trace 等。在性能方面,特别是 OLTP 性能方面,3.0 比 2.1 也有大幅提升,其中 TPC-C 性能提升约 4.5 倍,Sysbench 性能提升约 1.5 倍,OLAP 方面,TPC-H 50G Q15 因实现 View 可以执行,至此 TPC-H 22 个 Query 均可正常运行。新功能方面增加了窗口函数、视图(实验特性)、分区表、插件系统、悲观锁(实验特性)。 截止本文发稿时 TiDB 已在 500+ 用户的生产环境中长期稳定运行,涵盖金融、保险、制造,互联网,游戏等领域,涉及交易、数据中台、历史库等多个业务场景。不同业务场景对关系型数据库的诉求可用 “百花齐放”来形容,但对关系数据库最根本的诉求未发生任何变化,如数据可靠性,系统稳定性,可扩展性,安全性,易用性等。请跟随我们的脚步梳理 TiDB 3.0 有什么样的惊喜。 一、提升大规模集群稳定性3.0 与 2.1 版本相比,显著提升了大规模集群的稳定性,支持单集群 150+ 存储节点,300+TB 存储容量长期稳定运行,主要的优化点如下: 1. 优化 Raft 副本之间的心跳机制,按照 Region 的活跃程度调整心跳频率,减小冷数据对集群的负担。 ...

June 29, 2019 · 2 min · jiezi

免费开源的数字货币收款插件

虽然区块链蓬勃发展,但是程序员要在网站上支持数字货币收款依然非常困难。无论是比特币,还是eos都需要安装全节点软件才能比较稳定的做到查询收款服务。然而目前的区块链全节点都耗费大量硬盘空间和系统资源,仅仅为了为了数字货币收款进行投入是不划算的。 这里介绍一个收款插件。 优点:无需依赖外部库,因为是go语言编写的。无需外部数据库,默认数据库使用sqlite3,熟练工可以自己修改支持mysql和postgre。开发者使用http请求就可以创建支付通道,查询支付状态。收到支付有推送,方便编写业务代码。无需安装复杂的比特币全节点,以太坊全节点,eos全节点就可以收款。体积小巧前期准备一 Mixin Messenger账户中国大陆iOS和安卓用户前往该地址下载App并注册账户。 大陆以外地区Apple ID和Google Play用户请前往 地址下载app并注册账户。 成为开发者并且创建app访问开发者中心,点击右上角图标,用Mixin Messenger app的照相机扫描屏幕上的二维码,然后开始创建 App。 创建App流程可以参考这个教程 Clone 代码git clone https://github.com/myrual/mixin-network-snapshot-golangcd mixin-network-snapshot-golang修改参数在mixin_snap.go里面找到如下代码片段 const ( userid = "3c5fd587-5ac3-4fb6-b294-423ba3473f7d" sessionid = "42848ded-0ffd-45eb-9b46-094d5542ee01" private_key = `-----BEGIN RSA PRIVATE KEY-----MIICXAIBAAKBgQDACTrT4uaB9el9qe0MUOsFrm8kpaDI9PowauMB1Ha25mpfL+5hMFqISLS5z2P89nAsXBg+KyQ2gAVA6rBwW/ZqOc1PKiJhhLBS80nzo3ayfv7OlzNGIxMyqD5izCCtPixnqpuTePoPWq4CNZlxop0VYklsWEfU0U0qqMBgmtqYfQIDAQABAoGAR8crZed5oTn5fC73m5LjRcxdXqVJ49MtcMuC7jwr41FckRepUkpwjGAgrRMHnJXAd9Q0e4hEkNppHEqciGLXR1dQfZnaM1Gnv7mD3oSgHaH+4qAMnNOCpvwW4Eu3yp9b1UGj9SvM3D2BrpA+MGf0E/yEJzpRcT956W6SPYYSegECQQDm4uTK+teoxr1ZagJZuCta+IhMzpxIWMob+JN/Huf7OnRcIa9JpXngg4tHOUWmZCDQdqeJMpaQc8SQ44hba015AkEA1OyJswNIhdmvVp5P1zgREVVRK6JloYwmAtj+Qo4pWJ117LqH4w+b491r4AeLEGh8VrZ4k6Hp+Cm783S2jTAWJQJARbWdlHdV45xVkQiDuyjy1h2RsXb0EpfUNcvAZLIlImIMvcBh1x+CA7pTs+Zj1BAJJEee37qJYQXDBGfeRJPKKQJAVG+cx42Ew/eoTZwoIzvLoOkJcFlNHjwaksSER9ZiVQ7URdVOr99vvXQAJG45Wn9k12oy9LCfvNan/wqIngK0tQJBAL1Wc02seEbMeWyt5jycJEhn6G8F18s9S1v0GXb4U/7/6Y87P3TmDLcEuCXkrbZQaCX7jVLu0BkDw8To58TWjh0= -----END RSA PRIVATE KEY-----` ADMIN_MessengerID = ""//this is your mixin messenger id, you can find your id in contact page.)将app创建过程中的那些参数替换到这里。 ADMIN_MessengerID是你的Mixin Messenger ID,你可以在Mixin Messenger里面的联系人页面看到。 编译go build mixin_snap.go运行./mixin_snap实际上由于是基于go语言编写的,你可以在一台linux 机器上编译,然后把执行文件传输到实际工作的服务器上运行。 如何创建一个eos和xlm的充值地址生成一个独一无二的字符串作为支付id,然后设定一个收到支付的时候回掉URL。 curl -d '{"reqid":"value8", "callback":":9090/"}' -H "Content-Type: application/json" 127.0.0.1:8080/payment这个curl指令起到的效果是: 将value8作为支付id传给支付插件,同时要求这个支付id收到支付的时候,程序要访问 本机的9090端口的根URL。 ...

June 20, 2019 · 1 min · jiezi

TiDB-TechDay-巡讲启动六城一起-High

我感到自豪,因为我取得了第一个胜利,我毫不怀疑胜利是会接踵而至的。我做到了第一件做不到的事情,我也可以接着做下去。——王小波《我在荒岛上迎接黎明》TiDB 的设计灵魂,是让优雅灵活的架构充满无限可能性。从大规模业务场景中稳定使用的 TiDB 2.0 版本,到这一次备受关注的 3.0,我们持续地在倾听、修正、尝试,并获得一次又一次验证。距离年初公布 TiDB 3.0 beta 版本,已经过去了大半年,这期间我们对各方面进行了测试和优化,也看到有第一梯队用户在业务中体验了 3.0 的新特性。很多小伙伴好奇我们当时承诺的 TiDB 3.0 稳定性 / 易用性 / 高性能 / 新功能,都兑现得怎么样了? 今天正式剧透一波:TiDB 3.0 GA 版本将在本月底正式发布!借此机会,为了让更多的社区伙伴能够近距离与我们展开交流,并快速 Get 3.0 GA 的技术细节和正确使用姿势,我们启动「TiDB TechDay 2019 全国巡讲」,打破「一年一城」的传统,巡回北京、上海、成都、深圳、武汉、杭州 6 座城市,用一整天的时间为当地朋友深入拆解 TiDB 3.0 以及展示今年技术层面的各个大招:从 TiDB 最新的 OLAP 架构,到云原生 TiDB demo、TiKV 性能大幅提升等等。各地用户伙伴也会一起交流分享 TiDB 实践经验,另外关于全球开源社区运营,我们又有了新的想法,也将与各地的社区伙伴们聊聊。当然 TechDay 2019 特别设计的 T-Shirt & 贴纸也会有的! 相信在社区伙伴们的力量加持下,我们可以接着做更多做不到的事情。期待与大家见面~ 【北京站】日程表 时间:2019-06-23 周日 10:00 - 16:50地点:北京市-朝阳区-地铁 14 号线平乐园站 B 口 - 灿空间交通提示: ...

June 13, 2019 · 1 min · jiezi

赋能社区PingCAP-University-培训课程-20-重磅升级

经过半年时间的持续打磨,PingCAP University 迎来了一次重大升级,发布「培训课程 2.0」。作为世界级的开源项目,经过四年的发展,TiDB 在越来越多的场景里落地,正逐渐被视为行业内的分布式数据库“事实标准”。随着用户社区技术服务体系的建立和优化,TiDB 社区力量日益壮大,在 GitHub 上已累计获得 Star 数近 2w,目前已有 300+  用户将 TiDB 用于线上生产环境,超过 1400 家进行测试 ,在互联网、银行、证券、高端制造、大型零售等行业均有广泛应用。这些成果的背后都离不开社区用户的积极反馈和社区开发者的贡献。 “我们十分珍视这份信任,将继续把「用户至上」的观念和理念发挥到极致,与用户一起成长,并进一步赋能社区,培养更多的一流 NewSQL 人才 ,打造高质量高活跃度的 TiDB 技术社区。这是我们开办 PingCAP University 的初衷。”PingCAP 联合创始人崔秋表示。 PingCAP 于 2018 年底正式成立 PingCAP University,开设的 TiDB DBA 官方认证培训课程于 2019 年 1 月正式落地。目前,首批线下培训已经开展 10 余期,得到了社区伙伴的广泛响应。培训开办半年以来 PingCAP University 在实践中保持与学员的沟通,持续打磨课程,近期正式推出升级后的 2.0 版本。在保留高密度干货、理论和实操相结合的一贯特点之外,本次升级有以下方面的优化: 课程内容扩展:2.0 课程增加了分布式事务原理、存储引擎内核原理、计算引擎内核原理、优化器深度解析等内容,整个课程深入浅出、更加完整和体系化;优化学习曲线:2.0 课程分为基础篇、高级进阶篇和扩展篇三个层次,层层递进,能满足不同层级的学员,从入门到进阶一次搞定;知其然,更知其所以然:2.0 课程不但教学员如何操作,还会讲解 TiDB 计算、存储、调度等底层架构原理,以及时下火热的云原生技术、混合数据库(HTAP),让学员们能从深度和广度更好地了解和使用 TiDB,深刻理解数据库发展的新趋势;理论实践两手抓:2.0 课程延续了 1.0 课程的设计,理论知识和实操课程并重。在实操课程,我们给每个学员配备了硬件环境,从安装部署升级、数据迁移、到跨机房多活高可用部署,老师都会全程通过 Demo show 的方式, 让学员们真正可以快速学以致用。PingCAP University  官方网校(https://university.pingcap.com/) 已正式上线,欢迎进入线上网校学习,免费线上基础课程有助于学员快速了解 TiDB 产品全貌。学员除了可以在线自主学习外,还可以在讲师集中答疑中深入交流,优秀学员还可享受线下培训的奖励计划。 ...

June 11, 2019 · 1 min · jiezi

免费开源小程序公众号商城

免费开源小程序+公众号商城,代码易读,功能完善,基于thinkphp5开发,支持一键安装。源码地址: http://github.crmeb.net/u/blue体验地址:

June 4, 2019 · 1 min · jiezi

Ruby-比特币开发教程汇总

Mixin Network 是一个免费的 极速的端对端加密数字货币交易系统. Mixin network 官方资源汇总 课程简介创建一个机器人Ruby比特币开发教程: 机器人接受比特币并立即退还用户Ruby比特币开发教程: 创建比特币钱包Ruby 买卖Bitcoin:ExinCore API 实时兑换Ruby 买卖Bitcoin:在自由市场Ocean.One挂单买卖Ruby 买卖任意ERC20 token:在自由市场Ocean.One挂单买卖其他编程语言汇总Python 比特币开发教程 Node.js 比特币开发教程 Java 比特币开发教程 Golang 比特币开发教程 C# 比特币开发教程

May 29, 2019 · 1 min · jiezi

用Ruby在去中心化交易所OceanOne上挂单买卖任意ERC20-token

在上一课中,我们介绍了如何在OceanOne交易比特币。OceanOne支持交易任何Mixin Network上的token,包括所有的ERC20和EOS token,不需要任何手续和费用,直接挂单即可。下面介绍如何将将一个ERC20 token挂上OceanOne交易!在掌握了ERC20 token之后,就可以把任何token在Ocean上买卖。 此处我们用一个叫做Benz的ERC20 token为例。这个token已经被充值进Mixin Network,你可以在区块链浏览器看到这个token在Mixin Network内部的总数和交易 预备知识:先将Benz币存入你的钱包,然后使用getAssets API读取它的UUID. 取得该币的UUID调用 getAssets API 会返回json数据, 如: asset_id 币的UUID.public_key 该币的当前钱包的地址.symbol 币的名称. 如: Benz.if cmd == "aw" assetsInfo = walletAccount.read_assets() p "--------The Wallet Assets List-----------------" assetsInfo["data"].each { |x| puts x["symbol"] + " " + x["balance"] + " " + x["public_key"] + x["account_name"] + " " + x["account_tag"]} p "----------End of Wallet Assets --------------"end调用 read_assets API的完整输出如下: "--------The Wallet Assets List-----------------"Benz 10.03 0x822664c2EFb27E2Eb4c4286f421B4BF6FB943fC6ETH 0 0x822664c2EFb27E2Eb4c4286f421B4BF6FB943fC6EOS 0 eoswithmixin b0adfae2f8828d15e11cb1fbe23d6096USDT 1 1KB4RbV5W4MNybpjcJjULKNVXubfR5MJqACNB 0.99999995 0x822664c2EFb27E2Eb4c4286f421B4BF6FB943fC6BTC 0 1KB4RbV5W4MNybpjcJjULKNVXubfR5MJqA"----------End of Wallet Assets --------------"-------------------------------------------------------------------------限价挂单挂限价买单 低于或者等于市场价的单.挂限价卖单 高于或者是等于市场价的单.OceanOne支持三种基类价格: USDT, XIN, BTC, 即: Benz/USDT, Benz/XIN, Benz/BTC, 这儿示范Benz/USDT. ...

May 29, 2019 · 2 min · jiezi

通过-Ruby-买卖Bitcoin使用开放交易所OceanOne

上一章介绍了Exincore,你可以1秒完成资产的市价买卖。如果你想限定价格买卖,或者买卖一些exincore不支持的资产,你需要OceanOne。 方案二: 挂单Ocean.One交易所Ocean.one是基于Mixin Network的去中心化交易所,它性能一流。你可以在OceanOne上交易任何资产,只需要将你的币转给OceanOne, 将交易信息写在交易的memo里,OceanOne会在市场里列出你的交易需求,交易成功后,会将目标币转入到你的MixinNetwork帐上,它有三大特点与优势: 不需要在OceanOne注册不需要存币到交易所支持所有Mixin Network上能够转账的资产,所有的ERC20 EOS代币。预备知识:你先需要创建一个机器人, 方法在 教程一. 安装依赖包我们需要依赖 msgpack and mixin-bot ,第四章 已经做过介绍, 你应该先安装过它了. 充币到 Mixin Network, 并读出它的余额.此处演示用 USDT购买BTC 或者 用BTC购买USDT。交易前,先检查一下钱包地址。完整的步骤如下: 检查比特币或USDT的余额,钱包地址。并记下钱包地址。从第三方交易所或者你的冷钱包中,将币充到上述钱包地址。再检查一下币的余额,看到帐与否。(比特币的到帐时间是5个区块的高度,约100分钟)。比特币与USDT的充值地址是一样的。 if cmd == "aw" assetsInfo = walletAccount.read_assets() p "--------The Wallet Assets List-----------------" assetsInfo["data"].each { |x| puts x["symbol"] + " " + x["balance"] + " " + x["public_key"] + x["account_name"] + " " + x["account_tag"]} p "----------End of Wallet Assets --------------"end取得Ocean.one的市场价格信息如何来查询Ocean.one市场的价格信息呢?你要先了解你交易的基础币是什么,如果你想买比特币,卖出USDT,那么基础货币就是USDT;如果你想买USDT,卖出比特币,那么基础货币就是比特币. if ocmd == "1" Utils.OceanOneMarketPriceRequest(BTC_ASSET_ID, USDT_ASSET_ID)enddef self.OceanOneMarketPriceRequest(asset_id, base_asset_id) full_url = "https://events.ocean.one/markets/" + asset_id + "-" + base_asset_id + "/book" data = HTTP.get(full_url).body body = "" redData = data.readpartial while redData != nil body = body + redData redData = data.readpartial end result = ActiveSupport::JSON.decode(body).with_indifferent_access result["data"]["data"]["asks"].each { |x| puts x["side"] + " " + x["price"] + " " + x["amount"] + " " + x["funds"] } result["data"]["data"]["bids"].each { |x| puts x["side"] + " " + x["price"] + " " + x["amount"] + " " + x["funds"] }end交易前,创建一个Memo!在第二章里,Ruby比特币开发教程: 机器人接受比特币并立即退还用户, 我们学习过转帐,这儿我们介绍如何告诉Ocean.one,我们给它转帐的目的是什么,信息全部放在memo里. ...

May 27, 2019 · 3 min · jiezi

如何用-Ruby-买卖Bitcoin

方案一: 通过ExinCore API进行币币交易Exincore 提供了基于Mixin Network的币币交易API. 你可以支付USDT给ExinCore, ExinCore会以最低的价格,最优惠的交易费将你购买的比特币转给你, 每一币交易都是匿名的,并且可以在区块链上进行验证,交易的细节只有你与ExinCore知道! ExinCore 也不知道你是谁,它只知道你的UUID. 预备知识:你先需要创建一个机器人, 方法在 教程一. 安装依赖包正如教程一里我们介绍过的, 我们需要依赖 mixin-bot, 你应该先安装过它了, 这儿我们再安装 easy-uuid, msgpack 两个软件包. gem install msgpack gem install easy-uuid充币到 Mixin Network, 并读出它的余额.ExinCore可以进行BTC, USDT, EOS, ETH 等等交易, 这儿演示如果用 USDT购买BTC 或者 用BTC购买USDT, 交易前,先检查一下钱包地址!完整的步骤如下: 检查比特币或USDT的余额,钱包地址。并记下钱包地址。从第三方交易所或者你的冷钱包中,将币充到上述钱包地址。再检查一下币的余额,看到帐与否。(比特币的到帐时间是5个区块的高度,约100分钟)。请注意,比特币与USDT的地址是一样的。 if cmd == "aw" assetsInfo = walletAccount.read_assets() p "--------The Wallet Assets List-----------------" assetsInfo["data"].each { |x| puts x["symbol"] + " " + x["balance"] + " " + x["public_key"] + x["account_name"] + " " + x["account_tag"]} p "----------End of Wallet Assets --------------"end查询ExinCore市场的价格信息如果来查询ExinCore市场的价格信息呢?你要先了解你交易的基础币是什么,如果你想买比特币,卖出USDT,那么基础货币就是USDT;如果你想买USDT,卖出比特币,那么基础货币就是比特币. ...

May 25, 2019 · 3 min · jiezi

Ruby-比特币开发教程-创建比特币钱包

我们已经创建过一个回复消息的机器人和一个能自动支付比特币的机器人. 通过本教程的学习,你可以学到如下内容如何创建一个比特币钱包.如何读取比特币钱包的余额.如何支付比特币并即时确认.如何将Mixin Network的比特币提现到你的冷钱包或第三方交易所.前期准备:你要有一个Mixin Network账户。下面的代码创建一个帐号,并写到csv文件里。 if File.file?(WALLET_NAME) p "mybitcoin_wallet.csv has already existed !" nextendyaml_hash = YAML.load_file('./config.yml')MixinBot.client_id = yaml_hash["MIXIN_CLIENT_ID"]MixinBot.session_id = yaml_hash["MIXIN_SESSION_ID"]MixinBot.client_secret = yaml_hash["MIXIN_CLIENT_SECRET"]MixinBot.pin_token = yaml_hash["MIXIN_PIN_TOKEN"]MixinBot.private_key = yaml_hash["MIXIN_PRIVATE_KEY"]access_token = MixinBot.api.access_token("GET","/","")rsa_key = OpenSSL::PKey::RSA.new(1024)private_key = rsa_key.to_pem()p private_keypublic_key = rsa_key.public_key.to_pemsecret_client = public_key.sub("-----BEGIN PUBLIC KEY-----\n","").sub("\n-----END PUBLIC KEY-----\n","")reqInfo = MixinBot.api.create_user("ruby bot",secret_client)p reqInfo["data"]["pin_token"]p reqInfo["data"]["user_id"]p reqInfo["data"]["session_id"]CSV.open(WALLET_NAME, "wb") do |csv| csv << [private_key, reqInfo["data"]["pin_token"], reqInfo["data"]["session_id"], reqInfo["data"]["user_id"]]end上面的语句会在本地创建一个RSA密钥对,然后调用Mixin Network来创建帐号,最后保存帐号信息到csv文件. 现在你需要小心保管好你的帐号信息,在读取该账户的比特币资产余额或者进行其他操作时,将需要用到这些信息. 给新建的帐号创建一个比特币钱包新账号并不默认内置比特币钱包, 现在读一下比特币余额就可以创建一个比特币钱包。 if cmd == "2" table = CSV.read(WALLET_NAME) MixinBot.client_id = table[0][3] MixinBot.session_id = table[0][2] MixinBot.pin_token = table[0][1] MixinBot.private_key = table[0][0] botAssetsInfo = MixinBot.api.read_asset(BTC_ASSET_ID) p botAssetsInfo p "The BTC wallet address is " + botAssetsInfo["data"]["public_key"] p "The BTC wallet balance is " + botAssetsInfo["data"]["balance"]end创建的帐号的比特币资产详细信息如下,其中public key就是比特币的存币地址: ...

May 22, 2019 · 3 min · jiezi

TiKV-成功晋级-CNCF-孵化项目

今天,CNCF(Cloud Native Computing Foundation,云原生计算基金会)技术监督委员会(TOC)宣布已经投票决议通过,正式将 TiKV 从沙箱项目晋级至孵化项目。TiKV 是一个开源的分布式事务 Key-Value 数据库,支持跨行 ACID 事务,同时实现了自动水平伸缩、数据强一致性、跨数据中心高可用和云原生等重要特性,最初由 PingCAP 团队在 2016 年作为 TiDB 的底层存储引擎设计并开发,于 2018 年 8 月被 CNCF 宣布接纳为 CNCF 沙箱云原生项目。 对于 TiKV 的此次晋级,CNCF 首席技术及运营官 Chris Aniszczyk 表示:“社区需要更多支持一致性和可伸缩性的云原生存储选项,TiKV 填补了这个空缺,而不依赖于任何分布式文件系统。自从加入 CNCF 以来,我们看到该项目在中国和国外都取得了令人瞩目的增长。随着它进入孵化阶段,我们很高兴看到该项目持续增长,期待新的贡献者继续添加更多新功能。” TiKV 最初的设计便采用云原生架构,并很好地融入了现有的 CNCF 生态系统:使用 Prometheus 进行集群监控,使用 gRPC 进行通信,可以部署在 Kubernetes 上,采用 Operator 简化安装、升级和维护。 作为一个基础组件,TiKV 可作为构建其它系统的基石。除了作为分布式 HTAP 数据库 TiDB 的存储引擎,还有更多的存储系统构建于 TiKV 之上,包括三个 Redis-on-TiKV 项目:Tidis、Titan 以及 Titea ,和一个 Prometheus-metrics-in-TiKV 项目:TiPrometheus。TiKV 的生态影响力正在持续扩大。 2018 年 12 月, TiKV 发布了 2.1 GA 版本。目前,TiKV 汇集了来自三星、摩拜、知乎、饿了么、腾讯云、一点资讯,以及 UCloud 的贡献。并已被银行、金融科技、保险、拼车、游戏等多个行业的领先企业应用在实际生产环境中,比如小米、北京银行、知乎、Shopee、BookMyShow 等。 ...

May 22, 2019 · 1 min · jiezi

使用-Nodejs-在开放交易所OceanOne上挂单买卖奔驰币

在上一课中,我们介绍了如何在OceanOne交易比特币。OceanOne支持交易任何Mixin Network上的token,包括所有的ERC20和EOS token,不需要任何手续和费用,直接挂单即可。下面介绍如何将将一个ERC20 token挂上OceanOne交易。掌握了ERC20代币的交易方法,就可以交易任何其他Mixin Network代币了。 此处我们用一个叫做Benz的ERC20 token为例。这个token已经被充值进Mixin Network,你可以在区块链浏览器看到这个token在Mixin Network内部的总数和交易 预备知识:先将Ben币存入你的钱包,然后使用getAssets API读取它的UUID. 取得该币的UUID调用 getAssets API 会返回json数据, 如: asset_id 币的UUID.public_key 该币的当前钱包的地址.symbol 币的名称. 如: Benz.if ( args.type === TYPE_WALLET_ASSETS_INFO ) { const assetsInfo = await newUserClient.getUserAssets(); console.log("-AssetID--Asset--Balance--public_key--"); assetsInfo.forEach(function(element) { console.log(element.asset_id + " " + element.symbol + " " + element.balance + " " + element.public_key + " " + element.account_name + " " + element.account_tag ); }); // console.log(assetsInfo);}调用 getUserAssets API的完整输出如下: ...

May 16, 2019 · 3 min · jiezi

通过-Nodejs-买卖Bitcoin

上一章介绍了Exincore,你可以1秒完成资产的市价买卖。如果你想限定价格买卖,或者买卖一些exincore不支持的资产,你需要OceanOne。 方案二: 挂单Ocean.One交易所Ocean.one是基于Mixin Network的去中心化交易所,它性能一流。你可以在OceanOne上交易任何资产,只需要将你的币转给OceanOne, 将交易信息写在交易的memo里,OceanOne会在市场里列出你的交易需求,交易成功后,会将目标币转入到你的MixinNetwork帐上,它有三大特点与优势: 不需要在OceanOne注册不需要存币到交易所支持所有Mixin Network上能够转账的资产,所有的ERC20 EOS代币。预备知识:你先需要创建一个机器人, 方法在 教程一. 安装依赖包我们需要依赖 msgpack5 and mixin-node-client ,第四章 已经做过介绍, 你应该先安装过它了. 充币到 Mixin Network, 并读出它的余额.此处演示用 USDT购买BTC 或者 用BTC购买USDT。交易前,先检查一下钱包地址。完整的步骤如下: 检查比特币或USDT的余额,钱包地址。并记下钱包地址。从第三方交易所或者你的冷钱包中,将币充到上述钱包地址。再检查一下币的余额,看到帐与否。(比特币的到帐时间是5个区块的高度,约100分钟)。比特币与USDT的充值地址是一样的。 if ( args.type === TYPE_WALLET_ASSETS_INFO ) { const assetsInfo = await newUserClient.getUserAssets(); console.log("-AssetID--Asset--Balance--public_key--"); assetsInfo.forEach(function(element) { console.log(element.asset_id + " " + element.symbol + " " + element.balance + " " + element.public_key + " " + element.account_name + " " + element.account_tag ); }); // console.log(assetsInfo);}取得Ocean.one的市场价格信息如何来查询Ocean.one市场的价格信息呢?你要先了解你交易的基础币是什么,如果你想买比特币,卖出USDT,那么基础货币就是USDT;如果你想买USDT,卖出比特币,那么基础货币就是比特币. ...

May 15, 2019 · 4 min · jiezi

通过-Go-在去中心化交易所OceanOne上挂单买卖任意ERC20-token

在上一课中,我们介绍了如何在OceanOne交易比特币。OceanOne支持交易任何Mixin Network上的token,包括所有的ERC20和EOS token,不需要任何手续和费用,直接挂单即可。下面介绍如何将将一个ERC20 token挂上OceanOne交易!在掌握了ERC20 token之后,就可以把任何token在Ocean上买卖。 此处我们用一个叫做Benz的ERC20 token为例。这个token已经被充值进Mixin Network,你可以在区块链浏览器看到这个token在Mixin Network内部的总数和交易 预备知识:先将Ben币存入你的钱包,然后使用ReadAssets API读取它的UUID. 取得该币的UUID调用 ReadAssets API 会返回json数据, 如: asset_id 币的UUID.public_key 该币的当前钱包的地址.symbol 币的名称. 如: Benz.if cmd == "aw" { priKey, _, sID, userID, _ := GetWalletInfo() assets, err := mixin.ReadAssets(userID,sID,priKey) if err != nil { log.Fatal(err) } var AssetsInfo map[string]interface{} err = json.Unmarshal(assets, &AssetsInfo) if err != nil { log.Fatal(err) } // fmt.Println("Data is: ",AssetsInfo["data"].(map[string]interface{})["public_key"]) for _, v := range (AssetsInfo["data"].([]interface{})) { if v.(map[string]interface{})["symbol"] == "EOS" { fmt.Println(v.(map[string]interface{})["symbol"]," ", v.(map[string]interface{})["asset_id"]," ", v.(map[string]interface{})["account_name"]," ", v.(map[string]interface{})["account_tag"]," ", v.(map[string]interface{})["balance"]) } else { fmt.Println(v.(map[string]interface{})["symbol"]," ", v.(map[string]interface{})["asset_id"]," ", v.(map[string]interface{})["public_key"]," ", v.(map[string]interface{})["balance"]) } }}调用 ReadAssets API的完整输出如下: ...

May 13, 2019 · 3 min · jiezi

Whats-New-in-TiDB-300rc1

作者:段兵 2019 年 5 月 10 日,TiDB 3.0.0-rc.1 版本正式推出,该版本对系统稳定性,性能,安全性,易用性等做了较多的改进,接下来逐一介绍。 提升系统稳定性众所周知,数据库的查询计划的稳定性至关重要,此版本采用多种优化手段促进查询计划的稳定性得到进一步提升,如下: 新增 Fast Analyze 功能,使 TiDB 收集统计信息的速度有了数量级的提升,对集群资源的消耗和生产业务的影响比普通 Analyze 方式更小。新增 Incremental Analyze 功能,对于值单调增的索引能够更加方便和快速地更新其统计信息。在 CM-Sketch 中新增 TopN 的统计信息,缓解因为 CM-Sketch 哈希冲突导致估算偏大的问题,使代价估算更加准确。优化 Cost Model,利用和 RowID 列之间的相关性更加精准的估算谓词的选择率,使得索引选择更加稳定和准确。提升系统性能TableScan,IndexScan,Limit 算子,进一步提升 SQL 执行性能。TiKV 采用Iterator Key Bound Option存储结构减少内存分配及拷贝,RocksDB 的 Column Families 共享 block cache 提升 cache命中率等手段大幅提升性能。TiDB Lightning encode SQL 性能提升 50%,将数据源内容解析成 TiDB 的 types.Datum,减少 encode 过程中多余的解析工作,使得性能得到较大的提升。增强系统安全性RBAC(Role-Based Access Control)基于角色的权限访问控制是商业系统中最常见的权限管理技术之一,通过 RBAC 思想可以构建最简单”用户-角色-权限“的访问权限控制模型。RBAC 中用户与角色关联,权限与角色关联,角色与权限之间一般是多对多的关系统,用户通过成为什么样的角色获取该角色所拥有的权限,达到简化权限管理的目的,通过此版本的迭代 RBAC 功能开发完成,欢迎试用。 提升产品易用性新增 SQL 方式查询慢查询,丰富 TiDB 慢查询日志内容,如:Coprocessor 任务数,平均/最长/90% 执行/等待时间,执行/等待时间最长的 TiKV 地址,简化慢查询定位工作,提升产品易用性。新增系统配置项合法性检查,优化系统监控项等,提升产品易用性。支持对 TableReader、IndexReader 和 IndexLookupReader 算子进行内存追踪控制,对 Query 内存使用统计更加精确,可以更好地检测、处理对内存消耗较大的语句。社区贡献V3.0.0-rc.1 版本的开发过程中,开源社区贡献者给予了我们极大的支持,例如美团的同学负责开发的 SQL Plan Management 特性对于提升产品的易用性有很大的帮助,一点资讯的陈付同学与其他同学一起对 TiKV 线程池进行了重构,提高了性能并降低了延迟,掌门科技的聂殿辉同学实现 TiKV 大量 UDF 函数帮忙 TiKV 完善 Coprocessor 功能,就不再一一列举。在此对各位贡献者表示由衷的感谢。接下来我们会开展更多的专项开发活动以及一系列面向社区的培训课程,希望能对大家了解如何做分布式数据库有帮助。 ...

May 13, 2019 · 1 min · jiezi

通过-Go-在去中心化交易所OceanOne上挂单买卖Bitcoin

上一章介绍了Exincore,你可以1秒完成资产的市价买卖。如果你想限定价格买卖,或者买卖一些exincore不支持的资产,你需要OceanOne。 方案二: 挂单Ocean.One交易所Ocean.one是基于Mixin Network的去中心化交易所,它性能一流。你可以在OceanOne上交易任何资产,只需要将你的币转给OceanOne, 将交易信息写在交易的memo里,OceanOne会在市场里列出你的交易需求,交易成功后,会将目标币转入到你的MixinNetwork帐上,它有三大特点与优势: 不需要在OceanOne注册不需要存币到交易所支持所有Mixin Network上能够转账的资产,所有的ERC20 EOS代币。预备知识:你先需要创建一个机器人, 方法在 教程一. 安装依赖包第四课, 在上一课中已经安装好了. 充币到 Mixin Network, 并读出它的余额.此处演示用 USDT购买BTC 或者 用BTC购买USDT。交易前,先检查一下钱包地址。完整的步骤如下: 检查比特币或USDT的余额,钱包地址。并记下钱包地址。从第三方交易所或者你的冷钱包中,将币充到上述钱包地址。再检查一下币的余额,看到帐与否。(比特币的到帐时间是5个区块的高度,约100分钟)。比特币与USDT的充值地址是一样的。 userInfo, userID := ReadAssetInfo("USDT")fmt.Println("User ID ",userID, "'s USDT Address is: ", userInfo["data"].(map[string]interface{})["public_key"])fmt.Println("Balance is: ", userInfo["data"].(map[string]interface{})["balance"])func ReadAssetInfo(asset_id string) ( map[string]interface{}, string) { var UserInfoMap map[string]interface{} csvFile, err := os.Open("mybitcoin_wallet.csv") if err != nil { log.Fatal(err) } reader := csv.NewReader(bufio.NewReader(csvFile)) record, err := reader.Read() if err != nil { log.Fatal(err) } fmt.Println(record[3]) PrivateKey2 := record[0] SessionID2 := record[2] UserID2 := record[3] UserInfoBytes, err := mixin.ReadAsset(mixin.GetAssetId(asset_id), UserID2,SessionID2,PrivateKey2) if err != nil { log.Fatal(err) } fmt.Println(string(UserInfoBytes)) if err := json.Unmarshal(UserInfoBytes, &UserInfoMap); err != nil { panic(err) } csvFile.Close() return UserInfoMap, UserID2}取得Ocean.one的市场价格信息如何来查询Ocean.one市场的价格信息呢?你要先了解你交易的基础币是什么,如果你想买比特币,卖出USDT,那么基础货币就是USDT;如果你想买USDT,卖出比特币,那么基础货币就是比特币. ...

May 12, 2019 · 4 min · jiezi

笨蛋问题是产品

2003 年,是互联网公司最困难的时刻。互联网泡沫自 2000 年达到顶峰之后开始破灭,之后股市和投资额一路下跌,一直跌到了 2002 年底,该破产的公司早已破产,没破产的也很难再融到新的资金,只能靠裁员勉强让公司能多活一段时间。到谷底的时候,四处都是恐慌和绝望,甚至最坚定的互联网信仰者也多少有点动摇。大家也在疑问,我们从事的这个行业,到底有没有价值? 到 2003 年,硅谷名人,最大的计算机技术出版商 O'Reilly 的创始人,年近 50 的 Tim O'Reilly,决定站出来给年轻的互联网公司们鼓劲。除了开始推广一个叫做 Web2.0 的概念,宣称互联网最大的浪潮即将到来之外,O'Reilly 还组织了一场特别聚会,叫做 Foo Camp。 <center>The "camp" in the Googleplex atrium</center> Foo Camp 和当时所有的技术活动都不一样,它是完全没有主题的。按照组织者的说法,这个活动就是大家拿出一个周末的时间,在一个有网络的大厅里,提供吃喝和帐篷,让大家随便聊天,并向其他人讲述自己对科技行业发展的想法,或者展示自己的产品点子。你可以随便抓住一个人开始聊,也可以累了钻帐篷里面睡一觉,起来继续聊,如果觉得自己聊出了特别有价值的东西,马上就到白板上自己写个时间表,上台给所有人讲。但是即使台上有人拿着麦克风讲,下面的人也未必感兴趣认真听,他们可能会继续激动的聊天,完全不理会台上的人。 这个活动吸引了 200 多人参加,大家聊了无数想法,一些程序员还带着自己正在做的项目原型当场展示。整个活动充满了西海岸的嬉皮劲儿,加州的一堆精酿啤酒作坊也带着自己得意的啤酒跑去为这些“聪明的脑袋”提供酒精燃料。 之后这个活动席卷全球,各国各地都开了一场又一场,中国也曾经开过几次。今天我们可以说,那是互联网的先驱者的活动。他们在整个行业最绝望的时候,讨论出了各种应用场景,最终这些场景大部分变成了产品。比如,如何组织信息流,如何提供 Feed,这些想法后来开启了 Blog 时代,最终又演变成了社交网络。再比如说,BT 下载在那次活动上已经能拿出一个完善的产品演示,通过在活动上的展示开始为世人所知。 实际上,在 2003 年那个时间点,互联网需要的基础技术和开源软件已经都具备了。虽然它们远没有今天强大,没有今天这么方便快捷,但是技术基础已经完全具备了。只是大部分人在那个时间点还不能理解,这些技术基础能提供什么实际用途。 这正如克林顿当年的竞选美国总统时候的著名标语:“笨蛋,问题是经济“。在那个时间点上,互联网面对的问题正是如此,问题是产品。 这种场景在互联网和科技的发展历史上每过几年就会出现一次。再比如说,移动互联网时代从 GPRS 网络铺设完成就算开始了,到 3G 建设时候已经具有相当不错的技术基础,然而,人们苦寻杀手产品而不得,很多国家的运营商差点被拖到破产。一直到 iPhone 这个杀手产品出现,移动互联网的浪潮才算真正开始。科技发展史可以 告诉我们的一个经验就是:技术发展的速度通常超前,产品通常滞后。而更有趣的是,产品的出现和发展弹性非常大,人们完全可以通过适当的取舍,在技术发展有一定局限性的时候,就产生出真正可用的产品。比如说,今天手机 4G 网络已经到了200M 带宽,但是 90 年代末人们已经开始开始 P2P 下载了,当时常见的宽带带宽还不到 1M。 区块链,在我看来恰好就是那个时代的状态。技术基础已经足够产生有意思的应用,但是实际上应用本身远远不够丰富。除了钱包,菠菜,真正让人们觉得可用的东西远远不够,一场热潮又刚刚结束,熊市还不知道要维持多久,这恰好就是 2002 年我见过的互联网世界。比起来 2002 年的互联网基础设施,今天区块链实际上已经好于那时候了,也有了足够多的技术方案。这些方案已经足够解决一些问题了,但这些问题往往分布在不同行业里,我们这个行业的从业者可能还没有意识到它们的存在。而那些行业的从业者,也不知道区块链现在已经足够解决他们的问题。虽然区块链还有各种缺点,但是在不同行业的不同应用场景下,根据具体需求重新组合效率,可靠性,成本,去中心化的不同需求和粒度,理应可以产生真正解决问题的产品模式。归根结底还是这句话:“问题是产品”。 因此,当我们的 PRESS.one 基础设施逐渐齐备,可以开始负担一些应用的时候,团队问我,咱们要不要搞一个黑客松之类的活动。但我第一个想起的活动不是黑客松这种开发类活动,而是更接近创意和讨论的 Foo Camp。在这个时代我们更需要的是想法的碰撞,尤其是来自完全不同行业,不同背景的人群的想法,哪怕是觉得“你们这事完全不靠谱”的想法也值得辩论。毕竟,互联网的早期也有大批传统软件拥护者跑过来砸场,坚称大众互联网毫无价值,软件才是未来。 ...

May 9, 2019 · 1 min · jiezi

通过-C-买卖Bitcoin

上一章介绍了Exincore,你可以1秒完成资产的市价买卖。如果你想限定价格买卖,或者买卖一些exincore不支持的资产,你需要OceanOne。 方案二: 在去中心化交易所OceanOne上挂单买卖BitcoinOcean.one是基于Mixin Network的去中心化交易所,它性能一流。你可以在OceanOne上交易任何资产,只需要将你的币转给OceanOne, 将交易信息写在交易的memo里,OceanOne会在市场里列出你的交易需求,交易成功后,会将目标币转入到你的MixinNetwork帐上,它有三大特点与优势: 不需要在OceanOne注册不需要存币到交易所支持所有Mixin Network上能够转账的资产,所有的ERC20 EOS代币。预备知识:你先需要创建一个机器人, 方法在 教程一. 安装依赖包我们需要依赖 MsgPack.Cli and mixin-csharp-sdk ,第四章 已经做过介绍, 你应该先安装过它了. 充币到 Mixin Network, 并读出它的余额.此处演示用 USDT购买BTC 或者 用BTC购买USDT。交易前,先检查一下钱包地址。完整的步骤如下: 检查比特币或USDT的余额,钱包地址。并记下钱包地址。从第三方交易所或者你的冷钱包中,将币充到上述钱包地址。再检查一下币的余额,看到帐与否。(比特币的到帐时间是5个区块的高度,约100分钟)。比特币与USDT的充值地址是一样的。 if (cmd == "aw" ) { // Console.WriteLine(mixinApi.VerifyPIN(USRCONFIG.PinCode.ToString()).ToString()); MixinApi mixinApiNewUser = GetWalletSDK(); var assets = mixinApiNewUser.ReadAssets(); string wuuid = GetWalletUUID(); Console.WriteLine("Current wallet uuid is " + wuuid); foreach (Asset asset in assets) { if (asset.symbol == "EOS") { Console.WriteLine(asset.symbol + " Public Address is: " + asset.account_name + " " + asset.account_tag + " Balance is: " + asset.balance); } else Console.WriteLine(asset.symbol + " Public Address is: " + asset.public_key + " Balance is: " + asset.balance); Console.WriteLine(); }}取得Ocean.one的市场价格信息如何来查询Ocean.one市场的价格信息呢?你要先了解你交易的基础币是什么,如果你想买比特币,卖出USDT,那么基础货币就是USDT;如果你想买USDT,卖出比特币,那么基础货币就是比特币. ...

May 7, 2019 · 4 min · jiezi

用PHP在去中心化交易所OceanOne上挂单买卖任意ERC20-token

在上一课中,我们介绍了如何在OceanOne交易比特币。OceanOne支持交易任何Mixin Network上的token,包括所有的ERC20和EOS token,不需要任何手续和费用,直接挂单即可。下面介绍如何将将一个ERC20 token挂上OceanOne交易! 此处我们用一个叫做Benz的ERC20 token为例。这个token已经被充值进Mixin Network,你可以在区块链浏览器看到这个token在Mixin Network内部的总数和交易 预备知识:先将Benz币存入你的钱包,然后使用getAssets API读取它的UUID. 取得该币的UUID调用 getAssets API 会返回json数据, 如: asset_id 币的UUID.public_key 该币的当前钱包的地址.symbol 币的名称. 如: Benz.if ($line == 'aw') { $mixinSdk_eachAccountInstance = GenerateWalletSDKFromCSV(); $asset_info = $mixinSdk_eachAccountInstance->Wallet()->readAssets(); foreach ($asset_info as $key => $asset) { echo $asset["symbol"] . " " . $asset["asset_id"] ." ". $asset["balance"] . " ". $asset["public_key"].PHP_EOL; }}调用 getAssets API的完整输出如下: Make your choose:awrun...client id is:26b20aa5-40c0-3e00-9de0-666cfb6f2daaBenz 2b9c216c-ef60-398d-a42a-eba1b298581d 799 0x9A4F6c67444cd6558905ef5B04a4c429b9538A9dEOS 6cfe566e-4aad-470b-8c9a-2fd35b49c68d 0CNB 965e5c6e-434c-3fa9-b780-c50f43cd955c 4.72599997 0x9A4F6c67444cd6558905ef5B04a4c429b9538A9dBTC c6d0c728-2624-429b-8e0d-d9d19b6592fa 0 17z1Rq3VsyvvXvGWiHT8YErjBoFgnhErB8XIN c94ac88f-4671-3976-b60a-09064f1811e8 0.01 0x9A4F6c67444cd6558905ef5B04a4c429b9538A9d限价挂单挂限价买单 低于或者等于市场价的单.挂限价卖单 高于或者是等于市场价的单.OceanOne支持三种基类价格: USDT, XIN, BTC, 即: Benz/USDT, Benz/XIN, Benz/BTC, 这儿示范Benz/USDT. ...

May 2, 2019 · 2 min · jiezi

PHP比特币开发教程在去中心化交易所OceanOne上挂单买卖比特币

上一章介绍了Exincore,你可以1秒完成资产的市价买卖。如果你想限定价格买卖,或者买卖一些exincore不支持的资产,你需要OceanOne。 方案二: 挂单Ocean.One交易所Ocean.one是基于Mixin Network的去中心化交易所,它性能一流。你可以在OceanOne上交易任何资产,只需要将你的币转给OceanOne, 将交易信息写在交易的memo里,OceanOne会在市场里列出你的交易需求,交易成功后,会将目标币转入到你的MixinNetwork帐上,它有三大特点与优势: 不需要在OceanOne注册不需要存币到交易所支持所有Mixin Network上能够转账的资产,所有的ERC20 EOS代币。预备知识:你先需要创建一个机器人, 方法在 教程一. 安装依赖包正如教程一里我们介绍过的, 我们需要依赖 mixin-sdk-php, 你应该已经先安装过它了. 安装依赖的库第四课, 在上一课中已经安装好了. 充币到 Mixin Network, 并读出它的余额.此处演示用 USDT购买BTC 或者 用BTC购买USDT。交易前,先检查一下钱包地址。完整的步骤如下: 检查比特币或USDT的余额,钱包地址。并记下钱包地址。从第三方交易所或者你的冷钱包中,将币充到上述钱包地址。再检查一下币的余额,看到帐与否。(比特币的到帐时间是5个区块的高度,约100分钟)。比特币与USDT的充值地址是一样的。 const BTC_ASSET_ID = "c6d0c728-2624-429b-8e0d-d9d19b6592fa"; const EOS_ASSET_ID = "6cfe566e-4aad-470b-8c9a-2fd35b49c68d"; const USDT_ASSET_ID = "815b0b1a-2764-3736-8faa-42d694fa620a"; $mixinSdk_eachAccountInstance = new MixinSDK(GenerateConfigByCSV($data)); $asset_info = $mixinSdk_eachAccountInstance->Wallet()->readAsset(BTC_ASSET_ID); print_r("Bitcoin wallet address is :".$asset_info["public_key"]."\n"); print_r("Bitcoin wallet balance is :".$asset_info["balance"]."\n");取得Ocean.one的市场价格信息如何来查询Ocean.one市场的价格信息呢?你要先了解你交易的基础币是什么,如果你想买比特币,卖出USDT,那么基础货币就是USDT;如果你想买USDT,卖出比特币,那么基础货币就是比特币. if ( $ocmd == '1') { getOceanOneMarketInfos(XIN_ASSET_ID,USDT_ASSET_ID);}function getOceanOneMarketInfos($targetCoin, $baseCoin) { $client = new GuzzleHttp\Client(); $baseUrl = "https://events.ocean.one/markets/".$targetCoin."-".$baseCoin."/book"; $res = $client->request('GET', $baseUrl, [ ]); if ($res->getStatusCode() == "200") { // echo $res->getStatusCode() . PHP_EOL; $resInfo = json_decode($res->getBody(), true); echo "Side | Price | Amount | Funds" . PHP_EOL; foreach ($resInfo["data"]["data"]["asks"] as $key => $exchange) { echo $exchange["side"] . " " . $exchange["price"] . " " . $exchange["amount"] ." " . $exchange["funds"] . PHP_EOL; } foreach ($resInfo["data"]["data"]["bids"] as $key => $exchange) { echo $exchange["side"] . " " . $exchange["price"] . " " . $exchange["amount"] ." " . $exchange["funds"] . PHP_EOL; } }}交易前,创建一个Memo!在第二章里,基于Mixin Network的 PHP 比特币开发教程: 机器人接受比特币并立即退还用户, 我们学习过转帐,这儿我们介绍如何告诉Ocean.one,我们给它转帐的目的是什么,信息全部放在memo里. ...

April 30, 2019 · 3 min · jiezi

蚂蚁金服SOFA开源负责人鲁直不只是中间件未来会开源更多

摘要: 蚂蚁金服开源也不只是 SOFA 中间件框架,未来会开源更多的东西,包括 AI 方面的一些技术,也希望整个社区能够多关注蚂蚁金服在开源上面未来的举措。本文转载自微信公众号:Linux中国,原作者:王兴宇 近日,技术媒体Linux中国的创始人王兴宇对蚂蚁金服SOFA开源负责人鲁直,就SOFA 5、ServiceMesh、Serverless、Seata等技术内容进行了探讨,以下为专访文章。 虽然我和鲁直在微信上已经联系很久了,但这还是第一次见面。交谈中,我了解到鲁直是2009 年加入阿里巴巴工作,已经有十年了。刚开始是在1688.COM 做业务系统,对中间件技术非常感兴趣,也会经常研究各种中间件的实现和功能。后来在 2013年时,为了更深入地学习研究中间件框架,转到了蚂蚁金服中间件团队,从那个时候开始就一直在做 SOFA。 目前鲁直在SOFA的团队主要负责的工作包括几个部分。其中一个主要部分就是 SOFA 开源相关的工作。SOFA 的产品体系非常广,包括已经对外开源的部分、内部整个微服务体系,以及 SOFA 框架等等——而这些开源相关的工作主要是由鲁直负责推动的。 当然,作为技术负责人,鲁直既要带技术团队也要做技术工作。谈及这一点,鲁直说: “我觉得做技术管理,跟普通的管理不太一样,因为技术管理最重要的一个点是除了管理之外,还要保持一定的技术判断力和敏锐度。对一些新技术,包括团队中遇到一些重大的技术问题,你都要有一些方向性的判断。虽然最后不一定是你具体解决的,但是在整个团队的技术攻坚和技术选型上,要一起确立方向。” 我以前也做过十余年的技术管理,我很能够感受这种情况,重大问题技术负责人更要迎难而上。 SOFA 5 落子 Service Mesh就我了解的情况,现在 SOFA 已经发展到了 SOFA5 了。在 SOFA4阶段,主要的任务是将开源体系捋清楚了,然后开始按步骤地开源;到现在发展到了 SOFA5。我想知道从 SOFA4 发展到 SOFA5,是什么让蚂蚁金服中间件团队判断 SOFA4 的阶段性目标已经达成,可以迈进到新的 SOFA5 阶段了呢? “从整个业界趋势上来讲,SOFA4 的架构相对来说还是偏传统一些,更多是对我们之前的技术框架的整理和梳理。在这个阶段,SOFA 的代码经过了非常多的优化和重构,才达到了对外开源的要求,从而 SOFA 走上了开源核心的模式,逐步分阶段的将各个部分进行了开源。”鲁直讲到,“但是,从我们对业界的整体判断上来说,未来无疑是云的时代,所以说要考虑怎么让所有的业务系统能够提供云的能力,比如说 Serverless。” 接着这个话题,鲁直讲了他对云计算的理解:“一方面云计算肯定要为整个业务的发展提供更加方便的基础资源,可以不用去关心底层的基础设施。Serverless字面的意思就是说‘无服务器’——我不用关心服务器怎么来的,不用关心基础设施,只要关心业务代码就可以了。那反过来对于云服务商来说,经过了这一层抽象,其资源利用率会更高,可以有更多的利润空间,这是一个双赢的局面。对于用户来讲,这种好处是实实在在的,可以更少关注基础设施,只关心代码就可以了。” “我们希望在 SOFA5 的方向上,在这个新的迭代中,去让业务——包括让未来我们开源出来各种功能、各样服务模式——都更多地去关心自己的业务代码,而不用再过多地关心基础设施。”鲁直说, 在 SOFA5 中,一个重要的方向就是 Service Mesh这个方向,这将是 SOFA5 中非常重要的特性。鲁直强调了其对 Service Mesh 技术的看好:“我认为 Service Mesh 是迈向未来往前走的非常关键的一步,让业务不用再关心基础设施。通过 Service Mesh,我们可以将很多技术能力直接放到基础设施里面,而业务可以不用感知到这一层。原来可能需要花几个小时或者更多的时间解决的基础设施问题,现在可以通过 Service Mesh解决掉。” ...

April 30, 2019 · 2 min · jiezi

在OceanOne上挂单买卖任意ERC20-token

在上一课中,我们介绍了如何在OceanOne交易比特币。OceanOne支持交易任何Mixin Network上的token,包括所有的ERC20和EOS token,不需要任何手续和费用,直接挂单即可。下面介绍如何将将一个ERC20 token挂上OceanOne交易! 此处我们用一个叫做Benz的ERC20 token为例。这个token已经被充值进Mixin Network,你可以在区块链浏览器看到这个token在Mixin Network内部的总数和交易 预备知识:先将Ben币存入你的钱包,然后使用getAssets API读取它的UUID. 取得该币的UUID调用 getAssets API 会返回json数据, 如: asset_id 币的UUID.public_key 该币的当前钱包的地址.symbol 币的名称. 如: Benz.if ( input.equals("aw") ) { MixinAPI mixinApiUser = generateAPI_FromCSV(); JsonArray assets = mixinApiUser.getAssets(); System.out.println("------------------------All Assets Information---------------------------"); System.out.println(assets); assets.forEach((element) -> { JsonObject jsonObj = element.getAsJsonObject(); System.out.println(jsonObj.get("asset_id").getAsString() + " " + jsonObj.get("symbol").getAsString() + " " + jsonObj.get("public_key").getAsString() + " " + jsonObj.get("balance").getAsString() ); }); System.out.println("-----------------------------------------------------------------------");}调用 getAssets API的完整输出如下: ...

April 28, 2019 · 3 min · jiezi

Java-比特币开发系列教程汇总

创建一个机器人机器人接受比特币并立即退还用户创建比特币钱包市场价闪兑比特币在去中心化交易所限价买卖比特币在去中心化交易所自由挂单买卖任意ERC20 token其他编程语言比特币开发教程如下: Python 比特币开发教程Go 比特币开发教程Java 比特币开发教程Node.js 比特币开发教程C# 比特币开发教程PHP 比特币开发教程Mixin Network 开发者资源汇总

April 28, 2019 · 1 min · jiezi

Java比特币开发教程Java编程在开放式交易所限价买卖比特币

上一章介绍了Exincore,你可以1秒完成资产的市价买卖。如果你想限定价格买卖,或者买卖一些exincore不支持的资产,你需要OceanOne。 方案二: 挂单Ocean.One交易所Ocean.one是基于Mixin Network的去中心化交易所,它中心化交易所一样友好。你可以在OceanOne上交易任何资产,只需要将你的币转给OceanOne, 将交易信息写在交易的memo里,OceanOne会在市场里列出你的交易需求,交易成功后,会将目标币转入到你的MixinNetwork帐上,它有三大特点与优势: 不需要在OceanOne注册不需要存币到交易所支持所有Mixin Network上能够转账的资产,所有的ERC20 EOS代币。预备知识:你先需要创建一个机器人, 方法在 教程一. 安装依赖包正如教程一里我们介绍过的, 我们需要依赖 mixin-java-sdk, 你应该先安装过它了,zhang/mixin_labs-java-bot/blob/master/README.md). Install required packages第四课, 在上一课中已经安装好了. 充币到 Mixin Network, 并读出它的余额.此处演示用 USDT购买BTC 或者 用BTC购买USDT。交易前,先检查一下钱包地址。完整的步骤如下: 检查比特币或USDT的余额,钱包地址。并记下钱包地址。从第三方交易所或者你的冷钱包中,将币充到上述钱包地址。再检查一下币的余额,看到帐与否。(比特币的到帐时间是5个区块的高度,约100分钟)。比特币与USDT的充值地址是一样的。 private static final String BTC_ASSET_ID = "c6d0c728-2624-429b-8e0d-d9d19b6592fa"; private static final String EOS_ASSET_ID = "6cfe566e-4aad-470b-8c9a-2fd35b49c68d"; private static final String USDT_ASSET_ID = "815b0b1a-2764-3736-8faa-42d694fa620a"; MixinAPI mixinApiUser = generateAPI_FromCSV(); JsonObject asset = mixinApiUser.getAsset(BTC_ASSET_ID); System.out.println(asset); System.out.println("------------------------BTC------Information---------------------------"); System.out.println("The BTC wallet address is " + asset.get("public_key").getAsString()); System.out.println("The BTC wallet balance is " + asset.get("balance").getAsString()); System.out.println("-----------------------------------------------------------------------");取得Ocean.one的市场价格信息如何来查询Ocean.one市场的价格信息呢?你要先了解你交易的基础币是什么,如果你想买比特币,卖出USDT,那么基础货币就是USDT;如果你想买USDT,卖出比特币,那么基础货币就是比特币. ...

April 27, 2019 · 4 min · jiezi

去中心化交易所的意义在哪里

比特币作为一个点对点电子现金系统,却需要一个中心化的交易所来撮合交易。这虽然不符合点对点的精神。但是依然被客户迅速的接受了。 中心化交易所的风险资产安全封闭化运行的交易所的资金安全性高度依赖团队技术能力和信用。 因为内鬼和黑客破坏造成的损失非常多。 隐私安全这些交易所都要求用户提供身份信息。这是一个极大的风险,想象一下交易所如果倒闭,那么里面的身份信息一定会被卖掉。 基于以太坊和EOS的去中心化交易所方案ddex, 鲸交所 交易所无论基于以太坊,还是EOS,本身能交易的资产都太少。不能交易比特币,可是比特币的价值超过整个数字货币的一半,一个不能交易比特币的交易所是很难有价值的。 比特币的进展随着比特币脚本支持HTLC (Hash Time-Locked Contract)。现在已经可以实现比特币与莱特币,量子链的原子交换。原子交换的意思就是交易双方经过协商构造一个交易广播,只有自己把钱真的打给某个地址之后,才能动对方打转过来的币。这里有一个介绍 这个方案可以说是非常安全,而且非常有用。但是这个方案本身只能用于支持比特币脚本的那些语言,莱特币,量子。使用账户体系的以太坊和EOS就很难接入这个技术,导致稳定币也无法进入这个交易所。 合理的交易所应该是什么样子符合比特币精神的交易所应该 不需要注册不需要充值到交易所指定的钱包订单撮合成功后资金应该回到用户自己的钱包里面,而不是需要审批才能提走。但是只有比特币的精神还不够,这个交易所要对人们有用,就还需要两个特性: 支持比特币和主流币种,特别是稳定币。转账速度足够快,不能是以太坊上那个确认速度。还有那些特性是未来一定需要的呢? 自由添加交易对。为什么要填写申请表才能挂一个新的品种呢?不能直接就挂单么?小型社区自己发币自己组成交易市场难道不是很合理么?资产交易对公众可验证,但是匿名。买卖资产的动作被所有人知道难道不是一件很可怕的事情么?那么有这样的交易所么?有。 https://ocean.one, 无需注册,有一个Mixin Networt钱包就能挂单. Mixin Networ现在有很多种钱包,有6种sdk支持创建钱包。不需要充值到交易所账户撮合成功后直接资产到用户的Mixin Network钱包,非常安全。基于Mixin Network支持很多资产:比特币,USDT,ERC20,EOS token基于Mixin Network交易确认极快,挂单1秒钟,撮合1秒钟,打币1秒钟自由添加交易对,几乎可以买卖任何资产,无需审批。基于Mixin Network交易匿名但是可以验证挂单在这个交易所挂单就是把要卖的资产付到交易所地址,然后把要买的资产信息和价格写在付款memo里面。一旦撮合成功,资产原路返回用户钱包。 取消订单取消订单的方式也很直接,把要取消的订单号写在memo里面,然后付一笔足够小的任意资产给交易所就可以了。 这个交易所本身运行在Mixin Network这个公链上。这个主网代码开源而且已经上线了,现在有15个节点,还有5个节点即将加入。主网代码。 你也可以搭建一个交易所这个交易所是开源的的,所以任何人都可以搭建一个自己的交易所,可以设定自己的手续费。 不完美Ocean还不是一个完美的方案, 他的撮合依然是不上链的没有匹配的订单资产依然属于Ocean,目前Ocean是由Mixin 团队来搭建的。由于没有上币审批流程,所以需要在客户端展示交易对的详细信息来提高诈骗难度。一定会出现假BNB token谁能在去中心化交易场景下赚到钱如果只有少数人能赚到钱,那么注定这个模式走不下去。我们猜想一下谁能赚到钱。 建立撮合引擎的人他可以收手续费。但是这个场景下市场是充分开放的,人们换交易所的成本是0,一旦一个交易所性价比降低,人们将逃跑 在中心化交易所和去中心化交易所之间搬砖的人这个场景可以保护个人隐私,而且完成单笔交易无需二次充值提现,所以交易速度更快,因此理论上重视隐私和重视速度的用户会愿意多付一点钱来完成交易。因此此处一定有愿意来赚差价的商人。 钱包开发者由于开源特性,钱包开发者从用户那里可能不太容易赚到钱。 总结:在数字世界保护个人财产和隐私的路上,还有很长的路要走,大家共勉。

April 26, 2019 · 1 min · jiezi

B 站源码泄露?这是—什么—操作(黑人问号)?

作者:CSDN“后院”都要失守了,就先别馋大碗宽面了——B 站,你可长点儿心吧! “你的源代码泄露了,还搁这儿吃面?” 2019 年 4 月 22 日,B 站(bilibili 弹幕网)官方微博账号内一片风平浪静岁月静好,照常发着安利视频。蹭着吴亦凡的新歌热度,16:56 分的推送是一碗货真价实的“大碗宽面”,但评论里的画风却是清一色的跑题——集体喊话 B 站,“回家看看吧,你家后院被点炮了”! 吃面路人一脸迷惑,啥?B 站到底咋了你们说清楚? 报!!B 站后台源码疑似泄露! 今天下午四点前后,有网友在 GitHub 上发现了一个“疯狂的”repo——上线不到 6 小时,便斩获 5000+ Star,Fork 数也一路飙过 6000,而且完全没有暂缓的趋势。 这个 repo 内容介绍的一行字也足够简单粗暴——哔哩哔哩 bilibili 网站后台工程 源码。 吃瓜群众惊落一地瓜子:嚯!B 站这是把自家的核心代码开源了?!还是说只是开放了旧版源码?此番 B 站方面是主动开源还是无辜被泄露? 一时间各种猜测、讨论潮水般涌入各大论坛及社交平台,“B站 源码”、“B站 GitHub”等相关话题的热度也在不断攀升。 但大家很快发现,该项目并未托管在 B 站的官方组织域(https://github.com/Bilibili) 之下,而其作者 openbilibili 也是个今天刚加入 GitHub 的“不知名人士”。因此,这次“开源”大概率上不会是 B 站的官方操作。 而且该项目的 README 包括项目规范和负责人信息两部分,后者还涵盖了详细的业务、具体负责人等信息。由此看来,这可能更倾向于团队内部的章程文件。 随着讨论楼越搭越高,在一众 666 之声中,开始有人提出“这个 repo 是在非法泄露源代码”。类似的声音在该项目的 Issue 中也越来越多,B 站官方社交账号下的评论也开始紧急呼叫“takedown”。 ...

April 23, 2019 · 1 min · jiezi

Java比特币开发教程:Java编程买卖比特币

方案一: 通过ExinCore API进行币币交易Exincore 提供了基于Mixin Network的币币交易API. 你可以支付USDT给ExinCore, ExinCore会以最低的价格,最优惠的交易费将你购买的比特币转给你, 每一币交易都是匿名的,并且可以在链上进行验证,交易的细节只有你与ExinCore知道! ExinCore 也不知道你是谁,它只知道你的UUID. 预备知识:你先需要创建一个机器人, 方法在 教程一. 安装依赖包正如教程一里我们介绍过的, 我们需要依赖 mixin-java-sdk, 你应该先安装过它了, 这儿我们再安装其它的软件包.下载地址: mvnrepositorybuild.gradle.kts的dependencies,加入如下依赖的包: implementation("com.google.guava:guava:27.0.1-jre") implementation("commons-codec:commons-codec:1.11") implementation("com.auth0:java-jwt:3.8.0") compile(files("libs/mixin-java-sdk.jar")) implementation("com.squareup.okhttp3:okhttp:3.12.1") implementation("com.squareup.okio:okio:2.2.2") implementation("com.google.code.gson:gson:2.8.5") implementation("org.bouncycastle:bcprov-jdk16:1.46") implementation("org.apache.commons:commons-csv:1.6") implementation("org.msgpack:msgpack-core:0.8.16") implementation("com.fasterxml.jackson.core:jackson-databind:2.9.8") implementation("com.fasterxml.jackson.core:jackson-core:2.9.8") implementation("org.jetbrains.kotlin:kotlin-stdlib:1.3.30")充币到 Mixin Network, 并读出它的余额.通过ExinCore API, 可以进行BTC, USDT, EOS, ETH 等等交易, 此处演示用 USDT购买BTC 或者 用BTC购买USDT。交易前,先检查一下钱包地址。完整的步骤如下: 检查比特币或USDT的余额,钱包地址。并记下钱包地址。从第三方交易所或者你的冷钱包中,将币充到上述钱包地址。再检查一下币的余额,看到帐与否。(比特币的到帐时间是5个块的高度,约100分钟)。比特币与USDT的充值地址是一样的。 private static final String BTC_ASSET_ID = "c6d0c728-2624-429b-8e0d-d9d19b6592fa"; private static final String EOS_ASSET_ID = "6cfe566e-4aad-470b-8c9a-2fd35b49c68d"; private static final String USDT_ASSET_ID = "815b0b1a-2764-3736-8faa-42d694fa620a"; MixinAPI mixinApiUser = generateAPI_FromCSV(); JsonObject asset = mixinApiUser.getAsset(BTC_ASSET_ID); System.out.println(asset); System.out.println("------------------------BTC------Information---------------------------"); System.out.println("The BTC wallet address is " + asset.get("public_key").getAsString()); System.out.println("The BTC wallet balance is " + asset.get("balance").getAsString()); System.out.println("-----------------------------------------------------------------------");查询ExinCore市场的价格信息如何来查询ExinCore市场的价格信息呢?你要先了解你交易的基础币是什么,如果你想买比特币,卖出USDT,那么基础货币就是USDT;如果你想买USDT,卖出比特币,那么基础货币就是比特币. ...

April 22, 2019 · 4 min · jiezi

Mixin Network送出1000美金给 Java SDK 赏金任务猎人

Mixin Network在1个月以前发布了赏金任务: 完善Java SDK如今作品揭晓: yuantops/mixin_java_sdk作者已经获得由CEO cedric 颁发的5 XIN token奖励,价值1000美金。到现在,支持Mixin network的sdk已经包括PHP, Java, C#, Node.js, Python,Go, Ruby编程入门教程内容包括创建聊天机器人,机器人收发比特币,创建独立的比特币钱包,和买卖比特币。入门教程演示代码已经包括PHP, Java, C#, Node.js, Python,Go。Mixin Network 资源汇总开发者资源汇总

April 20, 2019 · 1 min · jiezi

Node.js买卖比特币 教程

通过 Nodejs 买卖BitcoinGithub Repo方案一: 通过ExinCore API进行币币交易Exincore 提供了基于Mixin Network的币币交易API.你可以支付USDT给ExinCore, ExinCore会以最低的价格,最优惠的交易费将你购买的比特币转给你, 每一币交易都是匿名的,并且可以在区块链上进行验证,交易的细节只有你与ExinCore知道!ExinCore 也不知道你是谁,它只知道你的UUID.预备知识:你先需要创建一个机器人, 方法在 教程一.安装依赖包正如教程一里我们介绍过的, 我们需要依赖 mixin-node-client, 你应该先安装过它了, 这儿我们再安装其它的软件包. yarn add fast-csv inquirer msgpack5 path pem-fileor npm i fast-csv inquirer msgpack5 path pem-file充币到 Mixin Network, 并读出它的余额.通过ExinCore API, 可以进行BTC, USDT, EOS, ETH 等等交易, 此处演示用 USDT购买BTC 或者 用BTC购买USDT。交易前,先检查一下钱包地址。完整的步骤如下:检查比特币或USDT的余额,钱包地址。并记下钱包地址。从第三方交易所或者你的冷钱包中,将币充到上述钱包地址。再检查一下币的余额,看到帐与否。(比特币的到帐时间是5个区块的高度,约100分钟)。比特币与USDT的充值地址是一样的。 let aesKey = ‘’; const privateKeyBytes = pem.decode(Buffer.from(data[0])); const aesKeyBuffer = await oaepDecrypt( Buffer.from(data[1], ‘base64’), privateKeyBytes, ‘SHA-256’, Buffer.from(data[2]) ); aesKey = Buffer.from(aesKeyBuffer).toString(‘base64’); // console.log(aesKey); const newUserConfig = {clientId: data[3], aesKey: aesKey, privateKey: data[0], sessionId: data[2], clientSecret: “do not need”, assetPin: data[4]}; // console.log(newUserConfig); const newUserClient = new HttpClient(newUserConfig); if ( args.type === TYPE_ASSETS_INFO ) { const assetsInfo = await newUserClient.getUserAssets(); console.log(assetsInfo); } else if (args.type === TYPE_BITCOIN_INFO) { // console.log(‘You choice to 1:’, args); const assetInfo = await newUserClient.getUserAsset(BTC_ASSET_ID); console.log(“Bitcoin address is “, assetInfo.public_key); console.log(“Bitcoin balance is “, assetInfo.balance); console.log(“Bitcoin price is (USD) “, assetInfo.price_usd);查询ExinCore市场的价格信息如何来查询ExinCore市场的价格信息呢?你要先了解你交易的基础币是什么,如果你想买比特币,卖出USDT,那么基础货币就是USDT;如果你想买USDT,卖出比特币,那么基础货币就是比特币. if ( args.type === TYPE_FETCH_USDT_MARKETINFO ) { // Make a request var instance = axios.create({ baseURL: ‘https://exinone.com/exincore/markets', timeout: 3000, headers: {‘X-Custom-Header’: ‘foobar’} }); instance.get(’?base_asset=’ + USDT_ASSET_ID) .then(function(response) { console.log(response.data.data); }); } else if ( args.type === TYPE_FETCH_BTC_MARKETINFO ) { var instance = axios.create({ baseURL: ‘https://exinone.com/exincore/markets', timeout: 3000, headers: {‘X-Custom-Header’: ‘foobar’} }); instance.get(’?base_asset=’ + BTC_ASSET_ID) .then(function(response) { console.log(response.data.data); }); }交易前,创建一个Memo!在第二章里,基于Mixin Network的 Nodejs 比特币开发教程: 机器人接受比特币并立即退还用户, 我们学习过退还用户比特币,在这里,我们除了给ExinCore支付币外,还要告诉他我们想购买的币是什么,即将想购买的币存到memo里。const bytes = Buffer.from( BTC_ASSET_ID.replace(/-/g, ‘’), ‘hex’);const memo = msgpack .encode({ A: bytes, }) .toString(‘base64’);console.log(memo);币币交易的完整流程转币给ExinCore时,将memo写入你希望购买的币,否则,ExinCore会直接退币给你!如果你想卖出比特币买入USDT,调用方式如下:const EXIN_BOT = “61103d28-3ac2-44a2-ae34-bd956070dab1”;const BTC_ASSET_ID = “c6d0c728-2624-429b-8e0d-d9d19b6592fa”;const EOS_ASSET_ID = “6cfe566e-4aad-470b-8c9a-2fd35b49c68d”;const USDT_ASSET_ID = “815b0b1a-2764-3736-8faa-42d694fa620a”;//change to your third exchange/cold btc wallet addressconst BTC_WALLET_ADDR = “14T129GTbXXPGXXvZzVaNLRFPeHXD1C25C”;const EOS_WALLET_NAME = “huobideposit”;const EOS_WALLET_TAG = “1872050”;//change to your mixin messenger account ’s uuidconst MASTER_UUID = “0b4f49dc-8fb4-4539-9a89-fb3afc613747”;else if ( args.type === TYPE_EXCHANGE_BTC_USDT ) { // Pack memo const bytes = Buffer.from( USDT_ASSET_ID.replace(/-/g, ‘’), ‘hex’ ); const memo = msgpack .encode({ A: bytes, }) .toString(‘base64’); console.log(memo); // gaFBxBDG0McoJiRCm44N2dGbZZL6 const assetInfo = await newUserClient.getUserAsset(BTC_ASSET_ID); console.log(“The Wallet ’s BTC balance is “, assetInfo.balance); if ( assetInfo.balance >= 0.0001 ) { const Obj = { assetId: BTC_ASSET_ID, recipientId: EXIN_BOT, traceId: newUserClient.getUUID(), amount: “0.0001”, memo: memo, } console.log(Obj); newUserClient.transferFromBot(Obj); } else { console.log(“Not enough BTC!”); }}如果你想卖出USDT买入比特币,调用方式如下:else if ( args.type === TYPE_EXCHANGE_USDT_BTC ) { // Pack memo const bytes = Buffer.from( BTC_ASSET_ID.replace(/-/g, ‘’), ‘hex’ ); const memo = msgpack .encode({ A: bytes, }) .toString(‘base64’); console.log(memo); const assetInfo = await newUserClient.getUserAsset(USDT_ASSET_ID); console.log(“The Wallet ’s BTC balance is “, assetInfo.balance); if ( assetInfo.balance >= 1 ) { const Obj = { assetId: USDT_ASSET_ID, recipientId: EXIN_BOT, traceId: newUserClient.getUUID(), amount: “1”, memo: memo, } console.log(Obj); newUserClient.transferFromBot(Obj); } else { console.log(“Not enough USDT!”); }}交易完成后,Exincore会将你需要的币转到你的帐上,同样,会在memo里,记录成交价格,交易费用等信息!你只需要按下面的方式解开即可!getSnapshots 读取钱包的交易记录。if ( args.type === TYPE_READ_SNAPSHOTS ) { const prompts = [ { name: ‘datetime’, type: ‘input’, message: “Input iso8601 datetime: “, }, ]; const answers = await inquirer.prompt(prompts); console.log(answers); console.log(encodeURIComponent(answers.datetime)); const snapshots = await newUserClient.getSnapshots({ limit: 10, asset: USDT_ASSET_ID, offset: answers.datetime, order: “ASC”}); // console.log(snapshots); snapshots.forEach(function(element) { if ( element.amount > 0) { if ( element.data != null ) { console.log(element.amount); console.log(element.data); const buf = Buffer.from(element.data, ‘base64’); console.log(msgpack.decode(buf)); const codeInt = msgpack.decode(buf).C; if ( codeInt === 1000 ) { console.log(“Successful Exchange”); } else { console.log(“Go to there get more info https://github.com/exinone/exincore#code error code: " + codeStr);} const hexStr = Buffer.from(msgpack.decode(buf).FA).toString(‘hex’); const uuid = ${hexStr.slice(0,8)}-${hexStr.slice(8,12)}-${hexStr.slice(12,16)}-${hexStr.slice(16,20)}-${hexStr.slice(20)}; console.log(“Asset uuid is :” + uuid); const priceStr = msgpack.decode(buf).P; console.log(“Price is :” + priceStr); const feeStr = msgpack.decode(buf).F; console.log(“Fee is :” + feeStr); console.log(“percent of Fee is :” + (feeStr/element.amount)* 100 + " %”); const tStr = msgpack.decode(buf).T; console.log(“T is :” + tStr); } } });}一次成功的交易如下:Make your choose 16: Read snapshotsYou choice to : { type: ‘16: Read snapshots’ }You wallet is : 0b10471b-1aed-3944-9eda-5ab947562761? Input iso8601 datetime: 2019-04-08T05:16:33.615253Z{ datetime: ‘2019-04-08T05:16:33.615253Z’ }2019-04-08T05%3A16%3A33.615253Z0.5228004hqFDzQPooVCnNTI0OC45OKFGqTAuMDAxMDQ5OKJGQcQQgVsLGidkNzaPqkLWlPpiCqFUoVKhT8QQeJyt3MrqSGOpbqzFXy5JUw=={ C: 1000, P: ‘5248.98’, F: ‘0.0010498’, FA: <Buffer 81 5b 0b 1a 27 64 37 36 8f aa 42 d6 94 fa 62 0a>, T: ‘R’, O: <Buffer 78 9c ad dc ca ea 48 63 a9 6e ac c5 5f 2e 49 53> }Successful ExchangeAsset uuid is :815b0b1a-2764-3736-8faa-42d694fa620aPrice is :5248.98Fee is :0.0010498percent of Fee is :0.2008032128514056 %T is :R You select the : 0b10471b-1aed-3944-9eda-5ab947562761You select the wallet 0b10471b-1aed-3944-9eda-5ab947562761读取币的余额通过读取币的余额,来确认交易情况!if (args.type === TYPE_BITCOIN_INFO) { // console.log(‘You choice to 1:’, args); const assetInfo = await newUserClient.getUserAsset(BTC_ASSET_ID); console.log(“Bitcoin address is “, assetInfo.public_key); console.log(“Bitcoin balance is “, assetInfo.balance); console.log(“Bitcoin price is (USD) “, assetInfo.price_usd);}源代码执行编译执行,即可开始交易了.[x] node bitcoin-wallet-nodejs.js 编译项目.本代码执行时的命令列表:Make your choose(select the uuid for open the specified wallet): 0b10471b-1aed-3944-9eda-5ab947562761 You select the : 0b10471b-1aed-3944-9eda-5ab947562761You select the wallet 0b10471b-1aed-3944-9eda-5ab947562761?Make your choose (Use arrow keys)0: Read All Asssets Balance1: Read Bitcoin Balance & Address2: Read USDT Balance & Address3: Read EOS Balance & Address4: Transfer BTC from Bot to Wallet5: Transfer EOS from Bot to Wallet6: Transfer BTC from Wallet to Master7: Transfer EOS from Wallet to Master8: Verify Wallet PIN9: BTC withdraw10: EOS withdraw11: Fetch BTC withdrawal info12: Fetch EOS withdrawal info13: Fetch USDT Market info14: Fetch BTC Market info14: Transfer 0.0001 BTC buy USDT15: Transfer USDT $1 buy BTC16: Read snapshotsExit完整代码Solution Two: List your order on Ocean.One exchange ...

April 10, 2019 · 4 min · jiezi

Nodejs 比特币开发教程: 创建比特币钱包

基于Mixin Network的 Nodejs 比特币开发教程: 创建比特币钱包我们已经创建过一个回复消息的机器人和一个能自动支付比特币的机器人.通过本教程的学习,你可以学到如下内容如何创建一个比特币钱包.如何读取比特币钱包的余额.如何支付比特币并即时确认.如何将Mixin Network的比特币提现到你的冷钱包或第三方交易所.前期准备:你要有一个Mixin Network账户。下面的代码创建一个帐号,并写到csv文件里。console.log(“create wallet ….”);const { generateKeyPairSync } = require(‘crypto’);const { publicKey, privateKey } = generateKeyPairSync(‘rsa’,{ modulusLength: 1024, // the length of your key in bits publicKeyEncoding: { type: ‘spki’, // recommended to be ‘spki’ by the Node.js docs format: ‘pem’ }, privateKeyEncoding: { type: ‘pkcs1’, // recommended to be ‘pkcs8’ by the Node.js docs format: ‘pem’, //cipher: ‘aes-256-cbc’, // optional //passphrase: ’top secret’ // optional }});publicKey1 = publicKey.replace("—–BEGIN PUBLIC KEY—–","");publicKey2 = publicKey1.replace("—–END PUBLIC KEY—–","");publicKey3 = publicKey2.replace(/\r?\n|\r/g, “”);console.log(publicKey);console.log(publicKey3);(async () => { const info = await clientBot.createUser({full_name : “nodejs bitcoin wallet”, session_secret: publicKey3, });上面的语句会在本地创建一个RSA密钥对,然后调用Mixin Network来创建帐号,最后保存帐号信息到csv文件. let aesKey = ‘’; const privateKeyBytes = pem.decode(Buffer.from(privateKey)); const aesKeyBuffer = await oaepDecrypt( Buffer.from(info.pin_token, ‘base64’), privateKeyBytes, ‘SHA-256’, Buffer.from(info.session_id) ); aesKey = Buffer.from(aesKeyBuffer).toString(‘base64’); console.log(aesKey); var csvStream = csv.createWriteStream({headers: false, ignoreEmpty: true}), writableStream = fs.createWriteStream(WalletName, {flags: ‘a’}); writableStream.on(“finish”, function(){ console.log(“Bitcoin wallet DONE!”); }); csvStream.pipe(writableStream); csvStream.write({a: privateKey, b: info.pin_token, c: info.session_id, d: info.user_id, e: “123456”} ); csvStream.end(); fs.appendFile(WalletName, require(“os”).EOL, function(){}); const newUserConfig = {clientId: info.user_id, aesKey: aesKey, privateKey: privateKey, sessionId: info.session_id, clientSecret: “do not need”, assetPin: “123456”}; console.log(newUserConfig); const newUserClient = new HttpClient(newUserConfig); var info2 = await newUserClient.updatePin({oldPin : “”, newPin: “123456”, }); console.log(info2); const verifyPin = await newUserClient.verifyPin(“123456”); console.log({ verifyPin });现在你需要小心保管好你的帐号信息,在读取该账户的比特币资产余额或者进行其他操作时,将需要用到这些信息.给新建的帐号创建一个比特币钱包新账号并不默认内置比特币钱包, 现在读一下比特币余额就可以创建一个比特币钱包。 const assetInfo = await newUserClient.getUserAsset(BTC_ASSET_ID); console.log(“Bitcoin address is “, assetInfo.public_key); console.log(“Bitcoin balance is “, assetInfo.balance); console.log(“Bitcoin price is (USD) “, assetInfo.price_usd);创建的帐号的比特币资产详细信息如下,其中public key就是比特币的存币地址: Make your choose(select the uuid for open the specified wallet): 0b10471b-1aed-3944-9eda-5ab947562761 You select the : 0b10471b-1aed-3944-9eda-5ab947562761 You select the wallet 0b10471b-1aed-3944-9eda-5ab947562761 ? Make your choose 1: Read Bitcoin Balance & Address You choice to : { type: ‘1: Read Bitcoin Balance & Address’ } You wallet is : 0b10471b-1aed-3944-9eda-5ab947562761 Bitcoin address is 15MySY7UnA827TRMQWuCKGiogCYXUmt21M Bitcoin balance is 0 Bitcoin price is (USD) 5029.59915767 You select the : 0b10471b-1aed-3944-9eda-5ab947562761 You select the wallet 0b10471b-1aed-3944-9eda-5ab947562761这个API能够提供若干与比特币有关的信息:存币地址:[public_key]Logo: [icon_url]资产名字:[name]资产在Mixin Network的uuid: [asset_key]对美元的价格(Coinmarketcap.com提供): [price_usd]存币时确认的区块数量:[confirmations]比特币私钥呢?比特币的私钥呢?这个私钥被Mixin Network通过多重签名保护,所以对用户来说是不可见的,比特币资产的提现和转账都需要用户提供正确的的RSA签名,PIN代码与会话密钥才能完成.不只是比特币,还有以太坊,EOS等这个帐号不只支持比特币,还支持以太坊,EOS等, 完整的区块链支持列表. 这个账户同时也支持所有的 ERC20 代币与 EOS 代币.创建其它的币的钱包与创建比特币钱包过程一样,读对应的资产余额就可以.Mixin Network 当前支持的加密货币 (2019-02-19)cryptouuid in Mixin NetworkEOS6cfe566e-4aad-470b-8c9a-2fd35b49c68dCNB965e5c6e-434c-3fa9-b780-c50f43cd955cBTCc6d0c728-2624-429b-8e0d-d9d19b6592faETC2204c1ee-0ea2-4add-bb9a-b3719cfff93aXRP23dfb5a5-5d7b-48b6-905f-3970e3176e27XEM27921032-f73e-434e-955f-43d55672ee31ETH43d61dcd-e413-450d-80b8-101d5e903357DASH6472e7e3-75fd-48b6-b1dc-28d294ee1476DOGE6770a1e5-6086-44d5-b60f-545f9d9e8ffdLTC76c802a2-7c88-447f-a93e-c29c9e5dd9c8SC990c4c29-57e9-48f6-9819-7d986ea44985ZENa2c5d22b-62a2-4c13-b3f0-013290dbac60ZECc996abc9-d94e-4494-b1cf-2a3fd3ac5714BCHfd11b6e3-0b87-41f1-a41f-f0e9b49e5bf0EOS的存币地址与其它的币有些不同,它由两部分组成: account_name and account tag, 如果你向Mixin Network存入EOS,你需要填两项数据: account name 是eoswithmixin,备注里输入你的account_tag,比如0aa2b00fad2c69059ca1b50de2b45569.EOS的资产余额返回结果如下: Make your choose 3: Read EOS Balance & Address You choice to : { type: ‘3: Read EOS Balance & Address’ } You wallet is : 0b10471b-1aed-3944-9eda-5ab947562761 EOS account name is eoswithmixin tag is 30f0c36057b9b22151173b309bd0d79c EOS balance is 0 EOS price is (USD) 5.26225922 You select the : 0b10471b-1aed-3944-9eda-5ab947562761 You select the wallet 0b10471b-1aed-3944-9eda-5ab947562761存入比特币与读取比特币余额现在,你可以向比特币的钱包存币了。当然,在比特币网络里转币,手续费是相当贵的,费用的中位数在0.001BTC,按当前4000美元的价格,在4美元左右,有一个方便的办法,如果你有Mixin Messenger帐号,里面并且有比特币的话,可以直接提现比特币到新创建的帐号的比特币充值地址,它们在同一个Mixin Network网络内,手续费为0,而且1秒到账。下面的代码,可以读取比特币钱包余额. const assetInfo = await newUserClient.getUserAsset(BTC_ASSET_ID); console.log(“Bitcoin address is “, assetInfo.public_key); console.log(“Bitcoin balance is “, assetInfo.balance); console.log(“Bitcoin price is (USD) “, assetInfo.price_usd);Mixin Network网内免手续费的,并且即时确认任何币在Mixin Network内部的交易,都是无手续费的,并且立刻到账。前期准备: 账户设置了PIN对于新创建的帐号,我们通过updatePin来设置新PIN码, 代码如下: var info2 = await newUserClient.updatePin({oldPin : “”, newPin: “123456”, }); console.log(info2); const verifyPin = await newUserClient.verifyPin(“123456”); console.log({ verifyPin });Mixin Network帐号之间的比特币支付通过Mixin Messenger,我们可以先转比特币给机器人,然后让机器人转币给新用户。 const assetInfo = await newUserClient.getUserAsset(EOS_ASSET_ID); console.log(“The Wallet ’s EOS balance is “, assetInfo.balance); if ( assetInfo.balance > 0 ) { const Obj = { assetId: BTC_ASSET_ID, recipientId: MASTER_UUID, traceId: newUserClient.getUUID(), amount: assetInfo.balance, memo: ‘’, }; console.log(Obj); newUserClient.transferFromBot(Obj); }读取Bitcoin的余额,来确认比特币是不是转成功了! 注意newUserClient是新用户的。 const assetInfo = await newUserClient.getUserAsset(BTC_ASSET_ID); console.log(“Bitcoin address is “, assetInfo.public_key); console.log(“Bitcoin balance is “, assetInfo.balance);如何将比特币存入你的冷钱包或者第三方交易所如果你希望将币存入你的冷钱包或者第三方交易所, 先要得到冷钱包或者你在第三方交易所的钱包地址,然后将钱包地址提交到Mixin Network.要点提示: 提现是需要支付收续费的,准备好比特币包地址!增加目的钱包地址到Mixin Network调用createAddress API, 将会返回一个address_id,下一步的提现操作会用到这个id。 const withdrawAddress = await newUserClient.createWithdrawAddress({ assetId: BTC_ASSET_ID, label: ‘BTC withdraw’, publicKey: BTC_WALLET_ADDR, });这里的 14T129GTbXXPGXXvZzVaNLRFPeHXD1C25C 就是一个比特币钱包地址, 如下所示,提现费用是0.0025738 BTC, address_id 是"345855b5-56a5-4f3b-ba9e-d99601ef86c1”.Make your choose 9: BTC withdrawYou choice to : { type: ‘9: BTC withdraw’ }You wallet is : 0b10471b-1aed-3944-9eda-5ab947562761{ type: ‘address’, address_id: ‘a513da38-a18a-4536-abe4-d1c29ca3a1a8’, asset_id: ‘c6d0c728-2624-429b-8e0d-d9d19b6592fa’, public_key: ‘14T129GTbXXPGXXvZzVaNLRFPeHXD1C25C’, label: ‘BTC withdraw’, account_name: ‘’, account_tag: ‘’, fee: ‘0.00212232’, reserve: ‘0’, dust: ‘0.0001’, updated_at: ‘2019-04-04T02:20:42.552274992Z’ }? Input you BTC amount:创建提现地址成功后,你可以用readAddress读取最新的提现费。 const addressList = await newUserClient.getWithdrawAddress(BTC_ASSET_ID); console.log(addressList);提交提现请求,Mixin Network会即时处理提现请求.提交提现请求到 Mixin Network, withdrawAddress.address_id 就是createAddress创建的。 console.log(withdrawAddress); const prompts = [ { name: ‘amount’, type: ‘input’, message: “Input you BTC amount: “, }, ]; const answers = await inquirer.prompt(prompts); console.log(answers); const withdrawResult = await newUserClient.withdraw({ addressId: withdrawAddress.address_id, assetId: BTC_ASSET_ID, amount: answers.amount, memo: ‘withdraw by nodejs’, }); console.log(withdrawResult);可以通过blockchain explore来查看进度.完整的代码在这儿 ...

April 5, 2019 · 3 min · jiezi

一个从基础到实战的学习机会:Go & Rust、分布式数据库系统 | PingCAP Talent Plan

TiDB 每一次微小进步都离不开广大社区小伙伴们的支持,但也有很多同学反映 TiDB 是一个非常复杂的分布式数据库系统,如果没有相关知识和经验积累,在参与之初难免会遇到各种问题。因此我们决定全面升级 PingCAP Talent Plan 计划,为社区小伙伴开放一系列关于编程语言、数据库及分布式系统的线上课程,线上考核成绩优异的小伙伴还有机会参加为期 4 周的线下课程(免费的大神辅导班哦)!什么是 PingCAP Talent PlanPingCAP Talent Plan 是 PingCAP 为 TiDB 开源社区小伙伴提供的进阶式学习计划,以循序渐进的方式,让大家深入了解并掌握 TiDB/TiKV 相关知识及实操技能。去年 11 月我们成功举办了 PingCAP Talent Plan 第一期 线下培训,如今 PingCAP Talent Plan 内容和形式全面升级,整个课程将分为线上&线下两个阶段,从语言层面开始,到数据库、分布式系统基础知识,再到 TiDB/TiKV 架构原理和源码,层层递进,最后让小伙伴们在操作实战中加深理解,掌握实操技能。课程设计整个课程分为两个方向,包括面向 SQL 引擎的 TiDB 方向,面向大规模、一致性的分布式存储的 TiKV 方向。每个方向的课程都包含线上和线下两部分,且有相应的课程作业。大家可以根据兴趣选择一个或多个方向的线上课程学习,而线下课程由于时间冲突,每人每期限选一个方向。线上课程线上课程对社区所有小伙伴们开放,时间上比较灵活。小伙伴们可以在任何一个合适的时间点开始线上学习。我们希望通过线上课程,大家能够对编程语言、数据库及分布式系统的基础知识有一定程度的了解,为学习和掌握 TiDB/TiKV 架构原理和源码打下基础。线上课程学习链接:https://docs.google.com/document/d/1UG0OHuL6l_hHWs3oyT9gA2n7LuYUfV23nmz0tRvXq2k/edit#heading=h.ywlair765ic9注意:因为本期课程设置中参考了一些其他课程(譬如 MIT 6.824),这些课程要求大家不能将自己的作业答案公布到网上,所以不推荐大家公开自己的答案。线上课程中会有对应的作业,你可以尝试解决,加深一下对课程的理解。完成线上课程后,可以将所有作业答案以附件形式发送给我们(记得打包哟~),我们评估之后会尽快给予反馈意见,并为通过考核的小伙伴授予 PingCAP Talent Plan 线上课程结业证书。邮件地址: ts-team@pingcap.com邮件主题:【PingCAP Talent Plan】申请线上课程作业评估+申请人+联系方式。正文:请简单介绍自己(包括姓名、GitHub ID、常用联系方式等)。在校学生需注明所在高校、年级和专业等信息;非在校学生需注明当前就职公司、是否能 full-time 参与 4 周线下课程等。最后附上打包好的课程作业答案,如果你刚好有意向加入我们,附上一份简历就更完美啦~:)线下课程如果你已经完成了线上课程,并且以优异的成绩通过了全部线上考核,恭喜你将有机会参与半年内我们组织的任意一期 PingCAP Talent Plan 线下课程。PingCAP Talent Plan 每年设有三期线下课程,分别在 4-5 月份,7-8 月份以及 11-12 月份,所有线下课程将在 PingCAP 北京总部进行。大家不仅可以与 PingCAP 工程师小伙伴进行面对面的深入沟通,还可以近距离地体验 PingCAP 内部的整个工作流程。PingCAP 会负责大家活动期间的食宿,大家只需要安心集中地学习就可以了:) 第二期线下课程将于 2019 年 4 月 15 日正式开始,目前线下课程学员已集结 80%,他们将聚集在 PingCAP 北京总部,开始为期 4 周的线下课程学习。在 4 月 15 日之前完成线上课程学习的小伙伴依然有机会参与第二期的线下课程哦!温馨提示:由于线下课程需要抽出 4 周左右的时间在 PingCAP 北京总部进行集中学习,所以目前主要面向社区中的学生群体。非学生群体如果能够保证 full-time 参与,也是可以报名的。当大家完成了线下课程和全部课程考核,我们会举办一个充满仪式感的结业答辩,并为顺利结业的小伙伴授予专属的结业证书。结业答辩不仅是对大家学习线下课程活动的一个检查,也是一个让大家进行自我总结和梳理的机会。对于成绩优异的同学,我们还会提供额外的 Bonus 奖励,包括但不限于:PingCAP/TiDB 全球 Meetup 的邀请函(一起看看外面更大的世界)校招/实习 Special Offer(大家一致认可你的能力,可以免面试加入 PingCAP)校招/实习绿色通道(免除笔试小作业和 1-2 轮次的技术面试)PingCAP Talent Plan 线下实战训练营的邀请函(TiDB 也可以有不一样的 Google Summer of Code 哦)年度 TiDB DevCon 邀请函(与 TiDB 社区全球开发者及用户一起享受属于大家的技术盛宴)你将获得什么?由浅入深地逐步了解分布式系统和数据库的基础知识深入了解 TiDB/TiKV 的架构设计原理和源码近距离体验和实践 PingCAP 内部的新人培养体系获得深入参与开发世界级开源项目 TiDB 的实践机会如果你来不及参与第二期 PingCAP Talent Plan 线下课程也不要着急,可以先从第二期线上课程开始学习,完成线上考核后依然有机会参与第三期的线下课程哦~未来第三期的线上课程也会在第二期的基础上进行优化,主要会结合第二期线下实战情况做细微的调整。我们在 PingCAP 等你来! ...

April 4, 2019 · 1 min · jiezi

Python写的比特币和多种加密通货钱包

啥东西一个用python和urwid写的多功能数字货币钱包为什么你需要这个东西透明这是一个开源项目,所有人都可以看代码。安全你持有账户私钥,没人能偷走你的资产。可靠基于一个透明且开源运作的分布式区块链项目 :Mixin Network。主网已经于2019年2月末上线。有用不仅仅能保存比特币,还能保存其他币(Ethereum, EOS, XRP…)。快确认一笔交易只需要1秒钟。保护你的隐私匿名创建账户,匿名交易和付款。强大内置1秒闪兑交易所,可以交易比特币和主流加密资产。交易结束资产回到自己的钱包,不用放在中心化交易所,不担心交易所被攻击。 这是一个开放世界的入口通过开放式交易所可以在买卖任何ERC20 token。你自己创建都可以。有真随机数生成器保证的骰子游戏。安装Python 3:这个钱包基于Python3。macOSbrew upgradebrew install python@3Ubuntu使用第三方源安装python3sudo apt updatesudo apt install software-properties-commonsudo add-apt-repository ppa:deadsnakes/ppa遇到如下提示,敲击EnterPress [ENTER] to continue or Ctrl-c to cancel adding it.更新apt,安装 python3.7, python3.7-venvsudo apt updatesudo apt install python3.7 python3.7-venvsudo ln -s /usr/bin/python3.7 /usr/bin/python3确认python3 和Python3-env$ python3 -VPython 3.7.2下载代码库并且创建env环境git clone https://github.com/awesome-mixin-network/bitcoin-cli-wallet-python.gitcd bitcoin-cli-wallet-pythonpython3 -m venv ./激活环境source ./bin/activate安装依赖包先升级pip,然后安装依赖软件库pip install –upgrade pippip install -r requirements.txt运行代码python Bitcoin_Wallet_Mixin_consoleGUI.py

April 2, 2019 · 1 min · jiezi

@开发者,一份微软官方Github上发布的开源项目清单等你签收

最近在倒腾WPF的项目,试着搜一下微软官方提供的WPF Smaples, 结果找到了https://github.com/Microsoft/….微软Github开源项目入口当你访问网址http://microsoft.github.io>时….微软开源项目受欢迎程度排名打开主页https://opensource.microsoft.com,将排序条件从默认的Trending切换到Stars, 即可看到Star最多的项目,同理Forks是按fork的量排序,AA Name是按项目名字典序排序。还可点击← Previous 或Next →来进行翻页。Visual Studio Code免费开源且十分流行的跨平台代码编辑器,除了代码编辑功能以外,安装插件后还能进行调试,目前已更新到版本v1.3.2. 相比于Atom、Sublime等其他代码编辑器,它拥有最多的扩展插件,最新数据表明它排在所有商业和非商业IDE中位居第6位。还提供代码实时分享的协作开发(Live share)功能。github地址: https://github.com/Microsoft/...TypeScriptTypeScript是一种由微软开发的自由和开源的编程语言。它是JavaScript的一个严格超集,并添加了可选的静态类型和基于类的面向对象编程。C#的首席架构师以及Delphi和Turbo Pascal的创始人安德斯·海尔斯伯格参与了TypeScript的开发。TypeScript设计目标是开发大型应用,然后转译成JavaScript。由于TypeScript是JavaScript的严格超集,任何现有的JavaScript程序都是合法的TypeScript程序。github地址: https://github.com/Microsoft/...RxJSRxJS是JavaScript的Reactive Extensions,它是使用 Observables 的响应式编程的库,它使编写异步或基于回调的代码更容易。该项目是 Reactive-Extensions/RxJS 上一版本的重写,具有更好的性能、更好的模块性、更好的可调试调用堆栈,同时保持大部分向后兼容,只有一些破坏性的变更(breaking changes)是为了减少外层的 API 。中文官网: https://cn.rx.js.org .github地址: Reactive-Extensions/RxJS.NET Core 基础类库此Repo包含.NET Core的库实现(称为“CoreFX”)。 它包括System.Collections,System.IO,System.Xml和许多其他组件。 相应的.NET Core Runtime存储库(称为“CoreCLR”)包含.NET Core的运行时实现。 它包括RyuJIT,.NET GC和许多其他组件。 特定运行时的库代码(System.Private.CoreLib)位于Core CLR Repo中。 它需要与运行时一起构建和版本化。 CoreFX的其余部分与运行时实现无关,可以在任何兼容的.NET运行时(例如CoreRT)上运行。github地址: https://github.com/dotnet/corefxCNTKMicrosoft Cognitive Toolkit(CNTK),一个开源的深度学习工具包github地址: Microsoft/CNTKMicrosoft calculatorWindows计算器:Windows自带的一个简单但功能强大的计算器 (Win10上的UWP计算器)github地址: Microsoft/calculatorMonaco editor基于浏览器的代码编辑器.在线试用:https://microsoft.github.io/monaco-editor/playground.htmlgithub地址: Microsoft/monaco-editorMS-DOSMS-DOS 1.25和2.0的原始资源,供参考。github地址: Microsoft/MS-DOSRedis windows版由于Redis官方没推出Windows版,微软自己基于Redis官方的Linux版的部分特性做了一个Windows版。Redis windows版是一个内存数据库,可以在磁盘上保留。 数据模型是键值,但支持许多不同类型的值:字符串,列表,集,排序集,哈希值.github地址: MicrosoftArchive/redis.NET Core CLR (公共语言运行时)CoreCLR,是 .NET Core 的执行引擎,包括 RynJIT、.NET GC、原生 interop 和其他 .NET 运行时组件。当你在 .NET Core 上运行 ASP.NET 5 应用时,CoreCLR 用来执行你的代码,这还需要依赖于 CoreFX/BCL 库。微软称在开源和跨平台 .NET 运行时环境这项工作上将会有几个额外的里程碑。github地址: https://github.com/dotnet/cor...ASP.NET CoreASP.NET Core 是新一代的 ASP.NET,早期称为 ASP.NET vNext,并且在推出初期命名为 ASP.NET 5,但随着 .NET Core 的成熟,以及 ASP.NET 5 的命名会使得外界将它视为 ASP.NET 的升级版,但它其实是新一代从头开始打造的 ASP.NET 核心功能,因此微软宣布将它改为与 .NET Core 同步的名称,即 ASP.NET Core。ASP.NET Core 可运行于 Windows 平台以及非 Windows 平台,如 Mac OSX 以及 Ubuntu Linux 操作系统,是 Microsoft 第一个具有跨平台能力的 Web 开发框架。微软在一开始开发时就将 ASP.NET Core 开源,因此它也是开源项目的一员,由 .NET 基金会 (.NET Foundation) 所管理。github地址: https://github.com/aspnet/Asp...Entity Framework CoreEntity Framework Core 是微软新一代的对象关系对应 (ORM) 框架,以 .NET Core 实现,不过它是归属于 ASP.NET Core 项目的一部分,在 ASP.NET Core 开始开发时就被列入标准功能,与现行的 Entity Framework 一样,是微软官方建议使用的数据访问功能,但 .NET Core 成功移植 ADO.NET 基类库 System.Data 之后,开发人员仍能使用 ADO.NET 作为数据访问的解决方案。github地址: https://github.com/aspnet/Ent...PowerShellPowerShell(包括Windows PowerShell and PowerShell Core)是微软公司开发的任务自动化和配置管理框架,由.NET Framework和.NET Core是构建的命令行界面壳层相关脚本语言组成,最初仅Windows组件,后于2016年8月18日开源并跨平台支持。在PowerShell中,管理任务通常由cmdlets(发音为command-lets)执行,这是执行特定操作的专用.NET类。可以将cmdlet集合至脚本、可执行文件(一般是独立应用程序)中,或通过常规.NET类(或WMI / COM对象)实例化。通过访问不同数据存储中的数据由PowerShell运行,如资源管理器或注册表。PowerShell Core可很好地与现有工具配合使用, 并针对处理结构化数据 (例如 json、csv、xml 等)、REST API 和对象模型进行了优化。github地址: https://github.com/PowerShell…如何在其中搜索自己需要的项目由于主页https://opensource.microsoft.com提供了搜索功能,只需在Search repos…的地方输入关键字即可。比如我需要搜索wpf相关的,在该处输入wpf。此时发现地址栏的网址已变成https://opensource.microsoft…..搜索结果为:同上,此处也可切换排序条件,点击← Previous 或Next →来进行翻页。GitHub-邮件订阅事实上,微软开源项目是使用Github pages来管理的。根据Github pages的规则,默认设置下Github pages访问页http://microsoft.github.io>对…. 使用Github pages搭建过个人博客的人都应该深知这一点。在github上登录个人账号之后,只需点Watching, 选择"Be notified of all conversions"即可,一旦github上有更新,会在Email中收到通知Rss订阅本人使用工具https://fivefilters.org/conte…推荐使用Feedly来订阅,这样一来,只要https://opensource.microsoft.com的列表里出现新项目,你进feedly就能看到了其他 microsoft.github.io上有用的链接Windows on Github https://microsoft.github.io/w...Microsoft Days in the Web https://microsoft.github.io/f...Project Mu https://microsoft.github.io/mu/PowerBI Custom Visuals https://microsoft.github.io/P...Microsoft Technical Case Studies https://microsoft.github.io/t...Microsoft Open Source Code of Conduct https://microsoft.github.io/c...Embedded Learning Library (ELL) https://microsoft.github.io/ELL/A library for building cross-platform apps - ReactXP https://microsoft.github.io/r...PartsUnlimited https://microsoft.github.io/P...PartsUnlimitedMRP https://microsoft.github.io/P...CodePush https://microsoft.github.io/c...Microsoft PROSE SDK https://microsoft.github.io/p...Create extensions for Visual Studio https://microsoft.github.io/e...DSCEA https://microsoft.github.io/D...IoT kit built for the cloud https://microsoft.github.io/a…如果有问题,欢迎留言交流本文首发于笔者的博客园博客,如需转载请注明,谢谢配合 ...

March 31, 2019 · 2 min · jiezi

通过 C# 买卖Bitcoin

方案一: 通过ExinCore API进行币币交易Exincore 提供了基于Mixin Network的币币交易API.你可以支付USDT给ExinCore, ExinCore会以最低的价格,最优惠的交易费将你购买的比特币转给你, 每一币交易都是匿名的,并且可以在区块链上进行验证,交易的细节只有你与ExinCore知道!ExinCore 也不知道你是谁,它只知道你的UUID.预备知识:你先需要创建一个机器人, 方法在 教程一.安装依赖包正如教程一里我们介绍过的, 我们需要依赖 mixin-csharp-sdk, 你应该先安装过它了, 这儿我们再安装 MsgPack.Cli 软件包. dotnet add package MixinCSharpSdk dotnet add package MsgPack.Cli –version 1.0.1充币到 Mixin Network, 并读出它的余额.通过ExinCore API, 可以进行BTC, USDT, EOS, ETH 等等交易, 此处演示用 USDT购买BTC 或者 用BTC购买USDT。交易前,先检查一下钱包地址。完整的步骤如下:检查比特币或USDT的余额,钱包地址。并记下钱包地址。从第三方交易所或者你的冷钱包中,将币充到上述钱包地址。再检查一下币的余额,看到帐与否。(比特币的到帐时间是5个区块的高度,约100分钟)。比特币与USDT的充值地址是一样的。 MixinApi mixinApiNewUser = new MixinApi(); mixinApiNewUser.Init(UserIDNewUser, “”, SessionIDNewUser, PinTokenNewUser, PrivateKeyNewUser); Asset AssetBTC = mixinApiNewUser.ReadAsset(USRCONFIG.ASSET_ID_BTC); Console.WriteLine(“New User " + UserIDNewUser + " ’s BTC balance is " + AssetBTC.balance); Console.WriteLine(“New User " + UserIDNewUser + " ’s BTC address is " + AssetBTC.public_key);查询ExinCore市场的价格信息如何来查询ExinCore市场的价格信息呢?你要先了解你交易的基础币是什么,如果你想买比特币,卖出USDT,那么基础货币就是USDT;如果你想买USDT,卖出比特币,那么基础货币就是比特币.string jsonData = FetchMarketPrice(“815b0b1a-2764-3736-8faa-42d694fa620a”);var marketObj = JsonConvert.DeserializeObject<MarketInfo>(jsonData);foreach (AssetInfo value in marketObj.data){ Console.WriteLine(value);}public class MarketInfo{ public string code { get; set; } public string message { get; set; } public List<AssetInfo> data { get; set; } public override string ToString() { return JsonConvert.SerializeObject(this); }}public class AssetInfo{ public string base_asset { get; set; } public string base_asset_symbol { get; set; } public string exchange_asset_symbol { get; set; } public string price { get; set; } public string minimum_amount { get; set; } public string maximum_amount { get; set; } public List<string> exchanges { get; set; } public override string ToString() { return JsonConvert.SerializeObject(this); }}public static string FetchMarketPrice(string asset_id){ return FetchMarketPriceAsync(asset_id).Result;}public static async Task<string> FetchMarketPriceAsync(string asset_id){ HttpClient client = new HttpClient(); // Call asynchronous network methods in a try/catch block to handle exceptions try { HttpResponseMessage response = await client.GetAsync(“https://exinone.com/exincore/markets?base_asset=" + asset_id); response.EnsureSuccessStatusCode(); string responseBody = await response.Content.ReadAsStringAsync(); // Above three lines can be replaced with new helper method below // string responseBody = await client.GetStringAsync(uri); Console.WriteLine(responseBody); return responseBody; } catch(HttpRequestException e) { Console.WriteLine("\nException Caught!”); Console.WriteLine(“Message :{0} “,e.Message); } return null;}交易前,创建一个Memo!在第二章里,基于Mixin Network的 C# 比特币开发教程: 机器人接受比特币并立即退还用户, 我们学习过退还用户比特币,在这里,我们除了给ExinCore支付币外,还要告诉他我们想购买的币是什么,即将想购买的币存到memo里。private static string TargetAssetID(string asset_id) { Guid guid = new Guid(asset_id); var gbytes = guid.ToByteArray(); Array.Reverse(gbytes,0,4); Array.Reverse(gbytes,4,2); Array.Reverse(gbytes,6,2); var serializer = MessagePackSerializer.Get(gbytes.GetType()); var stream = new MemoryStream(); serializer.Pack(stream, gbytes); return Convert.ToBase64String(stream.ToArray());}币币交易的完整流程转币给ExinCore时,将memo写入你希望购买的币,否则,ExinCore会直接退币给你!如果你想卖出比特币买入USDT,调用方式如下://config.cspublic static string EXIN_BOT = “61103d28-3ac2-44a2-ae34-bd956070dab1”;// public static string EXIN_BOT = “0b1a2027-4fd6-3aa0-b3a3-814778bb7a2e”;public static string MASTER_UUID = “0b4f49dc-8fb4-4539-9a89-fb3afc613747”;public static string ASSET_ID_BTC = “c6d0c728-2624-429b-8e0d-d9d19b6592fa”;public static string ASSET_ID_EOS = “6cfe566e-4aad-470b-8c9a-2fd35b49c68d”;public static string ASSET_ID_USDT= “815b0b1a-2764-3736-8faa-42d694fa620a”;//Program.csif (cmd == “5” ) { var memo = TargetAssetID(USRCONFIG.ASSET_ID_USDT); Console.WriteLine(memo); using (TextReader fileReader = File.OpenText(@“mybitcoin_wallet.csv”)) { var csv = new CsvReader(fileReader); csv.Configuration.HasHeaderRecord = false; while (csv.Read()) { string PrivateKeyNewUser; csv.TryGetField<string>(0, out PrivateKeyNewUser); string PinTokenNewUser; csv.TryGetField<string>(1, out PinTokenNewUser); string SessionIDNewUser; csv.TryGetField<string>(2, out SessionIDNewUser); string UserIDNewUser; csv.TryGetField<string>(3, out UserIDNewUser); string PinNewUser; csv.TryGetField<string>(4, out PinNewUser); MixinApi mixinApiNewUser = new MixinApi(); mixinApiNewUser.Init(UserIDNewUser, “”, SessionIDNewUser, PinTokenNewUser, PrivateKeyNewUser); // Console.WriteLine(mixinApiNewUser.CreatePIN(””, “123456”).ToString()); Transfer reqInfo = mixinApiNewUser.Transfer(USRCONFIG.ASSET_ID_BTC, USRCONFIG.EXIN_BOT, “0.0001”, PinNewUser.ToString(), System.Guid.NewGuid().ToString(), memo); Console.WriteLine(reqInfo); } }}如果你想卖出USDT买入比特币,调用方式如下:if (cmd == “6” ) { var memo = TargetAssetID(USRCONFIG.ASSET_ID_BTC); Console.WriteLine(memo); using (TextReader fileReader = File.OpenText(@“mybitcoin_wallet.csv”)) { var csv = new CsvReader(fileReader); csv.Configuration.HasHeaderRecord = false; while (csv.Read()) { string PrivateKeyNewUser; csv.TryGetField<string>(0, out PrivateKeyNewUser); string PinTokenNewUser; csv.TryGetField<string>(1, out PinTokenNewUser); string SessionIDNewUser; csv.TryGetField<string>(2, out SessionIDNewUser); string UserIDNewUser; csv.TryGetField<string>(3, out UserIDNewUser); string PinNewUser; csv.TryGetField<string>(4, out PinNewUser); MixinApi mixinApiNewUser = new MixinApi(); mixinApiNewUser.Init(UserIDNewUser, “”, SessionIDNewUser, PinTokenNewUser, PrivateKeyNewUser); // Console.WriteLine(mixinApiNewUser.CreatePIN(””, “123456”).ToString()); Transfer reqInfo = mixinApiNewUser.Transfer(USRCONFIG.ASSET_ID_USDT, USRCONFIG.EXIN_BOT, “1”, PinNewUser.ToString(), System.Guid.NewGuid().ToString(), memo); Console.WriteLine(reqInfo); } }}交易完成后,Exincore会将你需要的币转到你的帐上,同样,会在memo里,记录成交价格,交易费用等信息!你只需要按下面的方式解开即可!NetworkSnapshots 读取钱包的交易记录。using (TextReader fileReader = File.OpenText(@“mybitcoin_wallet.csv”)){ var csv = new CsvReader(fileReader); csv.Configuration.HasHeaderRecord = false; while (csv.Read()) { string PrivateKeyNewUser; csv.TryGetField<string>(0, out PrivateKeyNewUser); string PinTokenNewUser; csv.TryGetField<string>(1, out PinTokenNewUser); string SessionIDNewUser; csv.TryGetField<string>(2, out SessionIDNewUser); string UserIDNewUser; csv.TryGetField<string>(3, out UserIDNewUser); string PinNewUser; csv.TryGetField<string>(4, out PinNewUser); MixinApi mixinApiNewUser = new MixinApi(); mixinApiNewUser.Init(UserIDNewUser, “”, SessionIDNewUser, PinTokenNewUser, PrivateKeyNewUser); // Console.WriteLine(mixinApiNewUser.CreatePIN("", “123456”).ToString()); var snaps = mixinApiNewUser.NetworkSnapshots(10,“2019-03-26T01:49:52.462741863Z”, “815b0b1a-2764-3736-8faa-42d694fa620a”, “ASC”,true); // Console.WriteLine(snaps); foreach (var sn in snaps) { if ( Convert.ToDouble(sn.amount) > 0 ) { if ( sn.data != null ) { var memoBytes = Convert.FromBase64String(sn.data); var memoObj = MessagePackSerializer.UnpackMessagePackObject(memoBytes); Console.WriteLine(memoObj.ToString()); var xR = JsonConvert.DeserializeObject<ExchangeResult>(memoObj.ToString()); Console.WriteLine(xR.C); if (xR.C == “1000”) { Console.WriteLine("———–Successfully–Exchange————-"); Console.WriteLine(“You got " + sn.amount.ToString() + " back!”); Console.WriteLine(“Price is " + xR.P + " Fee is " + xR.F + " Percent of fee: " + Convert.ToDouble(xR.F)/Convert.ToDouble(sn.amount)*100 + " %”); Console.WriteLine(“Fee Asset uuid: " + HexStringToUUID(xR.FA)); Console.WriteLine(“trace uuid: " + HexStringToUUID(xR.O)); Console.WriteLine(”———-end of snapshots query————–”); } } } } }}一次成功的交易如下:———–Successfully–Exchange————-You got 0.3923244 back!Price is 3938.62 Fee is 0.0007878 Percent of fee: 0.200803212851406 %Fee Asset uuid: 815b0b1a-2764-3736-8faa-42d694fa620atrace uuid: 1a3d8561-26e7-49bb-8ae3-ed85ce2bb957———-end of snapshots query————–读取币的余额通过读取币的余额,来确认交易情况! MixinApi mixinApiNewUser = new MixinApi(); mixinApiNewUser.Init(UserIDNewUser, “”, SessionIDNewUser, PinTokenNewUser, PrivateKeyNewUser); Asset AssetBTC = mixinApiNewUser.ReadAsset(USRCONFIG.ASSET_ID_BTC); Console.WriteLine(“New User " + UserIDNewUser + " ’s BTC balance is " + AssetBTC.balance); Console.WriteLine(“New User " + UserIDNewUser + " ’s BTC address is " + AssetBTC.public_key);源代码执行编译执行,即可开始交易了.[x] dotnet build 编译项目.[x] dotnet bin/Debug/netcoreapp2.2/bitcoin_wallet.dll 运行它.本代码执行时的命令列表:1: Create Bitcoin Wallet and update PIN2: Read Bitcoin balance & address3: Read USDT balance & address4: Read EOS balance & address5: pay 0.0001 BTC buy USDT6: pay $1 USDT buy BTC7: Read Snapshots8: Fetch market price(USDT)9: Fetch market price(BTC)v: Verify Wallet Pinq: ExitMake your choose:完整代码Solution Two: List your order on Ocean.One exchange ...

March 31, 2019 · 4 min · jiezi

Linux基金会开源领袖峰会2019年幻灯片(pdf)

Linux基金会举办的开源领袖峰会(Open Source Leadership Summit)是一个亲密的、仅限邀请的活动,促进了开放技术开发领域的领先项目和企业之间的创新、发展和合作关系。对于希望推进开源策略、实施和投资的业务和技术领导者来说,这是必须参加的。与会者包括:使用开源软件并与业内其他人共享研发的组织的高管、业务和开源项目办公室负责人负责组织内关键项目或开源策略的技术负责人需要跟领导技术和执行领导层,分享最佳实践和策略以实现最大创新的开源组织和项目负责人今年精彩内容的幻灯片在活动结束后的一周内,在演讲者提供的情况下会陆续发布到网站以供下载:Open Chain at Scania - Jonas Öberg, Scania CV ABSingle-vendor Open Source at the Crossroads - Dirk Riehle, Friedrich-Alexander UniversityInspur’s Opensource Practices and Lessons - James Wang, InspurManaging Open Source Better Together - Michael Picht, SAP & Thomas Steenbergen, HERE TechnologiesOpen Source Collaboration and Companies: Finding the Right Balance - Dawn Foster, PivotalSPDX: Bridging the Compliance Tooling Gap - Steve Winslow & Gary O’Neall, The Linux FoundationEnd-to-end Injection Safety at Scale - Mike Samuel, GoogleThe Future of Open Source Sustainability, as Seen Elsewhere - Jose Miguel Parrella, MicrosoftBridging the Development Gap and the Commercial Use of Open Source Projects - Anni Lai & Sean McGinnis, HuaweiStarting and Scaling an Open Source Office: The Good, the Bad and the Ugly - Thomas Steenbergen, HERE TechnologiesHow Open Source Projects Can Leverage Standards and Specifications - David Rudin, Microsoft Corporation & Joint Development FoundationA Tale of Two Cities - Gil Yehuda & Ashley Wolf, Verizon MediaFulfilling Open Source License Obligations: Can Checklists Help? - Caren Kresse, Open Source Automation Development Lab (OSADL) eGMake Yourself Useful: How to be an Effective (Non-Profit) Board Member - Deborah Bryant, Red HatThree Cs to an Open Source Program Office - Justin Rackliffe, Fidelity InvestmentsLessons Learned from Starting an Open Source Based Compliance Verification Program - Wenjing Chu, Futurewei Technologies, Inc.Anti-Marketing Marketing: How to Build Authentic Evangelism Programs for Open Source Projects - Ben Cotton, Red Hat; Jen Gray, Adobe; Amanda Katona, VMware; Jennifer Lankford, AnyContext; and Kim McMahon, Cloud Foundry FoundationCompliance and Risk Metrics: Extending CHAOSS - Sean Goggins, University of Missouri; Matt Germonprez, University of Nebraska-Omaha & Kate Stewart, Linux FoundationThe Untold Story Behind Creating an Open Source Program Office - Brian Hsieh, UberIssues of Open Source Compliance Check of Modern Programing Languages and Container Images - Gergely Csatari, NokiaUnderstanding Trademarks in the Context of Open Source - Josh Aas, Internet Security Research Group, Ben Costa & Chris Ridder, Costa & Johnstone LLPShifting Incentives in Open Source Participation - Craig Northway, Qualcomm TechnologiesWhen Production is Someone Else’s Black Box: Safely Developing OSS for the Enterprise - Isobel Redelmeier, LightStepIntro to Setting Up an OSS Compliance Program in Your Organization - Indira Bhatt, Independent Consultant & Gwyn Murray, Matau Legal GroupMeasuring Success in Open Source Software Contribution - How to Stop Counting Lines of Code - Ranny Haiby, SamsungCII Best Practices Badge Project in 2019 - David A. Wheeler, IDAPanel Discussion: Everyday Mentoring, Growth, & Collaboration - Erica Brescia, Bitnami; Vicky Brasseur, Juniper; Rupa Dachere, CodeChix; Erik Riedel, Works Together; and Jaice Singer DuMars, GoogleHow to Leverage Research Universities - Carlos Maltzahn, University of California, Santa CruzManaging an Open Source Project: The Non-Code Work - Jonas Rosland, VMwareHow the Yocto Project Addressed Comcast RDK Scalability Issues - Nicolas Dechesne, Linaro & Khem Raj, ComcastAn Update on Hyperledger & Open Source Blockchain - David Treat, Accenture; Daniela Barbosa & Brian Behlendorf, HyperledgerSentimine: A cregit Plugin to Analyze the Sentiment Behind the Linux Kernel Code - Isabella Vieira Ferreira, Polytechnique MontréalA Novel Way to Efficiently Comply with Licenses - Alexios Zavras, Intel CorporationHow to Manage Open Source at Scale in a Global Enterprise? - Peter Giese, SAPWorking in Foundation-based vs. Company-led Open Source Projects - Ray Paik, GitLab & Stefano Maffulli, ScalityThe FOSSology Project - Latest News and Future Plans - Maximilian Huber, TNG Consulting GmbHSustaining Jenkins Through the CDF - Tracy Miranda, CloudBeesPanel Discussion: Managing Competing Corporate Interests While Driving Coherent Communities - Tom Tofigh, AT&T; Malini Bhandaru, VMware; Prakash Ramchandran, DellEMC & Sujata Tibrewala, IntelR Consortium: Striving to Address Diversity Issues in Open Source - Gabriela de Queiroz, IBM & David Smith, MicrosoftYocto Project: Solving Out of this World Problems! - Lieu Ta, Wind RiverBe Smart, Stay Smart - Open Source for Long-living Products - Urs Gleim, Siemens AGThe Serverless Landscape and Event Driven Futures - Priyanka Sharma, Gitlab & Dee Kumar, The Linux Foundation点击进入网页下载幻灯片(pdf)。KubeCon + CloudNativeCon + Open Source Summit大会日期:会议日程通告日期:2019 年 4 月 10 日会议活动举办日期:2019 年 6 月 24 至 26 日KubeCon + CloudNativeCon + Open Source Summit赞助方案KubeCon + CloudNativeCon + Open Source Summit多元化奖学金现正接受申请KubeCon + CloudNativeCon和Open Source Summit即将首次合体落地中国KubeCon + CloudNativeCon + Open Source Summit购票窗口,立即购票!CNCF邀请你加入最终用户社区 ...

March 18, 2019 · 4 min · jiezi

Python 开发比特币教程汇总

创建一个接受消息的机器人机器人接受比特币并立即退还用户创建比特币钱包其他编程语言比特币开发教程如下:PHP 比特币开发教程Go 比特币开发教程Java 比特币开发教程Node.js 比特币开发教程C# 比特币开发教程Mixin Network 开发者资源汇总

March 13, 2019 · 1 min · jiezi

5 XIN token 悬赏: Mixin Network Java SDK 补完计划

任务目标: 完善现有的Java SDK,使其可以支持Mixin Network所有的API。奖金: 5 XIN (约值 $700) 给最佳方案提供者流程:通过邮件 lilin at mixin.one, 或者 Mixin Messenger ID 31367 联系负责人创建Github开源库,写代码,告诉我库的地址时间安排:请于2019年4月12日之前提交完代码。最终结果将于2019年4月20日之前公布。Mixin Network开发者资源汇总Python 比特币教程PHP 比特币教程Go 比特币教程Java 比特币教程Node.js 比特币教程C# 比特币教程

March 12, 2019 · 1 min · jiezi

基于Mixin Network的Go语言比特币开发系列教程汇总

创建机器人机器人收比特币,发比特币创建独立的比特币钱包,查余额,转账其他编程语言比特币开发教程如下:PHP 比特币开发教程Python 比特币开发教程Java 比特币开发教程Node.js 比特币开发教程开发者资源汇总

March 9, 2019 · 1 min · jiezi

基于Mixin Network的PHP比特币开发教程: 创建比特币钱包

我们已经创建过一个回复消息的机器人和一个能自动支付比特币的机器人.通过本教程的学习,你可以学到如下内容如何创建一个比特币钱包.如何读取比特币钱包的余额.如何支付比特币并即时确认.如何将Mixin Network的比特币提现到你的冷钱包或第三方交易所.前期准备:你要有一个Mixin Network账户。如果没有账户,一行代码就能创建一个$user_info = $mixinSdk->Network()->createUser(“Tom cat”);上面的语句会在本地创建一个RSA密钥对,然后调用Mixin Network来创建帐号,最后输出帐号信息.//Create User api include all account informationprint_r($user_info);print($user_info[“pubKey”]);$newConfig = array();$newConfig[“private_key”] = $user_info[“priKey”];$newConfig[“pin_token”] = $user_info[“pin_token”];$newConfig[“session_id”] = $user_info[“session_id”];$newConfig[“client_id”] = $user_info[“user_id”];帐号创建成功后结果如下:Array( [type] => user [user_id] => de06f952-6ec7-3789-8467-9aa79869a6ef [identity_number] => 0 [full_name] => Tom cat [avatar_url] => [relationship] => [mute_until] => 0001-01-01T00:00:00Z [created_at] => 2019-02-20T12:29:29.86008273Z [is_verified] => [session_id] => bc9293e5-ed9a-48da-99f9-915f561a1c60 [phone] => [pin_token] => TIPyCtRTTYOg2sr+lu0z2D3xS8SOtQAy0ZDnacRrn6u2ytutZinzeEpRTD9N1+DS/T1zJ8VoX4ED19nhF5SApjqjUaRjKI5lga4rQGcePjCvM0D89FdpmKJzNMLjzV2DglKFMPbnJTu1btfILc0XWiSNEiiFr2mHuLI7bYuQzWI= [invitation_code] => [code_id] => [code_url] => https://mixin.one/codes/ [has_pin] => [receive_message_source] => EVERYBODY [accept_conversation_source] => EVERYBODY [priKey] => —–BEGIN PRIVATE KEY—–MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBALh0dSy2GcKek/Jp4lTMZxJ30AWP+inZ4c+FG+3ch3fenmXysCyM56hgvVZwh4RrRpvVjRt/NNE3k2WgN9LNZqWXCmo4ae/hJjpwuj/EVR/1/HSebF9hcvMoTre8D0iLlk+rf1tgr/ZHmIoa8ef45xMBDargfsF4b5k7kUavU9/xAgMBAAECgYB1ShBMOwsMVxvKdIvn0gXkl20ebFvtis9szr5gtO8rSNK+DuD5oyuXRNSAh5OUn0ZJxzQv/OZP9x/x6jw0/kk7Aj6cjjN3beC7UoayDYms4yNFoWNPqZEXkQ0b2tRsF3mdNj6LVm6Gq7FPDD1TYJ4GR4eOcWHCkZWym26HbZ30AQJBAPNFeZ7nd9wQIzu0wN9isrZebnCko3yax64MDsUAsrmPB1wdHkdX0tJpCldighYD10Cyi+nSz3ODmmbPbLu8AjECQQDCGyi0lpCoV+skLVR04weU99Msz1neqOw1khQCJLzUW8UdDhsVwfCdzCeuZrCz+gl/aZaJ6d+6rNTMp1hLionBAkBEs34hTiUfVL9egTFm5KyrrAdscFJrQhraIDWblRLkLGxbqy194GN9YIS3IO6z4OnNL58rrYlAig30sud2LSZBAkEAjuNXT7kWvBYcbwE/jtwhlLPqrK3nRlWrrLPgLsPEjb8Ql5busVGXQ1IqU+QcaCDEJRshSlzz6YOZEx6NjO5rAQJAejvW3DmTRjUSDJD8hGr9eCpKQTBDXyUEvyLIMCuRmm9Cbz0HRl4aVXOVblVWoJ6YsGvbCkSlLQCrPL2T58JTkg==—–END PRIVATE KEY—– [pubKey] => —–BEGIN PUBLIC KEY—–MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC4dHUsthnCnpPyaeJUzGcSd9AFj/op2eHPhRvt3Id33p5l8rAsjOeoYL1WcIeEa0ab1Y0bfzTRN5NloDfSzWallwpqOGnv4SY6cLo/xFUf9fx0nmxfYXLzKE63vA9Ii5ZPq39bYK/2R5iKGvHn+OcTAQ2q4H7BeG+ZO5FGr1Pf8QIDAQAB—–END PUBLIC KEY—–)现在你需要小心保管好你的帐号信息,在读取该账户的比特币资产余额或者进行其他操作时,将需要用到这些信息.给新建的帐号创建一个比特币钱包新账号并不默认内置比特币钱包, 现在读一下比特币余额就可以创建一个比特币钱包。$asset_infoNew = $mixinSdkNew->Wallet()->readAsset(“c6d0c728-2624-429b-8e0d-d9d19b6592fa”);echo “BitCoin wallet address is :”.$asset_infoNew[“public_key”];创建的帐号的比特币资产详细信息如下,其中public key就是比特币的存币地址:Array( [type] => asset [asset_id] => c6d0c728-2624-429b-8e0d-d9d19b6592fa [chain_id] => c6d0c728-2624-429b-8e0d-d9d19b6592fa [symbol] => BTC [name] => Bitcoin [icon_url] => https://images.mixin.one/HvYGJsV5TGeZ-X9Ek3FEQohQZ3fE9LBEBGcOcn4c4BNHovP4fW4YB97Dg5LcXoQ1hUjMEgjbl1DPlKg1TW7kK6XP=s128 [balance] => 0 [public_key] => 195p8R8Y15uzDGMrdVkELVUW2444psqiSq [account_name] => [account_tag] => [price_btc] => 1 [price_usd] => 3928.11498197 [change_btc] => 0 [change_usd] => -0.006841408545228452 [asset_key] => c6d0c728-2624-429b-8e0d-d9d19b6592fa [confirmations] => 12 [capitalization] => 0)这个API能够提供若干与比特币有关的信息:存币地址:[public_key]Logo: [icon_url]资产名字:[name]资产在Mixin Network的uuid: [asset_key]对美元的价格(Coinmarketcap.com提供): [price_usd]存币时确认的区块数量:[confirmations]比特币私钥呢?比特币的私钥呢?这个私钥被Mixin Network通过多重签名保护,所以对用户来说是不可见的,比特币资产的提现和转账都需要用户提供正确的的RSA签名,PIN代码与会话密钥才能完成.不只是比特币,还有以太坊,EOS等这个帐号不只支持比特币,还支持以太坊,EOS等, 完整的区块链支持列表. 这个账户同时也支持所有的 ERC20 代币与 EOS 代币.创建其它的币的钱包与创建比特币钱包过程一样,读对应的资产余额就可以.Mixin Network 当前支持的加密货币 (2019-02-19)cryptouuid in Mixin NetworkEOS6cfe566e-4aad-470b-8c9a-2fd35b49c68dCNB965e5c6e-434c-3fa9-b780-c50f43cd955cBTCc6d0c728-2624-429b-8e0d-d9d19b6592faETC2204c1ee-0ea2-4add-bb9a-b3719cfff93aXRP23dfb5a5-5d7b-48b6-905f-3970e3176e27XEM27921032-f73e-434e-955f-43d55672ee31ETH43d61dcd-e413-450d-80b8-101d5e903357DASH6472e7e3-75fd-48b6-b1dc-28d294ee1476DOGE6770a1e5-6086-44d5-b60f-545f9d9e8ffdLTC76c802a2-7c88-447f-a93e-c29c9e5dd9c8SC990c4c29-57e9-48f6-9819-7d986ea44985ZENa2c5d22b-62a2-4c13-b3f0-013290dbac60ZECc996abc9-d94e-4494-b1cf-2a3fd3ac5714BCHfd11b6e3-0b87-41f1-a41f-f0e9b49e5bf0EOS的存币地址与其它的币有些不同,它由两部分组成: account_name and account tag, 如果你向Mixin Network存入EOS,你需要填两项数据: account name 是eoswithmixin,备注里输入你的account_tag,比如0aa2b00fad2c69059ca1b50de2b45569. EOS的资产余额返回结果如下:Array( [type] => asset [asset_id] => 6cfe566e-4aad-470b-8c9a-2fd35b49c68d [chain_id] => 6cfe566e-4aad-470b-8c9a-2fd35b49c68d [symbol] => EOS [name] => EOS [icon_url] => https://images.mixin.one/a5dtG-IAg2IO0Zm4HxqJoQjfz-5nf1HWZ0teCyOnReMd3pmB8oEdSAXWvFHt2AJkJj5YgfyceTACjGmXnI-VyRo=s128 [balance] => 0 [public_key] => [account_name] => eoswithmixin [account_tag] => 0aa2b00fad2c69059ca1b50de2b45569 [price_btc] => 0.00097367 [price_usd] => 3.87734515 [change_btc] => 0.05950956117519646 [change_usd] => 0.07238079041492786 [asset_key] => eosio.token:EOS [confirmations] => 64 [capitalization] => 0)存入比特币与读取比特币余额现在,你可以向比特币的钱包存币了。当然,在比特币网络里转币,手续费是相当贵的,费用的中位数在0.001BTC,按当前4000美元的价格,在4美元左右,有一个方便的办法,如果你有Mixin Messenger帐号,里面并且有比特币的话,可以直接提现比特币到新创建的帐号的比特币充值地址,它们在同一个Mixin Network网络内,手续费为0,而且1秒到账。下面的代码,可以读取比特币钱包余额.$btc = $mixinSdkNew->Wallet()->readAsset(“c6d0c728-2624-429b-8e0d-d9d19b6592fa”);print_r($btc);Mixin Network网内免手续费的,并且即时确认任何币在Mixin Network内部的交易,都是无手续费的,并且立刻到账。前期准备: 账户设置了PIN对于新创建的帐号,我们通过updatePin来设置新PIN码, 代码如下://Create a PIN.$pinInfo = $mixinSdkNew->Pin()->updatePin(’’,PIN);print_r($pinInfo);Mixin Network帐号之间的比特币支付通过Mixin Messenger,我们可以先转比特币给机器人,然后让机器人转币给新用户。$mixinSdk = new MixinSDK(require ‘./config.php’);//$user_info[“user_id”] generated by create user;$trans_info = $mixinSdk->Wallet()->transfer(BTC_ASSET_ID,$user_info[“user_id”], $mixinSdk->getConfig()[‘default’][‘pin’],AMOUNT);print_r($trans_info);读取Bitcoin的余额,来确认比特币是不是转成功了! 注意$mixinSdkNew是新用户的。$btc = $mixinSdkNew->Wallet()->readAsset(BTC_ASSET_ID);print_r($btc);如何将比特币存入你的冷钱包或者第三方交易所如果你希望将币存入你的冷钱包或者第三方交易所, 先要得到冷钱包或者你在第三方交易所的钱包地址,然后将钱包地址提交到Mixin Network.要点提示: 提现是需要支付收续费的,准备好比特币包地址!增加目的钱包地址到Mixin Network调用createAddress API, 将会返回一个address_id,下一步的提现操作会用到这个id。$btcInfo = $mixinSdkNew->Wallet()->createAddress(“c6d0c728-2624-429b-8e0d-d9d19b6592fa”, “14T129GTbXXPGXXvZzVaNLRFPeHXD1C25C”, $mixinSdkNew->getConfig()[‘default’][‘pin’], “BTC withdral”,false);这里的 14T129GTbXXPGXXvZzVaNLRFPeHXD1C25C 就是一个比特币钱包地址, 如下所示,提现费用是0.0025738 BTC, address_id 是"345855b5-56a5-4f3b-ba9e-d99601ef86c1".Array( [type] => address [address_id] => 345855b5-56a5-4f3b-ba9e-d99601ef86c1 [asset_id] => c6d0c728-2624-429b-8e0d-d9d19b6592fa [public_key] => 14T129GTbXXPGXXvZzVaNLRFPeHXD1C25C [label] => BTC withdral [account_name] => [account_tag] => [fee] => 0.0025738 [reserve] => 0 [dust] => 0.0001 [updated_at] => 2019-02-20T01:47:56.44067294Z)创建提现地址成功后,你可以用readAddress读取最新的提现费。$wdInfo = $mixinSdkNew->Wallet()->readAddress($btcInfo[“address_id”]);提交提现请求,Mixin Network会即时处理提现请求.提交提现请求到Mixin Network, $btcInfo[“address_id”]就是createAddress创建的。$wdInfo = $mixinSdkNew->Wallet()->withdrawal($btcInfo[“address_id”], “0.01”, $mixinSdkBot->getConfig()[‘default’][‘pin’], “BTC withdral”);可以通过blockchain explore来查看进度.完整的代码在这儿 ...

March 8, 2019 · 2 min · jiezi

刚刚,阿里宣布开源Flutter应用框架Fish Redux!

3月5日,闲鱼宣布在GitHub上开源Fish Redux,Fish Redux是一个基于 Redux 数据管理的组装式 flutter 应用框架, 特别适用于构建中大型的复杂应用,它最显著的特征是 函数式的编程模型、可预测的状态管理、可插拔的组件体系、最佳的性能表现。下文中,我们将详细介绍Fish Redux的特点和使用过程,以下内容来自InfoQ独家对闲鱼Flutter团队的采访和Fish Redux的开源文档。开源背景在闲鱼接入Flutter之初,由于我们的落地的方案希望是从最复杂的几个主链路进行尝试来验证flutter完备性的,而我们的详情整体来讲业务比较复杂,主要体现在两个方面:页面需要集中状态管理,也就是说页面的不同组件共享一个数据来源,数据来源变化需要通知页面所有组件。页面的UI展现形式比较多(如普通详情、闲鱼币详情、社区详情、拍卖详情等),工作量大,所以UI组件需要尽可能复用,也就是说需要比较好的进行组件化切分。在我们尝试使用市面上已有的框架(google提供的redux以及bloc)的时候发现,没有任何一个框架可以既解决集中状态管理,又能解决UI的组件化的,因为本身这两个问题有一定的矛盾性(集中vs分治)。因此我们希望有一套框架能解决我们的问题,fish redux应运而生。fish redux本身是经过比较多次的迭代的,目前大家看到的版本经过了3次比较大的迭代,实际上也是经过了团队比较多的讨论和思考。第一个版本是基于社区内的flutter_redux进行的改造,核心是提供了UI代码的组件化,当然问题也非常明显,针对复杂的详情和发布业务,往往业务逻辑很多,无法做到逻辑代码的组件化。第二个版本针对第一个版本的问题,做出了比较重大的修改,解决了UI代码和逻辑代码的分治问题,但同时,按照redux的标准,打破了redux的原则,对于精益求精的闲鱼团队来讲,不能接受;因此,在第三个版本进行重构时,我们确立了整体的架构原则与分层要求,一方面按照reduxjs的代码进行了flutter侧的redux实现,将redux的原则完整保留下来。另一方面针对组件化的问题,提供了redux之上的component的封装,并创新的通过这一层的架构设计提供了业务代码分治的能力。至此,我们完成了fish redux的基本设计,但在后续的应用中,发现了业务组装以后的代码性能问题,针对该问题,我们再次提供了对应的adapter能力,保障了在长列表场景下的big cell问题。目前,fish redux已经在线上稳定运行超过3个月以上,未来,期待fish redux给社区带来更多的输入。Fish Redux技术解析分层架构图架构图:主体自底而上,分两层,每一层用来解决不通层面的问题和矛盾,下面依次来展开。ReduxRedux 是来自前端社区的一个数据管理框架,对 Native开发同学来说可能会有一点陌生,我们做一个简单的介绍。Redux 是做什么的?Redux 是一个用来做可预测易调试的数据管理的框架。所有对数据的增删改查等操作都由 Redux 来集中负责。Redux 是怎么设计和实现的?Redux 是一个函数式的数据管理的框架。传统 OOP 做数据管理,往往是定义一些 Bean,每一个 Bean 对外暴露一些 Public-API 用来操作内部数据(充血模型)。函数式的做法是更上一个抽象的纬度,对数据的定义是一些 Struct(贫血模型),而操作数据的方法都统一到具有相同函数签名 (T, Action) => T 的 Reducer 中。FP:Struct(贫血模型) + Reducer = OOP:Bean(充血模型)同时 Redux 加上了 FP 中常用的 Middleware(AOP) 模式和 Subscribe 机制,给框架带了极高的灵活性和扩展性。贫血模型、充血模型请参考:https://en.wikipedia.org/wiki/Plain_old_Java_objectRedux 的缺点Redux 核心仅仅关心数据管理,不关心具体什么场景来使用它,这是它的优点同时也是它的缺点。在我们实际使用 Redux 中面临两个具体问题:Redux 的集中和 Component 的分治之间的矛盾;Redux 的 Reducer 需要一层层手动组装,带来的繁琐性和易错性。Fish Redux 的改良Fish Redux 通过 Redux 做集中化的可观察的数据管理。然不仅于此,对于传统 Redux 在使用层面上的缺点,在面向端侧 flutter 页面纬度开发的场景中,我们通过更好更高的抽象,做了改良。一个组件需要定义一个数据(Struct)和一个 Reducer。同时组件之间存在着父依赖子的关系。通过这层依赖关系,我们解决了【集中】和【分治】之间的矛盾,同时对 Reducer 的手动层层 Combine 变成由框架自动完成,大大简化了使用 Redux 的困难。我们得到了理想的集中的效果和分治的代码。对社区标准的 followState、Action、Reducer、Store、Middleware 以上概念和社区的 ReduxJS 是完全一致的。我们将原汁原味地保留所有的 Redux 的优势。如果想对 Redux 有更近一步的理解,请参考:https://github.com/reduxjs/reduxComponent组件是对局部的展示和功能的封装。 基于 Redux 的原则,我们对功能细分为修改数据的功能(Reducer)和非修改数据的功能(副作用 Effect)。于是我们得到了,View、 Effect、Reducer 三部分,称之为组件的三要素,分别负责了组件的展示、非修改数据的行为、修改数据的行为。这是一种面向当下,也面向未来的拆分。在面向当下的 Redux 看来,是数据管理和其他。在面向未来的 UI-Automation 看来是 UI 表达和其他。UI 的表达对程序员而言即将进入黑盒时代,研发工程师们会把更多的精力放在非修改数据的行为、修改数据的行为上。组件是对视图的分治,也是对数据的分治。通过逐层分治,我们将复杂的页面和数据切分为相互独立的小模块。这将利于团队内的协作开发。关于 ViewView 仅仅是一个函数签名: (T,Dispatch,ViewService) => Widget它主要包含三方面的信息视图是完全由数据驱动。视图产生的事件/回调,通过 Dispatch 发出“意图”,不做具体的实现。需要用到的组件依赖等,通过 ViewService 标准化调用。比如一个典型的符合 View 签名的函数。关于 EffectEffect 是对非修改数据行为的标准定义,它是一个函数签名: (Context, Action) => Object它主要包含四方面的信息接收来自 View 的“意图”,也包括对应的生命周期的回调,然后做出具体的执行。它的处理可能是一个异步函数,数据可能在过程中被修改,所以我们不崇尚持有数据,而通过上下文来获取最新数据。它不修改数据, 如果修要,应该发一个 Action 到 Reducer 里去处理。它的返回值仅限于 bool or Future, 对应支持同步函数和协程的处理流程。比如良好的协程的支持:关于 ReducerReducer 是一个完全符合 Redux 规范的函数签名:(T,Action) => T一些符合签名的 Reducer:同时我们以显式配置的方式来完成大组件所依赖的小组件、适配器的注册,这份依赖配置称之为 Dependencies。所以有这样的公式 Component = View + Effect(可选) + Reducer(可选) + Dependencies(可选)。一个典型的组装:通过 Component 的抽象,我们得到了完整的分治,多纬度的复用,更好的解耦。AdapterAdapter 也是对局部的展示和功能的封装。它为 ListView 高性能场景而生,它是 Component 实现上的一种变化。它的目标是解决 Component 模型在 flutter-ListView 的场景下的 3 个问题:1)将一个"Big-Cell"放在 Component 里,无法享受 ListView 代码的性能优化;2)Component 无法区分 appear|disappear 和 init|dispose ;3)Effect 的生命周期和 View 的耦合,在 ListView 的场景下不符合直观的预期。概括的讲,我们想要一个逻辑上的 ScrollView,性能上的 ListView ,这样的一种局部展示和功能封装的抽象。做出这样独立一层的抽象是我们看实际的效果,我们对页面不使用框架Component,使用框架 Component+Adapter 的性能基线对比。Reducer is long-lived, Effect is medium-lived, View is short-lived.我们通过不断的测试做对比,以某 Android机为例:使用框架前 我们的详情页面的 FPS,基线在 52FPS;使用框架, 仅使用 Component 抽象下,FPS 下降到 40, 遭遇“Big-Cell”的陷阱;使用框架,同时使用 Adapter 抽象后,FPS 提升到 53,回到基线以上,有小幅度的提升。Directory推荐的目录结构会是这样sample_page– action.dart– page.dart– view.dart– effect.dart– reducer.dart– state.dartcomponentssample_component– action.dart– component.dart– view.dart– effect.dart– reducer.dart– state.dart上层负责组装,下层负责实现, 同时会有一个插件提供, 便于我们快速填写。以闲鱼的详情场景为例的组装:组件和组件之间,组件和容器之间都完全的独立。Communication Mechanism组件|适配器内通信组件|适配器间内通信简单的描述:采用的是带有一段优先处理的广播, self-first-broadcast。发出的 Action,自己优先处理,否则广播给其他组件和 Redux 处理。最终我们通过一个简单而直观的 dispatch 完成了组件内,组件间(父到子,子到父,兄弟间等)的所有的通信诉求。Refresh Mechanism数据刷新局部数据修改,自动层层触发上层数据的浅拷贝,对上层业务代码是透明的。层层的数据的拷贝:一方面是对 Redux 数据修改的严格的 follow。另一方面也是对数据驱动展示的严格的 follow。视图刷新扁平化通知到所有组件,组件通过 shouldUpdate 确定自己是否需要刷新。Fish Redux的优点数据的集中管理通过 Redux 做集中化的可观察的数据管理。我们将原汁原味地保留所有的 Redux 的优势,同时在 Reducer 的合并上,变成由框架代理自动完成,大大简化了使用 Redux 的繁琐度。组件的分治管理组件既是对视图的分治,也是对数据的分治。通过逐层分治,我们将复杂的页面和数据切分为相互独立的小模块。这将利于团队内的协作开发。View、Reducer、Effect 隔离将组件拆分成三个无状态的互不依赖的函数。因为是无状态的函数,它更易于编写、调试、测试、维护。同时它带来了更多的组合、复用和创新的可能。声明式配置组装组件、适配器通过自由的声明式配置组装来完成。包括它的 View、Reducer、Effect 以及它所依赖的子项。良好的扩展性核心框架保持自己的核心的三层关注点,不做核心关注点以外的事情,同时对上层保持了灵活的扩展性。框架甚至没有任何的一行的打印的代码,但我们可通过标准的 Middleware 来观察到数据的流动,组件的变化。在框架的核心三层外,也可以通过 dart 的语言特性 为 Component 或者 Adapter 添加 mixin,来灵活的组合式地增强他们的上层使用上的定制和能力。框架和其他中间件的打通,诸如自动曝光、高可用等,各中间件和框架之间都是透明的,由上层自由组装。精小、简单、完备它非常小,仅仅包含 1000 多行代码;它使用简单,完成几个小的函数,完成组装,即可运行;它是完备的。关于未来开源之后,闲鱼打算通过以下方式来维护Fish Redux:通过后续的一系列的对外宣传,吸引更多的开发者加入或者使用。目前Flutter生态里,应用框架还是空白,有机会成为事实标准;配合后续的一系列的闲鱼Flutter移动中间件矩阵做开源;进一步提供,一系列的配套的开发辅助调试工具,提升上层Flutter开发效率和体验。Fish Redux 目前已在阿里巴巴闲鱼技术团队内多场景,深入应用。最后 Talk is cheap, Show me the code,我们今天正式在GitHub上开源,更多内容,请到GitHub了解。GitHub地址:https://github.com/alibaba/fish-redux本文作者:闲鱼技术-吉丰阅读原文本文为云栖社区原创内容,未经允许不得转载。 ...

March 7, 2019 · 2 min · jiezi

价值6千多美金的C sharp sdk赏金活动已经结束,该召唤神龙了

于2019年1月22日启动的C sharp SDK赏金活动已经结束, wjfree/mixin-csharp-sdk获得50xin token大奖,价值6千多美金。针对另一个也非常优秀的ibigbug/Mixin-SDK-CSharp,CEO cedric特别颁发了感谢奖。通过此次赏金活动,Mixin Network获得高质量的C sharp sdk,下一步将基于sdk开发基于C sharp的教程,来向广大C sharp 程序员展示Mixin Network的特性和优势。至此Mixin Network已经拥有面向7种编程语言的9个sdk,分别是Ruby, Python, PHP, Java, Go lang{ MixinNetwork,MooooonStar}, Nodejs, C# SDK{wjfree, ibigbug}。开发者教程已经覆盖5种语言:Python, PHP, Nodejs, Go lang, JavaMixin Network还将继续为开发者提供更好的文档,教程和服务。但是,明明已经收了7种SDK,说好的神龙在哪呢?

March 4, 2019 · 1 min · jiezi

基于Mixin Network的Go语言比特币开发教程 : 用 Mixin Messenger 机器人接受和发送比特币

基于Mixin Network的Go语言比特币开发教程 : 用 Mixin Messenger 机器人接受和发送比特币在 上一篇教程中, 我们创建了自动回复消息的机器人,当用户发送消息"Hello,World!“时,机器人会自动回复同一条消息!按本篇教程后学习后完成后,你的机器人将会接受用户发送过来的加密货币,然后立即转回用户。完整代码如下:main.gofpackage mainimport ( “context” “encoding/base64” “encoding/json” “log” “github.com/MooooonStar/mixin-sdk-go/messenger” mixin “github.com/MooooonStar/mixin-sdk-go/network”)type Listener struct { *messenger.Messenger}// interface to implement if you want to handle the messagefunc (l *Listener) OnMessage(ctx context.Context, msg messenger.MessageView, userId string) error { data, err := base64.StdEncoding.DecodeString(msg.Data) if err != nil { return err } if msg.Category == “SYSTEM_ACCOUNT_SNAPSHOT” { var transfer messenger.TransferView if err := json.Unmarshal(data, &transfer); err != nil { return err } log.Println(“I got a coin: “, transfer.Amount) mixin.Transfer(msg.UserId,transfer.Amount,transfer.AssetId,”",messenger.UuidNewV4().String(), PinCode,PinToken,UserId,SessionId,PrivateKey) return nil // return l.SendPlainText(ctx, msg.ConversationId, msg.UserId, string(data)) } else if msg.Category == “PLAIN_TEXT” { log.Printf(“I got a message, it said: %s”, string(data)) if string(data) == “g” { payLinkEOS := “https://mixin.one/pay?recipient=" + msg.UserId + “&asset=” + “6cfe566e-4aad-470b-8c9a-2fd35b49c68d” + “&amount=” + “0.1” + “&trace=” + messenger.UuidNewV4().String() + “&memo=” payLinkBTC := “https://mixin.one/pay?recipient=" + msg.UserId + “&asset=” + “c6d0c728-2624-429b-8e0d-d9d19b6592fa” + “&amount=” + “0.001” + “&trace=” + messenger.UuidNewV4().String() + “&memo=” log.Println(payLinkBTC) BtnEOS := messenger.Button{Label: “Pay EOS 0.1”, Color: “#0080FF”, Action: payLinkEOS} BtnBTC := messenger.Button{Label: “Pay BTC 0.0001”, Color: “#00FF80”, Action: payLinkBTC} if err := l.SendAppButtons(ctx, msg.ConversationId, msg.UserId, BtnEOS, BtnBTC); err != nil { return err } return nil } else if string(data) == “a” { card := messenger.AppCard{Title: “Pay BTC 0.0001”, Description: “topay”, Action: “http://www.google.cn”, IconUrl: “https://images.mixin.one/HvYGJsV5TGeZ-X9Ek3FEQohQZ3fE9LBEBGcOcn4c4BNHovP4fW4YB97Dg5LcXoQ1hUjMEgjbl1DPlKg1TW7kK6XP=s128"} if err := l.SendAppCard(ctx, msg.ConversationId, msg.UserId, card); err != nil { return err } return nil } else if string(data) == “r” { mixin.Transfer(msg.UserId,“0.0001”,“c6d0c728-2624-429b-8e0d-d9d19b6592fa”,”",messenger.UuidNewV4().String(), PinCode,PinToken,UserId,SessionId,PrivateKey) return nil } else { return l.SendPlainText(ctx, msg.ConversationId, msg.UserId, string(data)) } } else { log.Println(“Unknown message!”, msg.Category) return err }}const ( UserId = “21042518-85c7-4903-bb19-f311813d1f51” PinCode = “911424” SessionId = “4267b63d-3daa-449e-bc13-970aa0357776” PinToken = “gUUxpm3fPRVkKZNwA/gk10SHHDtR8LmxO+N6KbsZ/jymmwwVitUHKgLbk1NISdN8jBvsYJgF/5hbkxNnCJER5XAZ0Y35gsAxBOgcFN8otsV6F0FAm5TnWN8YYCqeFnXYJnqmI30IXJTAgMhliLj7iZsvyY/3htaHUUuN5pQ5F5s=” //please delele the blank of PrivateKey the before each line PrivateKey = -----BEGIN RSA PRIVATE KEY-----MIICXQIBAAKBgQCDXiWJRLe9BzPtXmcVe6acaFTY9Ogb4Hc2VHFjKFsp7QRVCytx3KC/LRojTFViwwExaANTZQ6ectwpAxIvzeYeHDZCXCh6JRFIYK/ZuREmYPcPQEWDs92Tv/4XTAdTH8l9UJ4VQY4zwqYMak237N9xEvowT0eR8lpeJG0jAjN97QIDAQABAoGADvORLB1hGCeQtmxvKRfIr7aEKak+HaYfi1RzD0kRjyUFwDQkPrJQrVGRzwCqGzJ8mUXwUvaGgmwqOJS75ir2DL8KPz7UfgQnSsHDUwKqUzULgW6nd/3OdDTYWWaNcDjbkEpsVchOpcdkywvZhhyGXszpM20Vr8emlBcFUOTfpTUCQQDVVjkeMcpRsImVU3tPYyiuqADhBTcgPBb+Ownk/87jyKF1CZOPvJAebNmpfJP0RMxUVvT4B9/U/yxZWNLhLtCXAkEAnaOEuefUxGdE8/55dUTEb7xrr22mNqykJaax3zFK+hSFBrM3gUY5fEETtHnl4gEdX4jCPybRVc1JSFY/GWoyGwJBAKoLti95JHkErEXYavuWYEEHLNwvmgcZnoI6cOKVfEVYEEoHvhTeCkoWHVDZOd2EURIQ1eY18JYIZ0M4Z66R8DUCQCsKiKTR3dA6eiM8qiEQw6nWgniFscpf3PnCx/Iu3U/m5mNr743GhM+eXSj7136b209IYfEoQiPxRz8O/W+NBV0CQQDVPxqJlFD34MC9aQN42l3NV1hDsl1+nSkWkXSyhhNRMpobtV1a7IgJGyt5HxBzgNlBNOayICRf0rRjvCdw6aTP-----END RSA PRIVATE KEY-----)func main() { ctx := context.Background() m := messenger.NewMessenger(UserId, SessionId, PrivateKey) l := &Listener{m} go m.Run(ctx, l) select {}}你好, 比特币!在项目目录下编译并执行cd mixin_labs-go-botgo build./mixin_labs-go-bot开发者可以通过消息面板,给机器人转比特币,当机器人收到比特币后,马上返还给用户!事实上,用户可以发送任意的币种给机器人,它都能马上返还!源代码解释if msg.Category == “SYSTEM_ACCOUNT_SNAPSHOT” { var transfer messenger.TransferView if err := json.Unmarshal(data, &transfer); err != nil { return err } log.Println(“I got a coin: “, transfer.Amount) mixin.Transfer(msg.UserId,transfer.Amount,transfer.AssetId,”",messenger.UuidNewV4().String(), PinCode,PinToken,UserId,SessionId,PrivateKey) return nil // return l.SendPlainText(ctx, msg.ConversationId, msg.UserId, string(data))}调用SDK的 mixin.Transfer 将币返还用户!高级用法APP_BUTTON_GROUP在一些应用场景,比如:有一个交易所想提供换币服务,将比特币换成以太坊,EOS,比特币现金等,你想显示给用户一组按钮,它们分别代表不同的币与不同的数量,APP_BUTTON_GROUP可以帮你做到这一点.payLinkEOS := “https://mixin.one/pay?recipient=" + msg.UserId + “&asset=” + “6cfe566e-4aad-470b-8c9a-2fd35b49c68d” + “&amount=” + “0.1” + “&trace=” + messenger.UuidNewV4().String() + “&memo=“payLinkBTC := “https://mixin.one/pay?recipient=" + msg.UserId + “&asset=” + “c6d0c728-2624-429b-8e0d-d9d19b6592fa” + “&amount=” + “0.001” + “&trace=” + messenger.UuidNewV4().String() + “&memo=“log.Println(payLinkBTC)BtnEOS := messenger.Button{Label: “Pay EOS 0.1”, Color: “#0080FF”, Action: payLinkEOS}BtnBTC := messenger.Button{Label: “Pay BTC 0.001”, Color: “#00FF80”, Action: payLinkBTC}if err := l.SendAppButtons(ctx, msg.ConversationId, msg.UserId, BtnEOS, BtnBTC); err != nil { return err}这里演示给用户BTC与EOS两种,你还可以增加更多的按钮.APP_CARD如果你觉得一组按钮太单调了,可以试一下APP_CARD,它提供一个图标的链接card := messenger.AppCard{Title: “CNB”, Description: “Chui Niu Bi”, Action: “http://www.google.cn”, IconUrl: “https://images.mixin.one/0sQY63dDMkWTURkJVjowWY6Le4ICjAFuu3ANVyZA4uI3UdkbuOT5fjJUT82ArNYmZvVcxDXyNjxoOv0TAYbQTNKS=s128"}if err := l.SendAppCard(ctx, msg.ConversationId, msg.UserId, card); err != nil { return err}Full source code ...

March 4, 2019 · 3 min · jiezi

一块听听:Mixin 主网上线语音直播文字稿

本文是在一块听听上的语音直播的文字精简版。Mixin Network的成绩,主网和展望大家好,我是Mixin Network 的李林。非常高兴能在这里跟大家分享一下Mixin Network。第一次做语音直播,很紧张,难免会讲错,如果有错,请大家指出来,我努力改正。今天会讲4个主题mixin 是什么主网启动的一些细节,主网上线之后的计划。我个人关于mixin和比特币闪电网络的思考Mixin Network 是什么Mixin Network是一个面向数字资产的转账网络,转账免费,1秒到账。为什么要设计一个数字资产转账网络呢?这里首先我们先明确两个我们认为一定发生的事情:区块链经济一定会指数级别增长。从比特币的价格,到后来以太坊的ICO,ERC20代币,eos上的智能合约,波场的发展都得出这个结论。智能手机时代的用户需要一个快速,便宜的数字资产支付系统。大家体验过微信,支付宝的支付体验之后是回不去的来。现在看看现实情况:无论是比特币和以太坊,转账有转账费,而且比特币转账费很贵,而且到账时间很长。既然在现实和大趋势之间有巨大的鸿沟。这意味着谁能填平这个鸿沟,谁就有巨大的利益。因此,CEO冯晓东就决定做一个技术方案,这个方案的名字叫做Mixin,意思是链接一切数字资产。既然是面向大趋势设计的方案,不仅仅是免费和快速到账这么简单,Mixin还有一个设计目标就实现匿名支付。为什么支付要匿名?大家想一下你用微信在超市买个口香糖,你楼下的邻居肯定不知道。只有你,卖家,微信,银行才知道。其他人是无法知道你的购买记录的。这是大家的隐私信息,受法律保护。 但是比特币和以太坊在设计之初没有将隐私放在第一位,你把比特币转给谁,全世界都知道。 这对于消费者和商家来说太可怕了。因此我们将隐私加入我们的设计目标。因此我们的设计目标是转账免费,1秒到账,支付匿名,支持极多的资产。那么我们是如何实现的呢?验证一笔交易是否有效使用拜占庭和POS机制。不是POW,也不是DPOS。交易存储使用DAG(有向无环图)。Mixin里面不出块。使用了与门罗币一样的匿名交易机制(CryptoNote)。目前为止做到的成绩支持13个主链,比特币,比特现金,以太坊,以太坊经典,莱特币,达世币,狗狗币,EOS,瑞波币,USDT,Horizen, Nem, Sia, Zcash。在这13个主链本身还没有实现1秒到账的闪电网络之前,Mixin Network帮助他们实现了1秒到账,免费转账,匿名交易。支持基于比特币发的USDT和以太坊发的USDT支持基于以太坊发的16万9千2百27种erc20代币。以太坊上的ERC20代币目前是很靠谱的发币方式,缺点是以太坊上确认交易特别慢。那么只要你用Mixin Network,就能为你的代币用户提供免费转账,1秒到账,而且匿名交易。支持基于EOS发的3千2百98种代币。虽然EOS代币本身不如ERC20代币那么稳固,但是由于EOS确认交易比以太坊快很多,所以有些项目选了EOS发代币。但是EOS钱包需要质押资源才能用。这种设计让用户很不舒服:普通用户很难理解开户花钱,转账还花钱,昨天能转账,今天就不能转的逻辑。如果使用Mixin Network,那么EOS代币转账可以1秒确认,同时免费使用钱包,不需要额外抵押资源。目前Mixin Network上的主要资产有1100多比特币,1800多以太坊,130万EOS,150万USDT,110多万瑞波币,300多比特现金,不包括我们自己发的XIN token在内,有6千多万美金的资产。如果包括我们自己发的XIN token,资产总额超过1.3亿美金总计持有6万多种资产。总计发生了2亿笔交易,真实网络峰值达到了168。大家都知道一个区块链项目产品需要有开发者来做产品才有价值。针对开发者工作针对在mixin network初期就看好mixin并且义务为mixin提供开源SDK的作者提供了特殊贡献奖,每人50 xin token,价值7300美金。相关SDK资源在2018年末到2019年初举办了一次开发者大赛,吸引了全球的开发者。获奖团队来自全世界,第一名来自澳大利亚,奖金是300 xin token,如果获奖团队没有卖xin token,现在价值4万多美金。 作品是一个在安装在谷歌浏览器上的mixin 钱包。我们在春节前针对c sharp编程语言发布了SDK悬赏,被mixin 团队选定的作品可以获得50 xin token,目前价值7千多美金。在开源SDK的支持下我们还专门针对不同种类的编程语言提供了入门教程,现在入门教程已经覆盖了PHP, Nodejs, Python和Java go几种语言。如果你会编程,在mixin的支持下,可以30分钟搭建一个区块链应用。基于Mixin Network的应用Mixin 团队自己的产品Mixin Messenger这是一个通过记住手机号和6位数字密码就可以管理无限种资产的钱包。同时还是一个安全快速的聊天工具。用过比特币钱包,以太坊钱包和EOS钱包的朋友肯定知道一个东西叫做助记词,就是一堆没啥关联的单词,记住就好了。但是大家知道人类记忆是非常耗费能量的,特别是毫无关联内容的记忆。所以助记词基本上只能拍照,或者打印在纸上藏起来。最开始几天你肯定忘不了,但是过了1年你肯定忘了,如果你换手机或者不小心格式化电脑,你就再也无法动用你的钱。除了助记词,还有通过强密码保护的方法,就是通过组合使用数字,字母,特殊符号来保护钱包。但是这个密码太难记住了,如果你两个星期不用,就很容易忘记。会发现自己明明有钱,但是取不了。 我们认为这两种方案是给专业人士设计的。在智能手机时代应该有一个方便又足够安全的手机钱包这就是Mixin Messenger : 只要记住手机号和6位数字pin码就可以管理钱包,这和手机银行是一样的体验。 只要你有手机,安装我们的App,就同时免费拥有13种主链钱包,比特币,以太坊,eos,波场。这个钱包可以装下16万种以太坊ERC20代币,3千种EOS上的代币。就连你自己发的币都可以随意转入,转出,不用审批,来去自由。根本不用提交任何申请。Oceanone交易撮合引擎这是一个去中心化交易所引擎,可以交易所有在mixin network上的资产。我们工程师基于这个引擎搭建了一个完全自由的交易所,所有的Mixin network上的资产都可以自由挂单买卖。就是以太坊上发行的16万种资产你都可以自由的充值到你的mixin 账户,在交易所卖掉,同时永远不会丢币。因为交易完毕后资产就回到了你自己的账户而不是交易所账户。你自己发一个币也可以去交易所买卖,不需要审批,来去自由。开发者和社区作品我们的开发者也很给力,基于Mixin Network做了很多游戏,应用。充分的体现了Mixin Network的实力。包括 pressone,exinone,Fox等等。主网上线的细节:Mixin Network主网在北京时间2019年2月28日早上8点正式完成了上线。创世节点已经有15个, 分别来自bigone,eoslaomao,exin,ss,fox,candy以及Mixin Network技术团队。目前主网上线工作已经完成,正在把测试网上的资产迁移到主网上。Mixin的节点的选择过程成为Mixin Network主网节点的方法与EOS,波场 IOST等差别很大。成为Mixin Network节点不需要投票,只需要质押10000个XIN token,并且有一台服务器就可以,服务器费约一个月500美金。节点奖励Mixin Network在主网上预留了XIN token奖励池。每年会把奖励池中的十分之一拿出来奖励给节点。当然做Mixin Network节点是需要认真负责,如果节点故意做恶,那么节点质押的10000 token就会被主网没收。主网上线意味着什么Mixin Network真的是一个去中心化的区块链项目了。仅仅关掉一台服务器,关闭一个域名,或者团队跑路已经伤害不到Mixin Network了。冯晓东和Mixin Network团队是一个说到做到的靠谱团队。Mixin Network的很多决策将由开发团队和社区共同商议决定。mixin主网上线对mixin network来说只是一个起点。未来要做的工作技术开发方面继续开发工作,把技术细节完善并开源。支持更多的主流币种,目标是https://coinmarketcap.com上的…。升级交易所技术方案,形成交钥匙方案。Mixin Messenger会开发桌面版,成为全平台的钱包和聊天工具社区推广方面:将内容分发到其他非英语国家,包括日本,印尼,巴西,俄罗斯。Mixin Network的发展前景比特币和闪电网络Mixin Network也常常被人质疑为什么在比特币闪电网络已经存在的情况下还要做一个闪电网络。我们的答案如下:比特币有闪电网络,可是以太坊,dash,莱特币,狗狗币没有。一个帮助别的区块链实现闪电网络的区块链是有价值的。我们会发现,闪电网络这种业务场景是非常适合商业机构来运营。举个例子,比特币转账非常简单,有台手机,就可以生成比特币钱包,就可以收款,找到全节点就可以转账。但是比特币的闪电网络需要用户有一台随时可用的服务器才行。很明显闪电网络是牺牲了一部分去中心化特性的。其次闪电网络的到账时间是不固定的,可能大部分时间很快,3秒左右,少部分时候需要几分钟甚至几天。而且闪电网络基于安全原因没有办法支付太多的比特币,大额转账实现不了。这对于商业运营来说就很痛苦。尽管有这样的问题,但是闪电网络依然是一个非常优秀的技术发明。事实也证明了这个结论,现在比特币闪电网络已经持有700多个比特币。这个网站分享给大家,http://1ml.com/ 可以看到比特币闪电网络的进展。那么mixin作为一个1秒到账的通用闪电网络会如何发展呢?我认为在比特币转账市场上,Mixin Network和闪电网络会占据前三名。以太坊,莱特币其他币的转账市场上,mixin会成为第一名,并且占有超过50%的市场份额。Mixin Network靠什么赚钱我个人喜欢把Mixin Network比作一个商业运作的转账服务公司,通过为用户提供快速可靠的转账服务赚服务费。回想一下我们最初为什么做Mixin Network:区块链经济一定会指数级别增长。智能手机时代的用户需要一个快速,便宜的数字资产支付系统只要Mixin Network始终为客户提供优质的服务,占据足够的市场份额,就能够赚取足够多的钱,来回报持有Mixin Network。那么CEO 冯晓东和mixin开发团队是否擅长提供优秀的产品和服务呢?冯晓东和Mixin Network开发团队过去开发过的产品包括安卓系统的播放器内核,已经被一下科技收购,至今仍在服务很多app。手机游戏直播app也是在没有市场推广的情况下就能突破千万级用户。因此我们有充足的信心说,Mixin Network能实现自己吹过的牛逼。今天的我的分享到此结束。 ...

March 1, 2019 · 1 min · jiezi

Python 比特币教程之三: 创建比特币钱包,读余额,极速免费转账,标准转账

我们已经创建过一个回复消息的机器人和一个能自动支付比特币的机器人.通过本教程的学习,你可以学到如下内容如何创建一个比特币钱包.如何读取比特币钱包的余额.如何实现免手续费支付比特币并1秒到账如何将Mixin Network的比特币提现到你的冷钱包或第三方交易所.通过Mixin Network Python SDK创建一个比特币钱包前期准备:你要有一个Mixin Network账户。如果没有账户,一行代码就能创建一个 userInfo = mixinApiBotInstance.createUser(session_key.decode(),“Tom Bot”)上面的语句会在本地创建一个RSA密钥对,然后调用Mixin Network来创建帐号,最后输出帐号信息.//Create User api include all account informationuserInfo.get(“data”).get(“pin_token”),userInfo.get(“data”).get(“session_id”),userInfo.get(“data”).get(“user_id”),帐号创建成功后结果如下:{‘data’: {’type’: ‘user’, ‘user_id’: ‘2f25b669-15e7-392c-a1d5-fe7ba43bdf37’,‘identity_number’: ‘0’, ‘full_name’: ‘Tom Bot’, ‘avatar_url’: ‘’,‘relationship’: ‘’, ‘mute_until’: ‘0001-01-01T00:00:00Z’,‘created_at’: ‘2019-02-22T06:23:41.754573722Z’, ‘is_verified’: False,‘session_id’: ‘284c7b39-3284-4cf6-9354-87df30ec7d57’, ‘phone’: ‘’,‘pin_token’: ‘g4upUgBXa8ATk7yxL6B94HgI4GV4sG4t8Wyn6uTu2Q2scH11UMQ5bYDb6Md+3LRQqRjEdRFcLlHijXGBihRweTaKTZjHQqolWbZcffesVIias6WppV/QMu4TzXCuKa5xpj3uhjL+yPyfWTLGUaVJTJN9n7PQmHSIUBXrovbfodk=’,‘invitation_code’: ‘’, ‘code_id’: ‘’, ‘code_url’: ‘’, ‘has_pin’: False,‘receive_message_source’: ‘EVERYBODY’, ‘accept_conversation_source’: ‘EVERYBODY’}}现在你需要小心保管好你的帐号信息,在读取该账户的比特币资产余额或者进行其他操作时,将需要用到这些信息.给新建的帐号创建一个比特币钱包新账号并不默认内置比特币钱包, 现在读一下比特币余额就可以创建一个比特币钱包。def readAssetAddress(asset_id,isBTC = True): with open(’new_users.csv’, newline=’’) as csvfile: reader = csv.reader(csvfile) for row in reader: pin = row.pop() userid = row.pop() session_id = row.pop() pin_token = row.pop() private_key = row.pop() mixinApiNewUserInstance = generateMixinAPI(private_key, pin_token, session_id, userid, pin,"") btcInfo = mixinApiNewUserInstance.getAsset(asset_id) print(btcInfo) if isBTC: print(“Account %s 's Bitcoin wallet address is %s " %(userid,btcInfo.get(“data”).get(“public_key”))) else: print(“Account %s 's EOS account name is %s, wallet address is %s " %(userid, btcInfo.get(“data”).get(“account_name”), btcInfo.get(“data”).get(“account_tag”)))创建的帐号的比特币资产详细信息如下,其中public key就是比特币的存币地址:{‘data’: {’type’: ‘asset’, ‘asset_id’: ‘c6d0c728-2624-429b-8e0d-d9d19b6592fa’,‘chain_id’: ‘c6d0c728-2624-429b-8e0d-d9d19b6592fa’,‘symbol’: ‘BTC’, ’name’: ‘Bitcoin’,‘icon_url’: ‘https://images.mixin.one/HvYGJsV5TGeZ-X9Ek3FEQohQZ3fE9LBEBGcOcn4c4BNHovP4fW4YB97Dg5LcXoQ1hUjMEgjbl1DPlKg1TW7kK6XP=s128','balance': ‘0’,‘public_key’: ‘12sJHR7HJPMt33KwSHyxQvYqGGUEbVGREf’,‘account_name’: ‘’, ‘account_tag’: ‘’, ‘price_btc’: ‘1’,‘price_usd’: ‘3879.88117389’, ‘change_btc’: ‘0’,‘change_usd’: ‘0.017333475714793264’,‘asset_key’: ‘c6d0c728-2624-429b-8e0d-d9d19b6592fa’,‘confirmations’: 12, ‘capitalization’: 0}}Account a8cefb2e-cb93-338f-aba7-32a3a635ad02 ’s Bitcoin wallet address is 12sJHR7HJPMt33KwSHyxQvYqGGUEbVGREf这个API能够提供若干与比特币有关的信息:存币地址:[public_key]Logo: [icon_url]资产名字:[name]资产在Mixin Network的uuid: [asset_key]对美元的价格(Coinmarketcap.com提供): [price_usd]存币时确认的区块数量:[confirmations]比特币私钥呢?比特币的私钥呢?这个私钥被Mixin Network通过多重签名保护,所以对用户来说是不可见的,比特币资产的提现和转账都需要用户提供正确的的RSA签名,PIN代码与会话密钥才能完成.不只是比特币,还有以太坊,EOS等这个帐号不只支持比特币,还支持以太坊,EOS等, 完整的区块链支持列表. 这个账户同时也支持所有的 ERC20 代币与 EOS 代币.创建其它的币的钱包与创建比特币钱包过程一样,读对应的资产余额就可以.Mixin Network 当前支持的加密货币 (2019-02-19)cryptouuid in Mixin NetworkEOS6cfe566e-4aad-470b-8c9a-2fd35b49c68dCNB965e5c6e-434c-3fa9-b780-c50f43cd955cBTCc6d0c728-2624-429b-8e0d-d9d19b6592faETC2204c1ee-0ea2-4add-bb9a-b3719cfff93aXRP23dfb5a5-5d7b-48b6-905f-3970e3176e27XEM27921032-f73e-434e-955f-43d55672ee31ETH43d61dcd-e413-450d-80b8-101d5e903357DASH6472e7e3-75fd-48b6-b1dc-28d294ee1476DOGE6770a1e5-6086-44d5-b60f-545f9d9e8ffdLTC76c802a2-7c88-447f-a93e-c29c9e5dd9c8SC990c4c29-57e9-48f6-9819-7d986ea44985ZENa2c5d22b-62a2-4c13-b3f0-013290dbac60ZECc996abc9-d94e-4494-b1cf-2a3fd3ac5714BCHfd11b6e3-0b87-41f1-a41f-f0e9b49e5bf0EOS的存币地址与其它的币有些不同,它由两部分组成: account_name and account tag, 如果你向Mixin Network存入EOS,你需要填两项数据: account name 是eoswithmixin,备注里输入你的account_tag,比如0aa2b00fad2c69059ca1b50de2b45569.EOS的资产余额返回结果如下:{‘data’: {’type’: ‘asset’, ‘asset_id’: ‘6cfe566e-4aad-470b-8c9a-2fd35b49c68d’,‘chain_id’: ‘6cfe566e-4aad-470b-8c9a-2fd35b49c68d’,‘symbol’: ‘EOS’, ’name’: ‘EOS’,‘icon_url’: ‘https://images.mixin.one/a5dtG-IAg2IO0Zm4HxqJoQjfz-5nf1HWZ0teCyOnReMd3pmB8oEdSAXWvFHt2AJkJj5YgfyceTACjGmXnI-VyRo=s128','balance': ‘0’, ‘public_key’: ‘’,‘account_name’: ’eoswithmixin’, ‘account_tag’: ‘70dae97b661ca9f80cb0e6549feeba6c’,‘price_btc’: ‘0.00092392’, ‘price_usd’: ‘3.58276497’,‘change_btc’: ‘-0.019294922814297986’, ‘change_usd’: ‘-0.0033825963089133683’,‘asset_key’: ’eosio.token:EOS’, ‘confirmations’: 64, ‘capitalization’: 0}}Account a8cefb2e-cb93-338f-aba7-32a3a635ad02 ’s EOS account name is eoswithmixin, wallet address is 70dae97b661ca9f80cb0e6549feeba6c存入比特币与读取比特币余额现在,你可以向比特币的钱包存币了。当然,在比特币网络里转币,手续费是相当贵的,费用的中位数在0.001BTC,按当前4000美元的价格,在4美元左右,有一个方便的办法,如果你有Mixin Messenger帐号,里面并且有比特币的话,可以直接提现比特币到新创建的帐号的比特币充值地址,它们在同一个Mixin Network网络内,手续费为0,而且1秒到账。下面的代码,可以读取比特币钱包余额.btcInfo = mixinApiNewUserInstance.getAsset(asset_id)print(“Account %s 's balance is %s " %(userid,btcInfo.get(“data”).get(“balance”)))Mixin Network网内免手续费的,并且即时确认任何币在Mixin Network内部的交易,都是无手续费的,并且立刻到账。前期准备: 账户设置了PIN对于新创建的帐号,我们通过updatePin来设置新PIN码, 代码如下:pinInfo = mixinApiNewUserInstance.updatePin(PIN,”")print(pinInfo)Mixin Network帐号之间的比特币支付通过Mixin Messenger,我们可以先转比特币给机器人,然后让机器人转币给新用户。mixinApiNewUserInstance = generateMixinAPI(private_key, pin_token, session_id, userid, pin,”")btcInfo = mixinApiBotInstance.transferTo(MASTER_UUID, BTC_ASSET_ID, AMOUNT, “")print(btcInfo)读取Bitcoin的余额,来确认比特币是不是转成功了! 注意$mixinSdkNew是新用户的。btcInfo = mixinApiNewUserInstance.getAsset(asset_id)print(“Account %s 's balance is %s " %(userid,btcInfo.get(“data”).get(“balance”)))如何将比特币存入你的冷钱包或者第三方交易所如果你希望将币存入你的冷钱包或者第三方交易所, 先要得到冷钱包或者你在第三方交易所的钱包地址,然后将钱包地址提交到Mixin Network.要点提示: 提现是需要支付收续费的,准备好比特币包地址!增加目的钱包地址到Mixin Network调用createAddress API, 将会返回一个address_id,下一步的提现操作会用到这个id。BTC_ASSET_ID = “c6d0c728-2624-429b-8e0d-d9d19b6592fa”;EOS_ASSET_ID = “6cfe566e-4aad-470b-8c9a-2fd35b49c68d”;BTC_WALLET_ADDR = “14T129GTbXXPGXXvZzVaNLRFPeHXD1C25C”;btcInfo = mixinApiBotInstance.createAddress(BTC_ASSET_ID, BTC_WALLET_ADDR,“BTC”,””,”")print(btcInfo)这里的 14T129GTbXXPGXXvZzVaNLRFPeHXD1C25C 就是一个比特币钱包地址, 如下所示,提现费用是0.0034802 BTC, address_id 是"345855b5-56a5-4f3b-ba9e-d99601ef86c1".{‘data’: {’type’: ‘address’,‘address_id’: ‘47998e2f-2761-45ce-9a6c-6f167b20c78b’,‘asset_id’: ‘c6d0c728-2624-429b-8e0d-d9d19b6592fa’,‘public_key’: ‘14T129GTbXXPGXXvZzVaNLRFPeHXD1C25C’, ’label’: ‘BTC’,‘account_name’: ‘’, ‘account_tag’: ‘’,‘fee’: ‘0.0034802’, ‘reserve’: ‘0’, ‘dust’: ‘0.0001’,‘updated_at’: ‘2019-02-26T00:03:05.028140704Z’}}如果你操作的是EOS, 示例代码如下:EOS_ASSET_ID = “6cfe566e-4aad-470b-8c9a-2fd35b49c68d”;EOS_WALLET_ADDR = “3e2f70914c8e8abbf60040207c8aae62”;EOS_ACCOUNT_NAME = “eoswithmixin”;eosInfo = mixinApiBotInstance.createAddress(EOS_ASSET_ID, “”,"",EOS_ACCOUNT_NAME,EOS_WALLET_ADDR)print(eosInfo)创建提现地址成功后,你可以用readAddress读取最新的提现费。addr_id = btcInfo.get(“data”).get(“address_id”)addrInfo = mixinApiBotInstance.getAddress(addr_id)print(addrInfo)提交提现请求,Mixin Network会即时处理提现请求.提交提现请求到Mixin Network, $btcInfo[“address_id”]就是createAddress创建的。 mixinApiBotInstance.withdrawals(btcInfo.get(“data”).get(“address_id”),AMOUNT,"")可以通过blockchain explore来查看进度.完整的代码在这儿 ...

February 26, 2019 · 2 min · jiezi

Python 比特币教程之二: 机器人收发比特币

在上一篇教程Python 比特币 教程 之一:创建机器人中, 我们创建了自动回复消息的机器人,当用户发送消息"Hello,World!“时,机器人会自动回复同一条消息。第二课: 机器人接受比特币并立即退还用户按本篇教程后学习后完成后,你的机器人将会接受用户发送过来的加密货币,然后立即转回用户。完整代码如下:app.pyfrom mixin_ws_api import MIXIN_WS_APIfrom mixin_api import MIXIN_APIimport mixin_configimport jsonimport timefrom io import BytesIOimport base64import gziptry: import threadexcept ImportError: import _thread as threaddef on_message(ws, message): inbuffer = BytesIO(message) f = gzip.GzipFile(mode=“rb”, fileobj=inbuffer) rdata_injson = f.read() rdata_obj = json.loads(rdata_injson) print(”——-json object begin———") print(rdata_obj) print("——-json object end———") action = rdata_obj[“action”] if rdata_obj[“data”] is not None: print(“data in message:",rdata_obj[“data”]) if rdata_obj[“data”] is not None and rdata_obj[“data”][“category”] is not None: print(rdata_obj[“data”][“category”]) if action == “CREATE_MESSAGE”: data = rdata_obj[“data”] msgid = data[“message_id”] typeindata = data[“type”] categoryindata = data[“category”] userId = data[“user_id”] conversationId = data[“conversation_id”] dataindata = data[“data”] created_at = data[“created_at”] updated_at = data[“updated_at”] realData = base64.b64decode(dataindata) MIXIN_WS_API.replayMessage(ws, msgid) print(‘userId’, userId) print(“created_at”,created_at) if categoryindata == “PLAIN_TEXT”: realData = realData.decode(‘utf-8’) print(“dataindata”,realData) MIXIN_WS_API.sendUserText(ws, conversationId, userId, realData) elif categoryindata == “SYSTEM_ACCOUNT_SNAPSHOT”: rdJs = json.loads(realData) if ( float(rdJs[“amount”]) > 0 ): mixin_api.transferTo(userId, rdJs[“asset_id”], rdJs[“amount”], “")if name == “main”: mixin_api = MIXIN_API(mixin_config) mixin_ws = MIXIN_WS_API(on_message=on_message) mixin_ws.run()Hello Bitcoin!在项目目录下,执行 python app.pycd mixin_labs-python-botsource ./bin/activate(mixin_labs-python-bot) wenewzha:mixin_labs-python-bot wenewzhang$ python app.pyws open——-json object begin———{‘id’: ‘fd6ce766-331a-11e9-92a9-20c9d08850cd’, ‘action’: ‘LIST_PENDING_MESSAGES’}——-json object end———开发者可以通过消息面板,给机器人转比特币,当机器人收到比特币后,马上返还给用户!事实上,用户可以发送任意的币种给机器人,它都能马上返还!源代码解释elif categoryindata == “SYSTEM_ACCOUNT_SNAPSHOT”: rdJs = json.loads(realData) if ( float(rdJs[“amount”]) > 0 ): mixin_api.transferTo(userId, rdJs[“asset_id”], rdJs[“amount”], “")如果机器人收到币,rdJs[“amount”] 大于零;如果机器人支付币给用户,接收到的消息是一样的,唯一不同的是,rdJs[“amount”]是一个负数.最后一步,调用SDK的 mixin_api.transferTo 将币返还用户!高级用法coming soon!Mixin Network的开发资源汇编 ...

February 22, 2019 · 1 min · jiezi

Python 比特币 教程 之一:创建机器人

Mixin Network 是一个免费极速的点对点加密数字货币交易系统.在本章中,你可以按教程在Mixin Messenger中创建一个bot来接收用户消息, 学到如何给机器人转比特币 或者 让机器人给你转比特币.Mixin Network的开发资源汇编课程简介创建一个接受消息的机器人机器人接受比特币并立即退还用户创建一个接受消息的机器人通过本教程,你将学会如何用Python创建一个机器人APP,让它能接受消息.Python 3 安装:本教程基于Python 3.7.2, 所以你需要安装Python 3.7.2 或 以上的版本.on macOSbrew upgradebrew install python@3on Ubuntu, 从第三方的APT源中安装.sudo apt updatesudo apt install software-properties-commonsudo add-apt-repository ppa:deadsnakes/ppa当出现下面的提示时,按"回车"继续.Press [ENTER] to continue or Ctrl-c to cancel adding it.重新更新一次apt源, 再安装python3.7, python3.7-venvsudo apt updatesudo apt install python3.7 python3.7-venvsudo ln -s /usr/bin/python3.7 /usr/bin/python3检查安装是否成功了,需要检查python3与python3-venv, 正确的提示如下:$ python3 -VPython 3.7.2root@n2:~ python3 -m venv -husage: venv [-h] [–system-site-packages] [–symlinks | –copies] [–clear] [–upgrade] [–without-pip] [–prompt PROMPT] ENV_DIR [ENV_DIR …]Creates virtual Python environments in one or more target directories.positional arguments: ENV_DIR A directory to create the environment in.optional arguments: -h, –help show this help message and exit –system-site-packages Give the virtual environment access to the system site-packages dir. –symlinks Try to use symlinks rather than copies, when symlinks are not the default for the platform. –copies Try to use copies rather than symlinks, even when symlinks are the default for the platform. –clear Delete the contents of the environment directory if it already exists, before environment creation. –upgrade Upgrade the environment directory to use this version of Python, assuming Python has been upgraded in-place. –without-pip Skips installing or upgrading pip in the virtual environment (pip is bootstrapped by default) –prompt PROMPT Provides an alternative prompt prefix for this environment.Once an environment has been created, you may wish to activate it, e.g. bysourcing an activate script in its bin directory创建 mixin_labs-python-bot 项目你首先需要创建项目目录,初始化"虚拟环境",然后安装需要的软件包.mkdir mixin_labs-python-botcd mixin_labs-python-botpython3 -m venv ./在 python3 -m venv 指令完成之后, 项目目录如下:wenewzha:mixin_labs-python-bot wenewzhang$ lsbin include lib pyvenv.cfg当"虚拟环境"创建成功后,需要激活它, 通过执行bin目录下相应的activate文件完成.wenewzha:mixin_labs-python-bot wenewzhang$ source ./bin/activate(mixin_labs-python-bot) wenewzha:mixin_labs-python-bot wenewzhang$成功激活后,可以直接执行python或pip了,这时,不再需要输入他们的完整路径了.在"虚拟环境"里安装必需的包创建一个必需包的listrequirements.txtcryptography==2.4.2pycparser==2.19pycryptodome==3.7.2PyJWT==1.7.1python-dateutil==2.7.5PyYAML==3.13requests==2.21.0websocket-client==0.54.0通过pip升级pip包本身, 并安装必需包.pip install –upgrade pippip install -r requirements.txt下载 Mixin Network的python 3的APIwget https://github.com/includeleec/mixin-python3-sdk/raw/master/mixin_ws_api.pywget https://github.com/includeleec/mixin-python3-sdk/raw/master/mixin_api.pywget https://github.com/includeleec/mixin-python3-sdk/raw/master/mixin_config.py你好,世界!创建第一个机器人APP按教程,到mixin.one创建一个APP[tutorial].生成相应的参数生成必要的参数并且记下来它们将用于mixin_config.py中.在项目目录下,创建mixin_config.py,将生成的参数,替换成你的!mixin_config.pyclient_id= ’ed882a39-0b0c-4413-bbd9-221cdeee56bf’client_secret = ‘8d7ec7b9c8261b6c7bd6309210496ca4b72bce9efc7e49be14a428ce49ff7202’pay_pin = ‘599509’pay_session_id = ‘bd53b6a4-e79a-49e5-ad04-36da518354f6’pin_token = “nVREh0/Ys9vzNFCQT2+PKcDN2OYAUSH8CidwHqDQLOCvokE7o6wtvLypjW9iks/RsnBM6N4SPF/P3bBW254YHGuDZXhitDEWOGkXs7v8BxMQxf+9454qTkMSpR9xbjAzgMXnSyHrNVoBtsc/Y+NvemB3VxPfsCOFHasiMqAa5DU=“private_key = “””—–BEGIN RSA PRIVATE KEY—–MIICXQIBAAKBgQCnaoO1SdPxggEpAIUdM/8Ll4FOqlXK7vwURHr4FFi6hnQ1I79gpZSlJdzjr24WcIuNi6kVdXVIpyzZJGXS2I72dpGs5h1jKxL8AWIUVL2axZXqTJNic4wj6GJ4gDRP2U9I9gae+S/frM6KP8TioV0OcbmrlfrwI0OElLH3363y1wIDAQABAoGAduaGLi4F8cMkMculvqzcGY57jrQZBGyg6YANWb2Rmr+9LrR5yhkvLe9rJuXEKPm7k0a6SnxGVNguWPWpv4qAVVGAJ0eb8ETXTRO20HlKmcbxfFdDtHBDV3QufNa1h3mNEsqWDNCDdAm7p/EZwfG2F9+nmeXLfip7R1I72qbK0wkCQQDiJR6NEGVwbj8HK8kRpzY1D9lPqp1ZMrma5AFYGZIb5voTxLjRpYdxQJHi7CCdE1zgqJOXvA3jj/iof7bMIJY7AkEAvYSSC5H+fUKAjyjeCTGJBBKoPDsq+aALAYLWf77sGXE9BBmhhY0liwmbj8X6/qZtQ0yEzdT/OSdiYL86CcrgFQJBALz/sMzMSzrvqJVhrqWmTdOC72d5fA+0KRKeQ9FRbZ8MJyymWKA96zhncoVoOsmMCS9pNBC4BhONm4+XTTrEcUkCQQCoDWB8Bg/G/yuExtZtDJHVHL41+rmW9UYNJvoR+TjfLrzOX/QMuyapbfGVwhdZrDaDUN0KsG9JPRVNeQR8HnwpAkACrr9cNp1H1bytHG9a6L+5cVHkRhqqEYWVO41MhgZF5bIKx5OXCJB2VwY7fjFet2KxTHGfEZt/khjFNZzVX7lN—–END RSA PRIVATE KEY—–“““需要替换的参数包括: client_id, client_secret, pay_pin, pin_token, pay_session_id, private key.创建 app-mini.py 文件, 内容如下:app-mini.pyfrom mixin_ws_api import MIXIN_WS_APIfrom mixin_api import MIXIN_APIimport mixin_configimport jsonimport timefrom io import BytesIOimport base64import gziptry: import threadexcept ImportError: import _thread as threaddef on_message(ws, message): inbuffer = BytesIO(message) f = gzip.GzipFile(mode=“rb”, fileobj=inbuffer) rdata_injson = f.read() rdata_obj = json.loads(rdata_injson) print(”——-json object begin———”) print(rdata_obj) print(”——-json object end———”) action = rdata_obj[“action”] if rdata_obj[“data”] is not None: print(“data in message:",rdata_obj[“data”]) if rdata_obj[“data”] is not None and rdata_obj[“data”][“category”] is not None: print(rdata_obj[“data”][“category”]) if action == “CREATE_MESSAGE”: data = rdata_obj[“data”] msgid = data[“message_id”] typeindata = data[“type”] categoryindata = data[“category”] userId = data[“user_id”] conversationId = data[“conversation_id”] dataindata = data[“data”] realData = base64.b64decode(dataindata) MIXIN_WS_API.replayMessage(ws, msgid) if ’error’ in rdata_obj: return if categoryindata == “PLAIN_TEXT”: realData = realData.decode(‘utf-8’) print(“dataindata”,realData) MIXIN_WS_API.sendUserText(ws, conversationId, userId, realData)if name == “main”: mixin_api = MIXIN_API(mixin_config) mixin_ws = MIXIN_WS_API(on_message=on_message) mixin_ws.run()运行 app-mini.py, 记得要先激活“虚拟环境”哦!(mixin_labs-python-bot) wenewzha:mixin_labs-python-bot wenewzhang$ python app-mini.py…如果一切正常,将会有如下提示:(mixin_labs-python-bot) wenewzha:mixin_labs-python-bot wenewzhang$ python app-mini.pyws open——-json object begin———{‘id’: ‘1c798948-30eb-11e9-a20e-20c9d08850cd’, ‘action’: ‘LIST_PENDING_MESSAGES’}——-json object end———在手机安装 Mixin Messenger,增加机器人为好友,(比如这个机器人是7000101639) 然后发送消息给它,效果如下!源代码解释WebSocket是建立在TCP基础之上的全双工通讯方式,我们需要建立一个loop循环来维持通迅。if name == “main”: mixin_api = MIXIN_API(mixin_config) mixin_ws = MIXIN_WS_API(on_message=on_message) mixin_ws.run()每接收到一个消息,需要按消息编号(message_id)给服务器回复一个"已读"的消息,避免服务器在机器人重新登入后,再次发送处理过的消息! MIXIN_WS_API.replayMessage(ws, msgid)机器人程序完整回复用户的信息if categoryindata == “PLAIN_TEXT”: realData = realData.decode(‘utf-8’) print(“dataindata”,realData) MIXIN_WS_API.sendUserText(ws, conversationId, userId, realData) Mixin Messenger支持的消息类型很多,具体可到下面链接查看: WebSocket消息类型.完成现在你的机器人APP运行起来了,开始玩吧。完整的代码在这儿 ...

February 21, 2019 · 3 min · jiezi

TiDB 社区成长足迹与小红花 | TiDB DevCon 2019

2018 年 TiDB 产品变得更加成熟和稳定,同时 TiDB 社区力量也在发展壮大。在 TiDB DevCon 2019 上,我司联合创始人崔秋带大家一起回顾了 2018 年 TiDB 社区成长足迹,在社区荣誉时刻环节,我们为新晋 Committer 授予了证书,并为 2018 年度最佳贡献个人/团队颁发了荣誉奖杯。<center>图 1 我司联合创始人崔秋</center>在我们眼里运营开源社区最重要的是两点,一个是人才,一个是用户。人才方面主要面向开发者,包括 TiDB Contributor、Committer 以及 TiDB 生态周边的开发者等等。另外更重要的一方面是用户。用户对 TiDB 的认识和经验、给予的反馈是更直观、更贴近业务的,并且用户实际应用的场景与我们自身测试的场景相比,会更复杂、更丰富,他们的使用经验会让大家更有共鸣,另外当用户使用 TiDB 过程中遇到一些问题,这时社区有良好的反馈,帮助用户顺利解决问题,会让用户对 TiDB 更有信心,就会考虑扩大使用的规模和深度,同时 TiDB 社区本身也会得到成长。所以,运营一个好的开源社区,更重要的是以用户为中心。2019 年我们也会秉承这个想法, 继续把「用户至上」的观念和理念发挥到极致,与用户一起成长。 ——崔秋Product<center>图 2 TiDB 产品架构</center>产品是开源社区的基石,好的产品是吸引人才、壮大社区力量的动力,而丰富产品架构、扩充生态周边也需要社区伙伴们的共同努力。2018 年,TiDB 在社区伙伴们共同努力下发布了 2.1 GA 版本。我们也开源了 TiDB-Operator、TiDB-DM、TiDB-Lightning 等生态工具,大家可以一起来为 TiDB 添砖加瓦。<center>图 3 TiDB 产品生态</center>本着「从开源项目中获益,同时回馈开源社区」的想法,我们持续为 RocksDB、etcd 等开源项目贡献力量。同时,我们也将 grpc-rs、raft-rs 、rust-rocksdb、parser 等项目独立出来(在 github/pingcap 组织下),方便大家了解和运用。而更加令人欣喜的是,有一些开源项目正在 TiDB 生态上衍生成长起来,进一步丰富了 TiDB 生态:<center>图 4 基于 TiDB 生态的开源项目:Gravity/Titan/Soar</center>Events2018 年,TiDB 社区受到了更多国内外媒体的关注,获得了 InfoWorld | Bossie Awards 最佳数据存储与数据分析平台奖,并入选了两个重要的「Landscape」:FirstMark: Big Data & AI Landscape 2018CNCF: Cloud Native Interactive Landscape<center>图 5 TiDB 获得 InfoWorld | Bossie Awards 最佳数据存储与数据分析平台奖</center><center>图 6 TiDB 入选 Big Data & AI Landscape 2018 和 Cloud Native Interactive Landscape</center>外界激励是一方面,另一方面我们也积极为社区小伙伴们创造交流、碰撞的平台。例如,在 2018 年 12 月初,我们举办了 TiDB Hackathon。经过两天一夜的「极限脑力竞技」,诞生了一系列基于 TiDB 生态的有意思的项目,希望这些项目可以在社区力量的帮助下延续下去:TBSSQL (TiDB Batch and Streaming SQL) TiDB LaboratoryTiDB 支持多种外部数据源的访问PD 热点调度贝叶斯模型TiEyeTiQueryContent内容分享至上。我们一直希望大家能够懂得开源、分享的精神,主动传播技术知识、分享推动项目进展背后的逻辑,让每个人都成为 Blogger,让社区拥有更好的信息传递和交流的氛围。所以,我们在 2018 年输出了一系列用户实践(pingcap.com/cases-cn/)、TiDB 源码阅读、产品原理介绍、开源社区参与指南等技术文章。图 6 中标红的 TiKV 源码解析系列文章正在「挖坑」中,敬请期待。<center>图 7 2018 年技术内容输出</center>除了这些线上文字分享,我们也把内部 Paper Reading 活动放到了线上直播平台(Bilibili ID: TiDB_Robot),开放给了社区小伙伴们。因为 TiDB 的发展已经进入新型分布式数据库领域的深水区,我们需要借助前沿学术研究,结合用户的反馈建议和自己的灵感,探索 TiDB 未来方向的细节展开和落地方案,所以非常希望通过 Paper Reading 活动可以和大家共同学习和讨论。Community Plan2018 年我们启动了三个社区培训计划,面向不同的人群,设置了一系列线上/线下培训课程,帮助大家了解和使用 TiDB,甚至能够独立部署、运维、调优 TiDB。2019 年我们会深入推进这些计划,感兴趣的同学可以报名加入。PingCAP University<center>图 8 PingCAP University</center>报名:university-cn@pingcap.com通过 PingCAP University 培训/认证,能获得什么?深度理解 TiDB 架构、原理以及最佳实践,具备独立部署、运维和调优 TiDB 的能力。理论与实践相结合,强调实际动手能力,提高前沿技术视野,培养新一代 NewSQL 数据库优秀人才。获得来自 PingCAP 官方的专业技术能力认可。未来计划:面向用户的线上课程设计实现 面向开发者的课程设计实现TiDB AcademyTiDB for MySQL DBAs(主要面向海外用户)https://pingcap.com/tidb-acad…<center>图 9 TiDB academy 网站页面</center>TiDB Talent Plan<center>图 10 第一期 TiDB Talent Plan</center>第一期 TiDB Talent Plan 于 2018 年12 月 12 日落幕,六位学员顺利结业。后续我们希望把 Talent Plan 的课程从线下拓展到线上,让更多对 TiDB 社区感兴趣的小伙伴可以从中找到组织,参与学习交流和深入实践。<center>图 11 第一期 TiDB Talent Plan 课程设置</center>除此之外,我们计划在 2019 年以北京、上海、硅谷等 7 个城市/地区为落脚点,成立 TiDB User Group ,力求「让用户驱动用户」,共同打造更好、更强的 TiDB 生态。同时也让更多小伙伴有机会参与社区培训计划的课程设计、线上线下培训、社群活动组织等等。Moment of Glory回顾了 2018 年社区发展和未来计划之后,我们为 2018 年度 TiDB 社区活跃贡献者、最佳贡献个人&团队颁发了荣誉奖杯,并为新晋 Committer 授予证书。2018 TiDB Active Contributorsbb7133 (TiDB TiKV)niedhui (TiKV)yangwenmai (TiDB)andrewdi (TiDB)mathspanda (TiDB Operator)2018 最佳社区贡献奖spongedu (Du Chuan)<center>图 12 崔秋为 spongedu 颁发荣誉奖杯</center>32 PRs (TiDB) 10 PRs (TiKV)Important FeaturesTiDB 2.0 SQL engine refactorAdd chunk support for HashAggBug Fixes17+ bug fixes (optimizer, executor, parser, expression)参加 TiDB Hackathon(TBSSQL 队)获得一等奖&最佳贡献奖美团点评分布式数据库项目组<center>图 13 崔秋为美团点评分布式数据库项目组负责人颁发荣誉奖杯</center>上线 20+ 套业务集群,200+节点高质量美团最佳实践文章一篇10+ PRs, 50+ issues10+ Engineerszhongleihe / yu34po / guozhulang / zhaoxiaojie0415 / 18610314061 / wu-xiang / andyqzb / nettedfish / iamzhoug37 / Y-Rookie / benmaoer / pengjiImportant FeatuesSQL Plan ManagementIndex join optimization (WIP) Rowid scan optimization (WIP)2018 TiDB New CommittersTiKV New Committer: sunxiaoguang(知乎)8 PRsAdd Rust client support (Raw API)Add Batch Raw API support (put/get/delete/scan)<center>图 14 TiDB Committer 李雨来为 sunxiaoguang 授予证书</center>TiDB New Committer: dbjoa (Samsung)15 PRsAdd prepare plan cache support (Insert / Update / Delete)<center>图 15 dbjoa 由于行程原因没有到场 他录制了一段视频,为 TiDB 社区送上祝福</center>1 月 19 日 TiDB DevCon 2019 在北京圆满落幕,超过 750 位热情的社区伙伴参加了此次大会。会上我们首次全面展示了全新存储引擎 Titan、新生态工具 TiFlash 以及 TiDB 在云上的进展,同时宣布 TiDB-Lightning Toolset & TiDB-DM 两大生态工具开源,并分享了 TiDB 3.0 的特性与未来规划,描述了我们眼中未来数据库的模样。此外,更有 11 位来自一线的 TiDB 用户为大家分享了实践经验与踩过的「坑」。同时,我们也为新晋 TiDB Committer 授予了证书,并为 2018 年最佳社区贡献个人、最佳社区贡献团队颁发了荣誉奖杯。 ...

February 14, 2019 · 2 min · jiezi

猪年KubeCon + CloudNativeCon + Open Source Summit多元化奖学金信息

上海世博中心 Shanghai Expo Centre | 中国上海 Shanghai, China2019年6月24日至26日,KubeCon + CloudNativeCon和Open Source Summit将在中国共同举办一场活动。KubeCon + CloudNativeCon是CNCF的旗舰论坛,此次论坛汇聚了领先的开源和云原生社区的采用者和技术专家。与 Kubernetes, Prometheus, Envoy, CoreDNS, OpenTracing, Fluentd, gRPC, containerd, rkt, CNI, Jaeger, Notary, TUF, Vitess, NATS, Linkerd, Helm, Harbor 和etcd等等一起齐聚此为期三天的论坛,进一步推动云原生的教育和发展。Open Source Summit(开源峰会),前身为LinuxCon + CloudOpen + ContainerCon China(LC3),汇集了技术专家和开源行业领导者,使其共同合作,分享信息,了解最新、最有趣的开源技术,包括Linux、IoT、区块链、AI,网络和更多。多元化奖学金信息CNCF的多元化奖学金项目,为科技和/或开源社区中由于经济原因,而可能没有机会参加CNCF活动的,处于弱势的少数派或边缘化群体(包括但不限于LGBTQ:识别为女同性恋者、男同性恋者、双性恋者、跨性别者、对其性别认同感到疑惑者,女性,有色人种和/或残障人士)提供支持。我们为奖学金获得者,提供高达1500美元的实际差旅费用报销。请注意,您将负责直接安排及预订酒店和航班。您将在活动结束后,获得最高为1500美元的差旅津贴。津贴只能用于以下方面:差旅机票,酒店/住宿(最多四晚)和地面交通(往返机场)。奖学金获得者,还将获得免费的会议注册及会议期间的膳食。奖学金的甄选标准,将基于需求和影响力的结合。评审组委会将对每位申请人的请求,作出评估及选择。所有申请信息都将被保密。奖学金申请截止日期:2019年4月15日,星期一奖学金结果通知日期:2019年5月13日,星期一点此申请多元化奖学金2019年KubeCon + CloudNativeCon中国论坛提案征集(CFP)现已开放KubeCon + CloudNativeCon 论坛让用户、开发人员、从业人员汇聚一堂,面对面进行交流合作。与会人员有 Kubernetes、Prometheus 及其他云原生计算基金会 (CNCF) 主办项目的领导,和我们一同探讨云原生生态系统发展方向。2019年中国开源峰会提案征集(CFP)现已开放在中国开源峰会上,与会者将共同合作及共享信息,了解最新和最有趣的开源技术,包括Linux、IoT、区块链、AI、网络等;并获得如何在开源社区中导向和引领的信息。大会日期:提案征集截止日期:太平洋标准时间 2 月 22 日,星期五,晚上 11:59提案征集通知日期:2019 年 4 月 8 日会议日程通告日期:2019 年 4 月 10 日会议活动举办日期:2019 年 6 月 24 至 26 日提醒:这是一场社区会议。因此,让我们尽量避开公然推销产品和/或供应商销售宣传。2019年KubeCon + CloudNativeCon + Open Source Summit赞助方案出炉啦 ...

January 29, 2019 · 1 min · jiezi

TiDB-Lightning Toolset & TiDB-DM 正式开源,前排开“坑”、PR 走起!

在刚刚结束的 TiDB DevCon 2019 上,我们宣布将大家期待已久的 TiDB-Ligthning Toolset 和 TiDB-DM 开源(惊不惊喜、意不意外?!),感兴趣的小伙伴们赶紧前排关注一波,开“坑(issues)”讨论,PR 走起!TiDB-Lightning ToolsetTiDB-Lightning Toolset 是一套快速全量导入 SQL dump 文件到 TiDB 集群的工具集,自 2.1.0 版本起随 TiDB 发布,最新的测试结果显示,速度可达到传统执行 SQL 导入方式的至少 5 倍,导入 1T 数据需要 5 ~ 6 个小时,适合在上线前用作迁移现有的大型数据库到全新的 TiDB 集群。原理解读:TiDB-Lightning Toolset 介绍项目地址:github.com/pingcap/tidb-lightningTiDB-DMTiDB-DM(Data Migration)是用于将数据从 MySQL/MariaDB 迁移到 TiDB 的工具。该工具既支持以全量备份文件的方式将 MySQL/MariaDB 的数据导入到 TiDB,也支持通过解析执行 MySQL/MariaDB binlog 的方式将数据增量同步到 TiDB。特别地,对于有多个 MySQL/MariaDB 实例的分库分表需要合并后同步到同一个 TiDB 集群的场景,DM 提供了良好的支持。如果你需要从 MySQL/MariaDB 迁移到 TiDB,或者需要将 TiDB 作为 MySQL/MariaDB 的从库,DM 将是一个非常好的选择。原理解读:TiDB-DM 架构设计与实现原理项目地址:github.com/pingcap/dm

January 21, 2019 · 1 min · jiezi

2018年你们最爱的编程语言发生了什么有趣变化?

近日,码云 Gitee 发布了2018年度报告,对编程语言趋势、最受欢迎的开源项目情况都做了数据统计和结果展示,可以让开发者从中透视本土开源现状,快速了解国内开源生态。本次报告相关的内容包括:2018编程语言趋势2018新增开源项目语言分布及功能分布2018最热门开源项目国内开发者地域、年龄、性别分布数据来源于码云Gitee全站项目统计结果

December 26, 2018 · 1 min · jiezi

android沉浸式状态栏封装—教你玩出新花样

项目中我们有时候都要用的透明状态栏(这里也成沉浸式状态栏),今天介绍一个gyf-dev写的一个封装状态栏开源框架效果图如下:正文从Android4.4开始,才可以实现状态栏着色,并且从5.0开始系统更加完善了这一功能。之前写过关于一篇 关于activity状态栏的一些总结有关Activity样式 、状态栏透明、屏幕亮度问题应用场景及其总结说明这是状态栏 这是导航栏(有些手机没有导航栏) [](https://github.com/gyf-dev/Im…第一种方案: 可直接在主题中设置 getWindow().setBackgroundDrawable(null); //设置透明状态栏 ViewGroup contentFrameLayout = (ViewGroup) findViewById(Window.ID_ANDROID_CONTENT); View parentView = contentFrameLayout.getChildAt(0); if (parentView != null && Build.VERSION.SDK_INT >= 14) { parentView.setFitsSystemWindows(true); }或者也可以这样 :第二种方案:将布局延伸到状态栏来处理,这次我们使用android:fitsSystemWindows=”true”属性,不让布局延伸到状态栏,这时状态栏就是透明的,然后添加一个和状态栏高、宽相同的指定颜色View来覆盖被透明化的状态栏。我们一步步来实现。1、第一步还是先将状态栏透明化,方法同上。2、在布局文件中添加android:fitsSystemWindows=”true”属性:封装: ImmersionBar.with(this) .transparentStatusBar() //透明状态栏,不写默认透明色 .transparentNavigationBar() //透明导航栏,不写默认黑色(设置此方法,fullScreen()方法自动为true) .transparentBar() //透明状态栏和导航栏,不写默认状态栏为透明色,导航栏为黑色(设置此方法,fullScreen()方法自动为true) .statusBarColor(R.color.colorPrimary) //状态栏颜色,不写默认透明色 .navigationBarColor(R.color.colorPrimary) //导航栏颜色,不写默认黑色 .barColor(R.color.colorPrimary) //同时自定义状态栏和导航栏颜色,不写默认状态栏为透明色,导航栏为黑色 .statusBarAlpha(0.3f) //状态栏透明度,不写默认0.0f .navigationBarAlpha(0.4f) //导航栏透明度,不写默认0.0F .barAlpha(0.3f) //状态栏和导航栏透明度,不写默认0.0f .statusBarDarkFont(true) //状态栏字体是深色,不写默认为亮色 .flymeOSStatusBarFontColor(R.color.btn3) //修改flyme OS状态栏字体颜色 .fullScreen(true) //有导航栏的情况下,activity全屏显示,也就是activity最下面被导航栏覆盖,不写默认非全屏 .hideBar(BarHide.FLAG_HIDE_BAR) //隐藏状态栏或导航栏或两者,不写默认不隐藏 .addViewSupportTransformColor(toolbar) //设置支持view变色,可以添加多个view,不指定颜色,默认和状态栏同色,还有两个重载方法 .titleBar(view) //解决状态栏和布局重叠问题,任选其一 .statusBarView(view) //解决状态栏和布局重叠问题,任选其一 .fitsSystemWindows(true) //解决状态栏和布局重叠问题,任选其一,默认为false,当为true时一定要指定statusBarColor(),不然状态栏为透明色 .supportActionBar(true) //支持ActionBar使用 .statusBarColorTransform(R.color.orange) //状态栏变色后的颜色 .navigationBarColorTransform(R.color.orange) //导航栏变色后的颜色 .barColorTransform(R.color.orange) //状态栏和导航栏变色后的颜色 .removeSupportView(toolbar) //移除指定view支持 .removeSupportAllView() //移除全部view支持 .navigationBarEnable(true) //是否可以修改导航栏颜色,默认为true .navigationBarWithKitkatEnable(true) //是否可以修改安卓4.4和emui3.1手机导航栏颜色,默认为true .fixMarginAtBottom(true) //当xml里使用android:fitsSystemWindows=“true"属性时,解决4.4和emui3.1手机底部有时会出现多余空白的问题,默认为false,非必须 .addTag(“tag”) //给以上设置的参数打标记 .getTag(“tag”) //根据tag获得沉浸式参数 .reset() //重置所以沉浸式参数 .keyboardEnable(true) //解决软键盘与底部输入框冲突问题,默认为false,还有一个重载方法,可以指定软键盘mode .init(); //必须调用方可沉浸式使用方式第一步:基础用法(已经可以满足日常沉浸式)ImmersionBar.with(this).init();第二步在activity的onDestroy方法中执行ImmersionBar.with(this).destroy(); //不调用该方法,如果界面bar发生改变,在不关闭app的情况下,退出此界面再进入将记忆最后一次bar改变的状态建议建议在BaseActivity中初始化和销毁,可以参看demo中BaseActivitypublic class BaseActivity extends AppCompatActivity { private ImmersionBar mImmersionBar; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); mImmersionBar = ImmersionBar.with(this); mImmersionBar.init(); //所有子类都将继承这些相同的属性 } @Override protected void onDestroy() { super.onDestroy(); mImmersionBar.destroy(); //不调用该方法,如果界面bar发生改变,在不关闭app的情况下,退出此界面再进入将记忆最后一次bar改变的状态 } }如何 隐藏导航栏或状态栏 /** * 隐藏导航栏或状态栏 * * @param barHide the bar hide * @return the immersion bar */ public ImmersionBar hideBar(BarHide barHide) { mBarParams.barHide = barHide; if (Build.VERSION.SDK_INT == Build.VERSION_CODES.KITKAT || OSUtils.isEMUI3_1()) { if ((mBarParams.barHide == BarHide.FLAG_HIDE_NAVIGATION_BAR) || (mBarParams.barHide == BarHide.FLAG_HIDE_BAR)) { mBarParams.navigationBarColor = Color.TRANSPARENT; mBarParams.fullScreenTemp = true; } else { mBarParams.navigationBarColor = mBarParams.navigationBarColorTemp; mBarParams.fullScreenTemp = false; } } return this; }部分问题解决华为emui3.0或者3.1手机手动隐藏导航栏按钮时,导航栏背景未被隐藏的问题什么叫做手动隐藏,就是下图中标红的向下隐藏按钮 第一种解决方案,监听华为虚拟按钮,建议在baseActivity里使用 @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); immersionBar = ImmersionBar.with(this); immersionBar.init(); if (OSUtils.isEMUI3_1()) //解决华为emui3.0与3.1手机手动隐藏底部导航栏时,导航栏背景色未被隐藏的问题 getContentResolver().registerContentObserver(Settings.System.getUriFor (“navigationbar_is_min”), true, mNavigationStatusObserver); } private ContentObserver mNavigationStatusObserver = new ContentObserver(new Handler()) { @Override public void onChange(boolean selfChange) { int navigationBarIsMin = Settings.System.getInt(getContentResolver(), “navigationbar_is_min”, 0); if (navigationBarIsMin == 1) { //导航键隐藏了 immersionBar .transparentNavigationBar() .init(); } else { //导航键显示了 immersionBar .navigationBarColor(android.R.color.black) .fullScreen(false) .init(); } } };第二种解决方案,禁止对导航栏相关设置 ImmersionBar.with(this) .navigationBarEnable(false) //禁止对导航栏相关设置 //或者 // .navigationBarWithKitkatEnable(false) //禁止对4.4设备导航栏相关设置 .init();android 6.0 有导航栏效果项目地址:https://github.com/androidsta…gyf-dev的博客地址:https://github.com/gyf-dev/Im…博客地址:http://blog.csdn.net/androids…如果你觉得此文对您有所帮助,欢迎入群 QQ交流群 :232203809 微信公众号:终端研发部 ...

December 19, 2018 · 2 min · jiezi

快速开发android,离不开这10个优秀的开源项目

作为一名菜鸡Android,时常瞻仰大佬们的开源项目是非常必要的。这里我为大家收集整理了10个优秀的开源项目,方便我们日常开发中学习!作者:ListenToCode博客:https://www.jianshu.com/p/974…KnowWeatherGitHub地址https://github.com/SilenceDut…)一款 Android 开源天气 App ,包含天气信息、详情、生活指数等,通知栏,桌面小部件,定时更新天气等等,应用没有任何广告,支持县级、区级城市的天气,原文:https://www.diycode.cc/projec…整体框架根据实际项目浅谈Android项目中的框架搭建(https://silencedut.github.io/…)关于知天气——天气尽在掌握之中(https://silencedut.github.io/…——天气尽在掌握之中/)特点支持县级、区级天气JobScheduler与JobService的使用轮询系统定时更新天气实现很多定制化很大的,对后台任务严苛的系统中(如魅族系统)通知栏常驻,并且轮询系统正常运行,很多下载量千万级的天气应用无法达到此效果无广告和强制保活拉活的行为FolioReader-AndroidGitHub地址https://github.com/FolioReade…一个 Android 开源电子书(ePub)阅读 App ,原文:https://www.diycode.cc/projec…效果图GradleAdd following dependency to your app build.gradlecompile ‘com.folioreader:folioreader:0.2.3’NBAPlusGitHub地址https://github.com/SilenceDut…一个 Android 开源 NBA 资讯和赛事信息的平台 App效果图特点遵循Android开发最佳实践的一种具体实践Retrofit2.0+RxJava+EventBus+GreenDao的使用代码结构清晰,扩展性强,易复用到其他项目结合NBAPlus Server 学习后台开发知识和接口的设计动态Blur效果。关于NBA资讯和赛事信息的平台。 全面、方便、快捷的获取新闻动态、比赛数据。 无广告、推送信息,不后台常驻,空间占用小。web后台部分在这:NBAPlus Server(https://github.com/SilenceDut…)MyDiaryGitHub地址https://github.com/DaxiaK/MyD…动漫《你的名字》同款 Android 开源 App,原文:https://www.diycode.cc/projec…效果图简诗GitHub地址https://github.com/wingjay/ji…一款优雅的中国风记录 app,包括 Android 端和 Server 端,原文:https://www.diycode.cc/projec…相关博客如何在一天之内完成一款具备cool属性的Android产品_简书(https://www.jianshu.com/p/cf4…)banyaGitHub地址(https://github.com/forezp/banya)一个基于豆瓣 API 仿网易云音乐的开源项目。原文:https://www.diycode.cc/projec…项目介绍:整体采用material design 风格,本人是网易云音乐的粉丝,所以界面模仿了网页云音乐,另外,项目中尽量使用了5.0之后的新控件。项目整体采用mvp+rxjava+retrofit 框架,使用glide进行图片展示,用butterknif注解,另外使用了java 8 新特性,拉姆达表达式,安卓原生并不支持,需要导插件,具体见项目。并对retrofit的okhttpClient进行了缓存配置,很遗憾,豆瓣API在服务端并没有对返回数据进行Cache-Control 设置。后续会采用本地数据库对数据进行缓存,初步定为使用realm。项目地址:https://github.com/forezp/banya主界面采用material design 设计风格,使用了NavigationView和DrawerLayout的抽屉效果,CoordinatorLayout和viewpager 配合,使用behavior属性,对toolbar的显示和隐藏进行了控制。使用了tablayout和viewpager配合,切换fragment,整体风格类似于网易云音乐。用到的豆瓣API有热映榜、top250、搜索图书、搜索音乐,等。yaseaGitHub地址https://github.com/begeekmyfr…带美颜滤镜的 Android 直播推流开源客户端项目,通过手机摄像头和麦克风采样,编码为H.264和AAC,再封装FLV格式,推送至RTMP服务器。延迟达到毫秒级别。Coding-AndroidGitHub地址https://github.com/Coding/Cod…编译环境 Android Studio 2.2.3,用gradle引用的许多第三方库,第一次加载会有点慢,加载完毕后要build一下,这些待下划线的类(比如 MainActivity_)会在build之后自动生成。包说明common 基类和工具类comment 评论区enter 输入框network 对网络做了一点封装photopick 图片多选控件umeng 封装了umenghide 进入staging界面maopao 冒泡界面message 消息界面model 一些数据结构project 我的项目界面setting 设置界面task 我的任务界面third 一些第三方代码user 好友界面SprayscapeGitHub地址https://github.com/googlecrea…原文https://www.diycode.cc/projec…Sprayscape内置于Unity,支持原生Android。使用适用于Unity的Google VR SDK处理陀螺仪数据和使用NatCam Unity插件进行精确的相机控制,Sprayscape将相机输入映射到360度球体上。GPU使一切成为可能。在用户点击或触摸时,相机进给以每秒60帧的纹理渲染。然后,通过GPU上的片段着色器将该纹理与任何现有纹理合成。同样的着色器还处理从2D相机到360球体的投影,创建您在app中看到的景观。当用户保存景观时,平面全景图像存储在应用数据中并写入包含所有景观的单个图集文件。地图集被加载到景观中,带有陀螺仪导航的景观画廊。共享由原生Android代码处理。当用户通过链接共享景观时,用户将使用Google OAuth登录并提示您在云端硬盘上进行读写访问。所有用户生成的内容都存储在用户的云端硬盘帐户中,因此用户可以随时删除其内容。有了适当的权限,Drive API v3会检查Sprayscape文件夹,如果缺少,则创建一个,然后上传文件。共享URL在“本机共享”对话框中呈现给用户,并且还附加到应用程序上的scape对象,以便日后轻松共享。Facebook的份额也是本地处理的。全景图被准备为具有适当EXIF数据的图像对象,以确保在Facebook上正确呈现,然后通过原生共享呈现给用户。用户选择Facebook分享到他们的网络。ListenerrMusicPlayerGitHub地址https://github.com/hefuyicode… 一款优雅的遵循 Material Design 的开源音乐播放器,UI参考 腾讯轻听 音乐播放器,使用 Lastfm Api 与 酷狗歌词Api。项目架构采用 mvp-clean,基于 Retrofit2 + Dagger2 + Rxjava + RxBus + Glide。项目特点遵循 Material Design 规范,界面清新,交互优雅。基于 MVP-CLEAN + Retrofit2 + Dagger2 + Rxjava + Glide功能模块: 我的歌曲、我的歌单、文件夹、我喜欢、最近播放、最近添加、播放排行、本地搜索等。支持显示歌词及缓存支持耳机线控播放,耳机拔出自动暂停动态刷新媒体库,及时获知媒体文件变更日夜间模式切换,支持动态换肤阅读更多面试官:请你介绍一下你的项目经验Google费尽心力推出了一个新的项目架构Android 应用防止被二次打包指南NDK项目实战—高仿360手机助手之卸载监听(Android)面试题级答案(精选版)相信自己,没有做不到的,只有想不到的在这里获得的不仅仅是技术! ...

December 17, 2018 · 1 min · jiezi

制定通用的标准:评估 PoW 共识协议的安全性

Nervos 研究员张韧博士在 Master Workshop 中发表了题为「Lay Down the Common Metrics:Evaluating Proof-of-Work Consensus Protocols’Security」的主题演讲,该主题演讲本身是关于多个共识协议。基于可行性的考虑,张韧博士选取了 6 个共识协议在此做讲解。以下为我们整理的演讲文字稿,供大家参考学习,可观看演讲视频。在 Nakamoto 共识协议(Nakamoto Consensus 图片中简称 NC)中,为解决分叉问题,矿工们被要求在可能的情况下选择最长的链;在没有最长链时,矿工选择第一个接收到的区块加入到主链中。在发放奖励方面,主链区块会获得全部奖励,而孤块什么也得不到。这样是否足够安全?Nakamoto 共识的原始分析倾向于认为区块链本身具备完美的链质量,即低于全网 50% 算力的攻击者是无法修改区块链的。然而实际上攻击者完全可以有非常高的成功率去修改区块链。有三种攻击方式会修改区块链:自私挖矿(Selfish Mining)、双花(Double Spending)和审查攻击(Censorship Attack)。其中,自私挖矿的攻击者可以获得与其算力不成正比的、不公平的区块奖励。他们可以将挖矿算力集中起来去获得更高的相对区块奖励,从而破坏区块链的去中心化特性;在双花攻击中,攻击者可以逆转已确认的交易,将自己利益最大化;审查攻击情况下,攻击者阻止交易被确认,造成诚实矿工的经济损失。三种攻击 Three Attacks自私挖矿红色方块表示块被传播到网络的时间,然后橙色圆圈表示攻击者的区块,三角形表示被诚实矿工挖出的区块。攻击者很幸运地找到了第一个区块,但没有将其发布到网络上,而是选择了扣留这个区块。当诚实矿工找到一个块时,攻击者会在这时候抢在诚实矿工之前广播之前扣留的区块,则之后所有的矿工都将在攻击者的区块而不是诚实矿工的区块上挖矿。如果攻击者足够幸运,能够连续找到多个区块,那么攻击者就可以毫无风险地孤立一个诚实区块。在这种情况下,攻击者的的链变得更长,并且全网的算力会到它的链上挖矿。通过这种方式,攻击者成功地增加了在整体区块奖励中获得的相对比例。双花攻击双花攻击与自私挖矿攻击非常相似,是通过秘密挖矿来获得额外奖励。如比特币中,按照惯例有 6 个区块确认交易后基本是完全确认了。如果攻击者秘密地扣留了 6 个区块,并一次性将它们广播到网络中,他就能够在收到商品或者服务之后逆转这个交易。审查攻击审查攻击试图孤立所有不符合审查要求的块,即我要广播我要审查的这些交易,如果你不听从我的命令,我会尽力孤立你的块。两种解决方法下面我们来说说解决 Nakamoto 共识安全问题的两种方法。第一大类我们称之为「更佳链质量」协议。如图所示这一大类中有很多协议,这些协议声称它们可以提高链的质量。这次我将重点介绍「最小哈希平局打破协议(Smallest hash tie-breaking protocol ,简称 SHTB)」 和 「不可预测的确定性平局打破协议(Unpredictable deterministic tie-breaking,简称 UDTB)」。第二大类称为「抗攻击」(Attack-resistant protocols)协议。这些协议声称,他们可以在链的质量并不完美的情况下抵御攻击,因此他们不需要提高链的质量。抗攻击协议的三种类型第一种是「全部奖励」(Reward-all)协议。这类协议给大多数最近做了工作量证明的以奖励, 符合要求的块无论如何都会获得奖励,如此攻击者无法进行自私挖矿攻击来迫使诚实矿工的奖励无效,从而攻击者没有动机进行自私挖矿攻击。 第二个被称为「惩罚」(Punishment)协议。这些协议将没收那些可疑的区块的奖励。惩罚规则希望通过损失厌恶, 让所有人不得不遵守协议。 第三个被称为「幸运奖励」(Reward-lucky)协议。这些协议根据区块内容对某些幸运区块进行奖励,希望这些幸运区块作为稳定网络的「锚点」。 接下来让我们更深入地了解这些协议。 首先我们分析 「更佳链质量」这一类协议,首先是「最小哈希平局打破协议」。在这个协议中,每当有平局时,协议都要求所有矿工选择哈希最小的块,不管它首先接收的是谁。 第二个称为「不可预测的确定性平局打破协议」。该协议规定,每当有平局时,每个人都使用不可预知的确定性伪随机函数来计算所有参与竞争链的顺序,而不管首先接收哪一个块。不可预测的确定性协议背后的原理是,由于攻击者无法预测他是否会以超过 50% 的几率赢得整块竞争,进行自私挖矿攻击是不明智的(因此不会选择这么做)。对于抗攻击协议,我会从每种技术方法中选择一种协议来分析。对于「全部奖励」协议我们来分析水果链。在水果链中,对两种不同的产品使用了相同的挖矿程序。如果一个候选区块的哈希值最前面的 k bits 小于某个阈值,那么就判断它是一个块;如果某个候选区块的哈希值最后的 k bits 小于某个阈值,那么就判断它是水果。因此,当你运行哈希算法时,你可能会得到一个区块,也可能是得到一个水果。该协议和 Nakamoto 共识一样,遵循最长链原则,并且根据最先收到的区块打破平局。对于所有抵抗攻击协议,我们使用 Nakamoto 共识作为其分叉解决的规则。因此,当我们分析他们的攻击抗性时,他们被置于同一规则下。水果是嵌入在区块中的。你可以把水果想象成 Nakamoto 共识中的交易,这个交易只是被嵌入到了水果中。每个水果都有一个指针块,这是一个最近的块,水果矿工不会被孤立 。图中香蕉块的指针就是这样一个案例,如果指针块在主链中,则水果是有效的。如果指针块是孤块,就像图上的番茄一样,那么这个水果不再是有效的水果。还有一个额外的规则,即水果出块的间隔需要小于预定义的超时阈值。间隔定义为主区块和指针区块之间的区块高度差。比如,香蕉的间隔就是 2,这是因为主区块比指针区块晚 2 个区块。因此有效水果获得全额奖励,而区块则没有获得任何奖励。对于惩罚协议,我们选择 DECOR 协议修改版本作为案例来讲解。在我们的修改版本中,我们将其称为「奖励分配」(Reward-Splitting ,简称 RS)协议,顾名思义,奖励在所有相同高度的竞争区块之间平分。这个协议允许一个区块引用之前的孤块为叔块,如果其间隔是低于超时阈值的,那么这个叔块就是有效的(也会获得一定的奖励)。这是在奖励分配协议中间隔的定义和水果链类似。不同在于,在此协议中,间隔被定义为主区块和叔块的高度差,而不是主区块和指针区块的高度差。所以我们不考虑区块的亲缘关系,只考虑该区块本身的高度。每个区块奖励在相同高度的竞争区块和叔块之间平均分配。例如,在这个图中,区块 B 和区块 C 分别得到了一半的区块奖励,区块 A 和区块 D 则获得全部的区块奖励。最后一个是子链。子链也是采用相同的挖矿程序,但是是两种不同的产品。子链中的出块规则和比特币相同,如果候选区块的哈希低于某个特定阈值,那判断这个块有效。如果候选区块的哈希值大于块阈值但小于另一个阈值,我们将其视为弱块(Weak Block)。弱块也计入链长度,也执行交易确认的功能。但是,弱块不会收到任何块奖励。只有区块能获得块奖励。衡量协议安全性的共同指标我非常激动,因为下面我们要一起设定一些衡量协议安全性的共同指标。你声称这是最安全的协议,你要向我证明它,就需要从这几个指标的维度来衡量你的协议有多安全。在这个研究中共有四个指标,我们来分析一下。第一个指标我们称之为链质量(Chain Quality),是指主链上诚实矿工的区块的最小百分比。在这个例子中,链质量是六分之三,因为主链中有六个区块,其中三个来自诚实矿工。第二个称之为激励相容度(Incentive Compatibility),用来衡量对自私挖矿攻击的抗性,被定义为诚实矿工区块奖励的最小百分比。在这种情况下,由于六个主链区块中有三个区块来自于诚实矿工,因此激励相容度是 50%。在 Nakamoto 共识中,这两个指标(指链质量和激励相容度)是相等的。但是,对于其他协议,这两个指标并不相同。链质量只是用来评估拜占庭敌手(也就是作恶节点),但激励相容度则把奖励也考虑在内。第三个指标是另一个攻击抗性的指标,称为「作恶收益」(Subversion Gain),衡量抗双花攻击的性能。它被定义为「平均每个出块间隔能够获得的区块奖励加上双花奖励的最大值」。在这种情况下,假设每隔 10 分钟能找到一个块,如果总共有 8 个块,那么总共需要 80 分钟(其中攻击者有 3 个块)。在这个例子里,平均每 10 分钟,攻击者获得 3/8 个区块奖励。双花奖励为 0,因为双花奖励需要连续孤立六个块。因为在抗双花攻击中没有完整的百分比奖励,因此指标设定为「平均每个出块间隔获得区块奖励的最大值」。在这张图上,没有双花攻击奖励,因为你需要连续出孤立至少 6 个区块才能获得双花奖励。最后一个指标称为「审查敏感性」(Censorship Susceptibility),即因为拒绝审查者的要求,导致诚实矿工的奖励损失的最大百分比。因为如果我拒绝审查请求,攻击者将开始孤立我的区块。此指标用来衡量我的区块可以被孤立的百分比。在这个案例中,有 5 个诚实的块,其中 2 个是孤块,所以审查敏感性是 2/5。评估结果现在我们来看看评估结果。在这次分享中我分析了 5 个协议,我们来看看第一个指标链质量。我们先定义一个变量 ,它是在平局情况下,在攻击者的链上挖矿的诚实矿工算力占所有诚实矿工算力的百分比。如果 等于零,那么所有诚实矿工的算力都会用在挖诚实矿工的链上,没有诚实矿工的算力在攻击者的链上挖矿。如果 等于1,则所有诚实矿工的算力将在攻击者链上挖矿,并且没有人会在诚实矿工的链上挖矿。这是是用来评估 Nakamoto 共识的通用参数。这里有五个情况,分别是在 = 0,0.5,1 情况下的 Nakamoto 共识、最小哈希平局打破协议(SHTB)和 不可预测的确定性平局打破协议(UDTB) ,哪一个是链质量最佳的?在这五个协议中,最小哈希平局打破协议(SHTB) 和 不可预测的确定性平局打破协议(UDTB) 仅关注如何打破平局。所以你并不能比 = 0 的平局的情况下的 Nakamoto 共识做的更好。因为当 = 0 的时候,所有的挖矿算力将会在诚实的链上。并且你不能比 = 1 的情况下的 Nakamoto 共识更差了,攻击者在这种情况下可以赢得所有的平局。所以在剩下的三个协议里(SHTB、UDTB、 = 0.5 的 Nakamoto 协议)哪一个是表现最差的?其实是最小哈希平局打破协议。那么对于剩下两个协议(UDTB、 = 0.5 的 Nakamoto 协议)哪一个更好呢?我来揭开这个答案。 = 0.5 的 Nakamoto 共识是更好的。为什么?举例来说,在不可预测的确定性平局打破协议(UDTB)中,当一个攻击者找到了一个区块,但是此时诚实的矿工打包了这个区块并且先于攻击者将它广播了出去,那么有可能这个攻击者会计算伪随机函数并意识到如果他发布了他的区块,是没有人会继续在他的区块之上挖矿的,因为他在出块竞争的平局中失败了。那么这个攻击者能够做什么?在 Nakamoto 共识中,攻击者注定会失败,因为最先收到的区块打破平局的规则,如果你不尽快把区块发布出去,没有人会在你的区块上面挖矿。但是在 UDTB 中则不同,即使下一个区块都被挖出来了,攻击者还是能够在这个区块之上继续挖矿,只要攻击者能够赢得下一个出块权,那么成功之后这个攻击者就能够在诚实矿工的区块之后同时发布两个区块。如果这个伪随机函数表明攻击者赢得了出块竞赛,攻击者就能拿到出块奖励。因为 UDTB 允许一个称为“后发制人“的特殊攻击行为,因此 UDTB 的安全性会比 = 0.5 的 Nakamoto 共识更差。那为什么最小哈希平局打破协议安全性那么差?因为当攻击者找到一个区块并且这个哈希值的确非常小的时候,攻击者会有大约 99% 的可能性,不论其他人的哈希是多少,他都能够赢得这个出块权。不论我先广播哪一个区块,我都能准确的预测出我能够赢得这个平局的可能性。这就允许攻击者在他足够幸运的时候能够发动扣块攻击。当诚实的矿工找到下一个区块的时候,因为攻击者区块的哈希是足够小的,他有很高的可能性能够赢得出块权,因此他能够发布区块并且获得这个出块权。下一次当攻击者没有这么幸运的时候,他拿到的区块的哈希相对来说比较大,攻击者能够发布这个区块并直接获得奖励。更佳链质量协议的一般性结论下面是我们研究更佳链质量协议的一些一般性结论。当攻击者所占算力 > 1/4 时,没有一个协议能够达到一个理想的区块链的质量。只要攻击者的算力超过了全网算力的 1/4,它的收益就能够比它按照算力份额计算的正常收益更高。只要攻击者的算力超过了全网算力的 1/4 ,它的收益就能够比它按照算力份额计算的正常收益更高。 对于任何一个 的值,在 = 0 的情况下,没有一个协议在安全性上表现比 Nakamoto 共识更好。可能对于某一特定情况,某个协议在安全性上会比 Nakamoto 共识更好,但是在整体上 Nakamoto 共识在安全性上是最好的。这是为什么?因为协议并不能区分诚实的区块和攻击者的区块。为什么协议不能区分这些区块?这是因为信息的不对称。攻击者是基于所有可得信息来行动的,也就是说他知道他发布了多少个区块,有多少个扣留的区块,我什么时候发布这些区块等等,攻击者是都知道的。然而诚实的矿工仅基于有限的公开信息来行动。这又是为什么?这是因为 PoW 的安全假设较弱。他们试图异步操作,规定所有的矿工只对非常有限的公开信息采取行动/进行操作。那么现在我们来针对 Nakamoto 共识、水果链、奖励分配(Reward-Splitting,RS)协议、和子链来分析一下他们攻击抗性,首先是激励相容性。 其中奖励分配协议(执行)表现最好,因为惩罚总是激励正确行为的最有效方式。子链表现最差。水果链表现有时比 Nakamoto 共识好,有时更糟。子链允许攻击者使用无价值的弱区块来使诚实的区块失效。如果所有东西都是有价值的,那么攻击者扣留区块则是有风险的。但是弱区块本身毫无价值,攻击者可以扣留这个弱区块,而不会有失去区块奖励的风险。既然无风险,那么为什么不尝试更大胆的扣留区块的行为?更多的弱区块,协议行为越糟糕。所以更多的弱区块实际上使事情变得更糟。最好的情况就是不去使用弱区块。当水果链的超时值小的时候,它的表现比 Nakamoto 共识差。攻击者可以使用无用的区块使他的水果失效。这也有类似的问题出现,因为区块在水果链中没有任何奖励,所以攻击者没有发布区块的动机,因为扣留区块也并无风险,结果是攻击者可以尝试更大胆的扣留区块行为。结果是攻击者可以尝试更大胆的持有行为。如果有更多的水果,那么情况会稍微好一点。有一个著名的 Newton-Pepys 问题,它是说一个概率问题,即A. 6 个正常的骰子独立投掷,至少出现 1 个 6B. 12 个正常的骰子独立投掷,至少出现 2 个 6如果你掷 6 次骰子,得到 1 个 6 的概率比你掷 12 次骰子得到 2 个 6 的概率要大。在水果链中有四种挖矿产品:诚实水果,诚实区块,攻击水果,攻击区块。我们可以将「攻击者比诚实矿工拥有 1 个超时区块」——即攻击者可以成功地孤立一些水果——看作是一个条件事件。此事件完全独立于水果生成(fruit generation),因为它仅考虑区块。我们可以把它作为 Newton-Pepy’s 问题中的条件去看待——因为它是独立的,所以我们可以直接把它扔掉。但当条件满足时,如果水果较少,则“攻击者有更多水果”的概率非常低。更多的水果意味着更多的攻击者水果。因为攻击者是少数派,如果水果的总数更多,这意味着攻击者的水果的总占比会比实际上多一些。这里用赌博来做类比更好理解,因为我们有更多的水果,这意味着当攻击者有更多的水果, 那么他就会更少参与赌博。 人们更愿意在没有什么可失去的情况下赌博, 但如果有更多的资本可能会失去, 他就不想赌, 这意味着更多的水果稍微有助于提高激励相容性。接下来在攻击抵抗性中我们分析攻击「作恶收益」,这个指标是越小越好的,如图所示,奖励分配协议优于 Nakamoto 共识,优于水果链,优于子链。我们分析了另一个有趣的衡量方法,称为「作恶赏金」。我们定义其为最低双花奖励,来研究激励偏差。(也就是说,在双花攻击的奖励大于作恶赏金时,攻击者才有动力作恶)。( 图中右下角的表格,分别是 Nakamoto 共识和奖励分配协议在区块确认数 3 或 6 , (攻击者算力占比在 0.1 ~ 0.4 的情况下,计算出来的作恶赏金)。通过计算各个协议的「作恶赏金」可以发现,基本上可以零成本破坏水果链和子链,甚至可以尝试无奖励双花,因为毫无风险。我们可以看到,随着交易确认次数的增加,对于一个弱攻击者,作恶赏金的增长几乎呈指数增长。这意味着更多的交易确认确实有助于抵抗双花,但是对于强攻击者来说效果就不那么明显了。对于抗审查能力, 我们计算所有的数字和排名如下:对于小 ,也就是攻击者算力占比较低的情况下, 水果链是最好的, 然后是 Nakamoto 共识, 再然后是奖励分配协议和子链。 对于大 ,也就是攻击者算力占比较高的情况下,奖励分配协议变成了最好的, 然后是水果链, Nakamoto 共识, 和子链。 显而易见的是,对于水果链来说, 如果你想使其他块无效, 要比其他协议要困难得多, 因为它们是在多个条件下获得奖励, 即使你是孤块也是如此。 为什么当 足够大的时候, 也就是攻击者算力占比较高的时候,奖励分配协议会比水果链更好呢?因为在水果链上, 间隔被定义为主区块和指针块之间的区块高度差。而在奖励分配协议中, 间隔被定义为主区块和区块本身之间的区块高度差。 因此在水果链中,若攻击者在长期的出块竞争中都获胜了,那么诚实的水果的奖励都会被拿走因为他们的指针块都被孤立了。也就是说如果你把他们的指针都孤立了,那么对他们来说就玩完了。然而在奖励分发协议中,最后的几个诚实的区块还是能够获得一些奖励。如果想要让诚实矿工失去所有奖励,将他们的指针孤立是不够的,你需要将大量连续的区块孤立起来才行。(这给攻击者增加了阻碍)。这些图片能够说明这些问题。在水果链中,如果你孤立了指针,那么你能够安心地获得所有的奖励。然而在奖励分配协议中,即使你在出块竞争中长期孤立了这些区块,但是这些区块还是会指向回主链。因为关键关系并没有考虑进去,这个区块仍会分走攻击者一半的出块奖励,这让它更能抵抗审查攻击。(因为就算被审查,诚实矿工还是能获得一部分奖励。)抵抗攻击协议的通用结论下面谈一下研究中对于抵抗攻击协议的一些通用结论。合理的设置更长的区块确认时间和更大的带宽会增加安全性。有一个两难困境,我们称为“奖励坏人,惩罚好人”的机制。这对于大家来有点颠覆对协议奖励的认知。因为在这里即使你分叉你仍然能够获得出块奖励,你分叉是没有风险的。所以这反而激励了攻击者去分叉和发动双花攻击。在惩罚性协议中,因为审查攻击者不在乎他们自己的出块奖励,你的惩罚规则反而给攻击者另一个工具,来让诚实的矿工放弃出块奖励。而对于幸运奖励协议,如果你不打破信息不对称,那么幸运并不意味着好。有时候幸运的块反而是坏的块,让事情变得更糟。结论就是,想要解决所有的攻击,我们需要在底层规则中超越奖励。(奖励规则并不能很好解决攻击的问题)具体怎么做?我提出一些想法和大家讨论一下。我们不应该设计一个太复杂、太难分析的协议。我们需要设计一个设计者能够分析的协议。简单就是好的,复杂是安全的敌人。仅针对单一攻击策略的安全性分析是很危险的。对于很多协议来说,它们的设计者经过模拟说他们的协议能够抵抗某种特定的攻击方式,但是这样的协议却启发了攻击者去研究其他的攻击策略。仅针对单一攻击动机的安全性分析也是很危险的。攻击者可能会着眼于短期利益,长期利益或者损害其他矿工的利益。为了抵抗某一种攻击,你就可能启发了攻击者基于另一个目标发动另一种形式的攻击。在你的模型中你需要考虑到所有不同动机的攻击者。所以为了能够在质量和攻击抵抗中做的更好,你需要阅读这篇论文,但是因为我还没有准备好将这篇论文公之于众,因此你需要来找我要这篇论文。而有心的你,一定会找到张韧博士的联系方式…… ...

November 29, 2018 · 2 min · jiezi

整装待发 QTA UI自动化测试框架迎来大更新

整装待发 QTA UI自动化测试框架迎来大更新QTA是什么QTA是一个跨平台的测试自动化工具,适用于后台、原生或混合型客户端应用的测试。在腾讯内部,QTA是腾讯元老级的自动化测试项目,从研发至今已走过8个年头, 工具的能力也从一开始仅支持Windows端的UI自动化测试,现在扩展到Android、iOS、Web、后台、云服务的测试自动化。QTA也是腾讯内部使用最为广泛的自动化测试框架,包括PCQQ、手机QQ、空间、音乐、腾讯云等产品测试的自动化,目前都是使用QTA的方案。在腾讯开源的历史中,QTA的“辈分”也很高,于2016年开源的QTA,是腾讯最早期的开源项目之一,目前存放于三个Github仓库下:·QTAF(QTA Framework):https://github.com/Tencent/QTAF·QT4A(Quick Test for Android):https://github.com/Tencent/QT4a·QT4i(Quick Test for iOS):https://github.com/Tencent/QT4aQTAF (QTA Framework)是QTA的基础框架,包括testbase和tuia模块,QT4A和QT4i分别是面向Android和iOS的UI测试自动化测试解决方案。QTA的优势UI自动化的ROI问题这一业界共识的难题——除了可测性,UI测试自动化工具本身设计和使用本身也十分有挑战,许多同行因为这些问题,放弃了或抵触使用UI自动化测试。QTA团队在腾讯内部积累了丰富的实践经验,在众多明星业务团队的建设和运营下,形成了可持续执行的自动化测试流程,包括QQ、QQ空间、音视频SDK、Now直播、企鹅电竞、腾讯视频、腾讯云等产品项目。对于目前已经开源的QT4A(Android自动化测试),目前在腾讯内部已经落地建设1.7w+的自动化脚本。平均每天执行自动化用例2.9w+个,测试任务数700+个。为服务测试执行的需要,QTA团队已经维护了500+的执行节点,并构建了750+个Android虚拟机的集群。对于QT4i(是iOS自动化测试这块),目前已经累计用例数6k+,每周执行任务总数600+,平均每天执行3k+个测试用例。其中,以应用深入的手机QQ产品为例:AndroidQQ系统测试用例数有1000+,每天通过率基本稳定在90%以上,同时每天CI自动触发BVT测试,产品无功能bug情况下,通过率基本为100%。除此之外,还有其他上线前验证测试,Android QQ会员项目每天执行任务约为270个,大部分任务都在10min内执行完成。(QT4A的演示Demo)iOS QQ功能测试用例数有200+,每天日常执行用例数600+,其中,每天CI自动触发BVT测试,在产品无bug的情况下,通过率保证在95%以上。iOS QQ会员项目全部用例数300+,每天日常执行用例数500+,大部分任务都在30min内执行完成,平均每个任务需要约10个执行机节点的支持。(QT4i修改设备名称demo)QTA在腾讯内部广泛应用,也积累了不少经验和成果,QTA团队也希望这次开源的更新,能向业界分享自动化测试的方法论和实践经验;以这次开源为基础,和业界同行一起分享和共同建设一个能在工程上真正落地使用的UI自动化测试工具。重大版本更新作为第一批开源的项目,在很长的一段时间内,QTA团队由于职能定位的原因,对开源项目的参与力度不够。这次,腾讯公司组织架构调整,QTA团队成为新成立云与智慧产业事业群(CSIG)的一份子,后续QTA会以腾讯云为基础,助力产业互联网的客户,为QTA开源带来新的活力。为此,QTA于进行了一次重大的开源版本更新,将内部已经在持续使用的新特性同步开源,包括:·QTAF新增资源管理模块、测试计划功能,让QTA框架能更方便的和其他测试执行系统集成;·QT4A支持了非root的版本,支持Android6以上的系统,支持64位App;·QT4A优化了截屏效率,同时新增屏幕录制的功能;·QT4i优化模拟器Agent启动方式,以及支持最新的iOS12和XCode10;·QT4A和QT4i支持pip安装,简化安装部署;·QT4A和QT4i完善了使用和设计文档。后续的计划在QTA的UI自动化测试的体系中,目前还有QT4W、QT4C和QT4Mac正在筹备开源,三者分别输送了Web、Windows和Mac端的UI自动化测试能力。特别是QT4W——Web自动化测试的能力,同时提供QT4i和QT4A的自动化测试中支持Web能力的基础,将很快与开发者面见面。针对社区反馈的最多的声音——Python 3的兼容性改进,QTA团队也正在积极开发中。长期来看,QTA团队正在研究AI和算法的方式来增强自动化的能力和降低自动化维护的成本,提升工具自我迭代的能力,希望逐步优化后开源。另外还有一个可以关注的是,QTA正在和腾讯云Tencent Hub(开发文件储存和DevOps工作流编排服务)团队的合作中,将QTA的能力整合在Tencent Hub中,目前已经在联调验证阶段,QTA的社区用户,很快可以在腾讯云上体验QTA测试自动化的服务了。此外,针对开源研发流程,QTA团队也于近期做了一次梳理。新的研发模式,让社区版的QTA和腾讯内部的QTA版本在代码管理上清晰、流畅,这有助于让内部的新特性能够更快地同步到开源社区的代码库中,来自开源社区贡献者的代码也能够顺利合入。在开源社区的维护上,伴随着腾讯业务团队上云节奏的加快,QTA开发和维护团队在不断壮大,他们将一同为外部开源用户提供支持。欢迎大家通过Github Issue和QQ群向QTA团队提出改进建议,一同建设更加好用的自动化测试工具!

November 22, 2018 · 1 min · jiezi

破界!Omi生态omi-mp发布,用小程序开发生成Web

omi-mp 是什么Omi 框架是微信支付线研发部和 AlloyTeam 开源的通用 Web 组件化框架,基于 Web Components,用来开发 PC、手机浏览器或者微信、手Q webview 的 Web 页面。自今年5月开源以来,该项目共获得 Star 数 5000+,拥有贡献者29人。经过 Omi 原始开发团队和社区贡献者的共同努力,Omi 的生态发展非常迅速,包括:其中,Omi 近期发布 omi-mp,旨在打破小程序和 Web 的边界,让“小程序员”能够使用小程序技术栈开发 Web HTML5 的单页应用(SPA), 也可让已有小程序生成 Web 页面。一次开发,多处运行。比如小程序官方模板生成的 Web 页面:微信小程序生态11月7日,马化腾在第五届世界互联网大会上透露了一组数字:目前,已经有150 万开发者加入到了小程序的开发,小程序应用数量超过100万,已覆盖200多个细分行业,日活用户达到2亿。近10个月的时间,小程序的数量几乎翻了一番,开发者数量增长了50万,小程序日活增长了3000万。据统计,开发小程序用的最多的技术栈是使用小程序提供的语法和工具, 腾讯也在加大小程序基础能力和平台生态的建设。在可以遇见的未来,微信小程序将不仅仅拥抱 Web Components,还会更好的支持NPM、小程序云、可视化编程、分包。小程序的可视化布局体系,能够让开发者拖拖拽拽搭积木一样快速搭建小程序。微信小程序和 Omi微信小程序和 Omi 框架都是使用 Web Components(CustomElements 和ShadowDom)渲染组件,以搭积木的方式搭建 Web 页面,小程序在定制的 WebView 中渲染组件,Omi 在 PC、Mobile、TV 等现代浏览器环境渲染组件,Omi 使用 JSX 作为 UI 表达式,小程序使用模板引擎,JSX 是图灵完备,可以表达一切模板引擎。比如举个99乘法表的例子:编译成 javascript 之后:小程序支持rpx布局,Omi也增强了CSS, 支持基于750屏幕宽度,支持 rpx 布局。比如定义一个半屏宽度的 div:小程序和 Omi 有很多共性,自然而然地可以打通二者之间的边界,让小程序在更多的平台上体现其价值,节约公司人力成本,一次开发,多处运行。这次公开测试的 omi-mp 旨在挖掘小程序的平台潜力和优势,让开发者使用现有的小程序快速生成基于 Web Components 的 HTML5 单页应用,基于 Omi和omi-router 的前端项目,让小程序不仅仅可以运行在微信里,也可以运行在微信内置的浏览器、手Q内置的浏览器、QQ浏览器以及 PC、Mobile、TV 等等的其他浏览器里。你可以同时使用 OMI 开发这工具或者微信开发者工具调试,既然 Omi 使用了 Web Components 和 Shadow-DOM, 所以不需要像 React 一样安装其他元素面板,只需要使用 Chrome 自带的 Elements’ sidebar 便可,它和 React开发者工具一样强大。omi-mp 是一次全新的、突破性的挑战,在使用过程中,对 omi-mp 有任何意见或建议都可以提出 issues,我们会第一时间反馈,你也可以提交 Pull Request,我们会第一时间 review 并合并进去。希望通过开源社区的合力开发能够让 omi-mp 越来越好,让小程序价值越来越大。小程序开发生成 Web 示例下面是豆瓣电影小程序 DEMO 和生成的 Web页面的对比:社区化发展,欢迎加入并贡献社区目前 Omi 的贡献者遍布国内外各大公司(中国、韩国、美国、土耳其),Omi 共接受了29名贡献者的文档和代码提交,核心贡献者共 11 名。在腾讯内部,Omi 主要是微信支付线研发部和 AlloyTeam 部分成员在维护。欢迎有想法有能力有激情的开发者加入贡献者行列并最终能够进入 Omi Team。你可以从这几个方面贡献:1. 翻译文档,目前有中文、英文和韩文,欢迎其他语言版本的翻译加入2. 提交补丁代码优化 Omi3. 积极参与 Issue 的讨论,如答疑解惑、提供想法或报告无法解决的错误4. 贡献案例,可以是管理后台、PC 网站、移动端 H5等等5. 完善文档,可以反复修正文档,让其更易懂,上手更快6. 扩展 Omi 生态,编写 omi 自定义组件7. 分享与 Omi 的故事,优秀的会挂在 Omi 首页 readme 里8. 写 Omi 相关的 blog,优秀的会挂在 Omi 首页 readme 里我们非常欢迎开发者们为腾讯开源贡献一份力量,相应也将给予贡献者激励以表认可与感谢。参见腾讯贡献者激励计划Omi 交流群欢迎加入Omi交流群,群聊号码:256426170,也可扫码加入:Omi Conf最后有一个好消息要告诉大家!Omi Conf 前端开发者大会预计年底会在深圳举行,目前我们收集广大用户和贡献者的意见,具体这里可以留言反馈参会意见建议:https://github.com/Tencent/om… ...

November 15, 2018 · 1 min · jiezi