讨论共识算法、经济模型以及智能合约的开发

重磅发布 | Ultrain 2020 年技术路线图
B

Ultrain 主网于 2019.4.15 上线以来,已经稳定运行了一年的时间。目前 Ultrain 全网由近 700 个节点组成,节点分布在中国、美国东西海岸、澳大利亚、南非和德国等多个国家和地区,网络部署方式包括公有云网络(阿里云、亚马逊云、微软云、金山云)、企业内网、企业专网、公开互联网和家庭宽带网络的混合部署。

在技术稳定和成型的基础上,Ultrain 在 2020 年的主要任务是实现区块链技术在商业上的落地。在 2019 年下半年,我们花费了大量的精力与我们的众多商业合作伙伴进行商业模式的探索和设计,对区块链技术在商业竞争中的优劣势也有了充分的认识,具体可以见该文《区块链商业与技术现状与发展趋势展望》(深度好文:区块链商业与技术现状与发展趋势展望(上)、深度好文:区块链商业与技术现状与发展趋势展望(下))。在此基础上,我们确定了 2020 年希望通过 Ultrain 技术重点赋能的商业模式:在充分竞争的行业中,通过低成本建立互信的加盟制商业模式。

为实现这个目标,在 2020 年 Ultrian 的技术还需要从以下几个方面进一步升级:

符合商业合规要求:近几个月,各部委出台了区块链技术相关的规范指南,如央行颁布的《金融分布式账本技术安全规范》等。这些规范在后续将成为企业应用落地的基本门槛,为满足这些规范的要求,实现商业合规,Ultrain 需要在多个方面进行进一步的研发;

共识创新:加盟制商业模式有两个特点,一个是加盟商众多,一个是加盟商地域分布非常分散。这主要带来了多种技术挑战,包括加盟商的网络环境各异,需要让用户无感知的自动适配不同的网络;网络节点数量众多,加盟商的在线时间不固定,如何面对一个动态的网络维持区块链网络的稳定;做为一个开放式网络,如何保证网络的安全性;这些方面都是我们在今年需要解决的技术挑战;

区块链隐私保护:在商业环境下,隐私保护是系统运行的底线要求,央行在今年年初颁布的《个人金融信息保护技术规范》可以做为一个参考。Ultrain 在区块链隐私保护方案有深厚的积累,今年我们会形成商业化的解决方案对外输出并提供服务;

以上是 Ultrain 在 2020 年的三条技术路线,我们对该技术路线做了进一步的划分:

2020 年 Ultrain 技术路线图

以上就是Ultrain在2020年的技术路线图,其中包含了多个世界领先的技术突破。我们会在每个时间节点进一步公布技术实现的细节,与大家分享我们的进展。希望Ultrain在技术方面的突破能为区块链技术商业落地贡献自己的力量。

read more

关于区块链与币市的行业动态与最新消息

技术科普 | Ultrain 可编程零知识证明解决方案
B

一、零知识证明介绍

1.1 区块链技术在数据隐私保护方面的困境

区块链技术的特点,就是存储在区块链上的数据,对所有人都是公开、透明、不可篡改的,这是区块链技术能以低成本建立商业信任中心的技术基础。但在实际的商业实践中,比如我们把病人的电子病历放到链上,结果所有人都可以知道该病人得了什么疾病,这显然是不可接受的。所以,对链上数据进行加密保护,是区块链技术应用到商业领域的一个技术刚需。

传统的数据加密技术,无论是基于对称加密还是非对称加密,其特点就是通过密钥对数据进行加密成乱码,使用者持有对应的密钥就可以解开该份乱码,还原为对应的数据。但在区块链场景下,如果单纯使用传统的加密技术,将加密后的数据上传到区块链上,没有持有对应密钥的各方将完全无法知道该数据的内容,从而丧失了区块链数据公开透明的特点,丧失了建立互信的基础,区块链技术在该情况下的使用价值将大打折扣。

所以,如何既能满足链上商业数据的隐私保护要求,又同时不丧失区块链技术公开透明的特点,是一个区块链技术商业落地中必须解决的核心问题。基于密码学的零知识证明技术就应运而生了。

1.2 零知识证明的通俗介绍

零知识证明是上世纪80年代提出的一项密码学技术,其应用目的就是一方在不提供任何有用信息的情况下,使另一方相信某个信息是正确的。我们简单的举个理想化的例子通俗的说明一下零知识证明的作用:小明想向A银行贷款300万元买一套房子,A银行需要小明出具一个存款证明,证明他有300万以上的资产才能给他贷款,小明在B银行有2300万的存款,此时小明有两种选择:

选择1:找B银行开具一个2300万的存款证明给A银行,证明他有300万以上的资产,但这时小明就暴露了自己的资产数量,这是他不愿意的;

选择2:小明找B银行开具一个2300万的存款证明,在该证明上盖一张纸,在百万那一位挖一个洞,这时A银行可以看到百万位的数字是3,所以小明的存款是在300万以上的,满足贷款条件,而小明也不需要告诉银行其全部的存款信息。在这个理想化的例子中,小明一方没有提供全部的知识,就向另一方银行A证明了自己的资产大于300万,而盖在存款证明上的那张纸和挖的洞,就可以视为零知识证明在该场景下的实现。

1.3 零知识证明的技术原理

上是一个通俗的例子,在实际上,零知识证明是这样定义的:

一种方法,通过该方法,一方A可以向另外一方B证明A知道一个秘密x,但是又不透露任何x的信息。对于任意逻辑f,有一对密钥,分别为证明密钥pk和验证密钥vk。A持有一些秘密x, 通过该函数f计算生成y,即y=f(x)。利用y和x、pk,可以生成证明proof。任意拿到proof和y, vk的人,都可以通过验证知道y确实是f(x)的输出,而不需要知道x的具体信息。

1.4 零知识证明应用场景介绍

零知识证明结合区块链技术,在包括商业数据资产交易流转,商业数据隐私保护等方向具备广阔的发展前景。我们以一个真实的医疗数据交换场景举例,来说明零知识证明在数据交易领域的应用意义:

场景:A保险公司希望向B医院购买某个年龄段的冠心病患者的相关数据用于该病种的保险精算分析,为了简化商业逻辑,我们假设患者的年龄信息是一个隐私数据,医院不能将其透露给保险公司,而保险公司需要取得年龄在40到90岁之间的患者的数据,在这种情况下,区块链+零知识证明的解决方案,可以有效的支持该场景:

B医院用零知识证明技术的加密模块,对原始患者数据中的年龄列进行加密和存证

B医院将加密完成后的数据和存证结果(1万份,其中40岁到90岁之间的数据有6800份)上传到Ultrain区块链平台,此时数据已经处于不可篡改状态;

A保险公司向区块链平台查询年龄段在40岁到90岁之间的冠心病患者的数据,平台返回6800份数据给A保险公司,并使用零知识证明模块证明数据的真实性和完整性

A保险公司可以通过零知识证明验证模块,验证该数据集:a.每个数据的年龄都是在40岁到90岁之间的;b.平台已经返回了全部的该年龄段的数据;

A保险公司可以使用该数据用于保险精算分析;

二、Ultrain可编程零知识证明解决方案

2.1 现有底层技术分析

以上我们初步介绍了零知识证明技术,目前常见的主流零知识证明技术包括SNARKs、STARKs、Bulletproofs等,这些技术各有特点:

基于[1]对现有主流零知识证明技术的分析对比,我们目前采用SNARK技术作为Ultrain零知识证明技术的底层技术基础。SNARKs技术目前具备这样的优势:首先该技术是目前区块链链上单个交易性能最好的(聚合验证如SNARK虽然可以大大提升单个交易的平均验证速度,但是只有在非常高的并发交易量的情况下,如675倍,才能发挥作用);其次SNARKs可用代码的成熟度最高(如基于rust的更安全的库),并且有诸多后续改进项目持续提高SNARK的可用性和安全度如Sonic[2]、supersonic[3]、Marlin[4]、Fractal[5]。

2.2 现有技术存在的问题

虽然SNARKs具备多种优势,但由于其重点关注于零知识证明核心技术部分的实现,在具体应用时,还存在着较多的问题需要解决,主要集中在三个方面:

性能差

SNARKs重点关注在技术实现上,证明过程运算需要消耗大量的计算资源,大大限制了其应用范围和平台可移植性;该技术缺乏足够的性能和成熟的高速库,使得类似最基本的匿名交易都无法在手机端完成交易的创建;无法让节点在短时间完成大规模的交易验证。

架构弱

SNARKs在应用架构上存在隐私问题,现有的架构依然部分依赖中心化的服务器,让用户的隐私性方面受到一定的挑战;

开发部署难

基于零知识证明的商业解决方案,并不仅仅是引入SNARKs模块就能实现的,需要结合商业场景的隐私保护需求,同存证、加解密、数据授权以及区块链结合,才能形成一套完整的解决方案。同时零知识证明原有的开发步骤非常繁琐,代码编写类似于电路编程,对程序员非常不友好,因而商业落地的时候部署难度比较大。

2.3 Ultrain可编程零知识证明解决方案架构


Ultrain零知识证明解决方案由两部分组成,客户端以及区块链节点端。

零知识证明客户端

零知识证明客户端:负责对用户数据,按客户要求的自定义逻辑进行零知识证明的加密和证明处理,处理完成后的加密数据会提交到区块链节点端保存。我们对客户端进行了大量的优化,可以提供Pribox硬件加速版及手机客户端版。

Pribox硬件加速版针对于需要对大规模数据进行快速处理的情况,可以做到在TPS 1000的情况下针对15个区块链节点完成零知识证明的证明处理工作;

手机客户端版本,通过大量的代码优化和引入并行计算能力,客户端的运算量降低到传统方法的50%,降低了交易延时,同时突破了原有零知识证明只能应用部署在较高计算能力的服务器节点的限制,有助于将零知识证明的能力直接集成到手机客户端中,极大的扩展了零知识证明的应用范围。

零知识证明区块链节点端

零知识证明区块链节点端:负责存储加密的业务数据,同时部署用于访问及验证加密数据的零知识证明智能合约。链上组件采用业界最为成熟的Groth16验证方法,同时支持bls12_381和alt_bn128两种曲线,可以分别针对高安全度应用场景和高性能的应用场景进行深度定制。

同时,为了解决零知识证明难以开发的问题,我们提供了Ultrain零知识证明SDK组件。开发者通过该SDK组件,可以灵活的针对任意数据/任意逻辑关系,进行开发配置,而无需进行传统的类电子电路编程,可以极大的简化程序员的工作量和编程难度。

2.4 解决方案技术特点

业界性能最高的隐私交易

Ultrain的零知识证明方案,比传统的零知识证明运算速度提升50%,是目前业界性能最高的隐私计算;

与区块链技术无缝对接

零知识证明方案需要与区块链技术配合使用,本方案与Ultrain区块链完成无缝对接,链上提供了零知识证明的智能合约的模板,方便用户快速创建存证、数据授权、匿名交易等一系列服务。链下采用性能优化后的电路模板,方便用户进行一键使用,与区块链技术快速对接。

简单易用的硬件部署方式

采用硬件pribox的方式部署时,用户只需要将pribox部署在本地,即可调用所有链上相关合约,完成大部分的业务相关使用,支持全周期的金融交易和数据隐私保护。完全避免了传统零知识证明部署复杂繁琐的问题。

完全离线操作,保护用户数据隐私

本方案在用户的区块链节点完全断网的情况下,用户依然可以通过自己的私钥,访问本地节点中自己有权限访问的隐私数据,让用户真正拥有自己的隐私数据产权。

以上我们介绍了Ultrain的可编程零知识证明解决方案。在区块链技术应用到商业环境时,零知识证明技术是一项必不可少的关键技术,我们将在区块链数据隐私保护技术方面持续投入,在pribox硬件加速版方面,我们将会把FPGA以及可信硬件加入到pribox中,通过FPGA实现更高性能的硬件加速,以及通过TEE实现更高安全性的可信计算。在零知识证明SDK方面也会持续优化,提供更方便的开发接口,帮助开发者进一步提升零知识证明的开发效率。

参考文献:

[1]现有zkp技术对比 https://github.com/matter-labs/awesome-zero-knowledge-proofs#comparison-of-the-most-popular-zkp-systems

[2] Sonic: Zero-Knowledge SNARKs from Linear-Size Universal and Updateable Structured Reference Strings https://eprint.iacr.org/2019/099

[3] Transparent SNARKs from DARK Compilers https://eprint.iacr.org/2019/1229.pdf

[4] A Marlin is One of the Fastest SNARKs in the Ocean https://www.benthamsgaze.org/2019/09/19/a-marlin-is-one-of-the-fastest-snarks-in-the-ocean/

[5] Fractal: Post-Quantum and Transparent Recursive Proofs from Holography https://eprint.iacr.org/2019/1076

read more

黑客马拉松与经常性的线下见面会或在线趣味游戏

超脑超星计划推进 十五支队伍并驱争先
B

——Ultrain“超星计划”首届颁奖典礼即将拉开帷幕

Ultrain超脑链联合火星财经于8月10日在北京朝阳区诚盈中心举办“超星计划”DApp开发者大赛首届线下颁奖典礼活动。本次活动凝聚了此次大赛排名前15的优秀DApp作品开发者。每支队伍都将展示各自项目的技术亮点及DApp使用场景,而由国内外顶级VC投资人和区块链领域专家组成的评审团队,将会全面考察参赛队伍技术、产品、商业等综合实力,对各个团队进行评选,在经济模型、商业模式、公司管理、资本运作等方面对各队伍进行综合指导和帮助。超脑链一直致力于完整的生态社区建设,为优秀的开发者提供更好的展示机会,以及更多的支持。

随着Ultrain“超星计划”的推进,参赛的队伍开始崭露头角,下面是关于参赛队伍DAPP的大致介绍。

链上恋:团队来自于杭州,基于区块链的情侣日记本。可以让情侣公开的见证永恒的誓言和聊天记录。让不希望恋爱回忆消逝的年轻人记录自己的青春。

Fanclub粉丝论坛:团队来自于上海,基于区块链的论坛,粉丝板块用于发帖,站务板块用于发布论坛资讯,票务板块用于出售演出票。论坛采用积分制,积分可通过每日登录、发帖、回帖来获取,积分用于购买演出票,或具有优先购买权。

Deswap交易协议: 团队来自于南京,DeSwap是一个去中心化的代币兑换系统,Ultrain上的交易代币协议。设计简便,交易快捷,为小规模代币提供流动性。无需用户挂单,也可以随时买卖。适用于超脑的UGAS和积分系统

海洋大亨: 团队来自于杭州,海洋大亨是⼀款模拟社交的游戏,游戏中融合鱼市买卖系统,模拟现实生活中,买鱼饵,造鱼钩,钓鱼到卖金币,形成商业闭环拥有组队系统,可邀请好友一起钓鱼,也可以随机匹配陌⽣人,在休闲娱乐的同时,也可以扩大自身的交际圈。

加密三国:团队来自于海外,加密三国志是一款全资产上链的游戏,具有真正游戏性的非博彩RPG 类游戏。在这个游戏中,玩家的目的是通过与 NPC或其他玩家对战,赚取稀有道具和三国币,用于提升自己的英雄和装备,并通过系统的分红机制赚取分红。

奶茶供应链: 团队来自于上海,该Dapp主要功能是记录一杯奶茶从生产到上市的整个过程中的信息。此Dapp有效提高奶茶在生产到上市过程中的可溯源性,公开性。可建立商家的信誉,提高消费者的信赖。建立一个更和谐健康的生态。

GBT预言: 团队来自于杭州,用户在该DAPP中可使用相应的代币进行预言,预言将扣除部分代币注入奖励池账户,为日后运营做基础。而大部分的代币将注入瓜分奖池账户,预言成功根据所投入代币比例瓜分奖池中代币,预言失败,则扣除投入代币。

IDE: 团队来自于南京,“ChainIDE”是全球第一个多链的智能合约集成环境(IDE), 能够快速的帮助开发者搭建初始的设计环境和节约成本。是一款优异的开发工具。

闪电保险:团队来自于重庆,通过区块链和人工智能技术,构建了保险商业联盟,将成熟稳定的人工智能的判别场景链入整个保险体系,从而将核保过程降为由机器识别、分钟级赔保的范围,极大提升用户体验,增加人们对保险产品信任感。

Last Trip “最后的旅途”:团队来自于南京, 是一款基于区块链的冒险解谜类游戏,玩家在游戏中是一个书写者。通过玩家各自的方式,撰写一本自己的《神曲》。游戏中包含了不同的文化,宗教,人文,故事,哲理。并将7种不同的画风,横跨欧亚非的哲理故事,数百种独立剧情,无数选择,人性,思考,迷雾,探索共融一炉。其完美结合区块链特性,将玩家的每一段旅途上链,并且化身为NPC,影响其他玩家的故事线。

区块链电商:团队来自于合肥,区块链电商项目可适用于多种购物场景和平台。在本次的模型设计中,我们以传统网购平台为载体,搭建一个基于区块链的网购平台,构建出一个可以实现保护用户隐私安全,减少信息骚扰的网购平台

餐引人:团队来自于杭州, 餐引人是基于区块链餐饮商家的一站式服务平台,链接小微餐饮商家的绝大多数服务商。以区块链技术为基础,力争打造“去中心化的真正可信的餐饮商家服务平台。

GC: 团队来自于杭州,作为垃圾分类的DAPP,一个有偿的知识分享平台,将代币和垃圾分类相结合,并逐渐形成垃圾分类知识库,设计简洁,功能清晰,是一款结合生活、环保的实用性DAPP。

Delibrary: 团队来自于南京, 是一款闲置图书共享领域的DAPP,拥有灵活经济激励模型,让更多的旧书籍放大其闲置图书的功效,可通过闲置图书的赠送、交换、出租和出售等操作实现资源的共享,并利用智能合约实现自动业务逻辑。

流浪宝贝: 一款专为流浪狗设计的DAPP,结合区块链,让用户的每一笔捐助触及狗狗本身。借助区块链,完成流浪狗身份溯源,监护人关系和捐助交易与消费流水。让流浪狗不在流浪!

read more

链上分布式应用的开发工具以及高质量的应用推荐

新版Ultrain浏览器上线,终于可以查Token啦!
I

Ultrain测试网上线后,很多开发者尝试写了合约,并用Ultrain浏览器进行了合约的部署操作。其中最热门的就是发Token合约,大家也想亲身体验发Token的快感!连Ultrain团队的的好几个程序员都迫不及待地进行创建账户、申请资源、写合约、部署合约、调用合约等一系列流程,尝试发Token。

可是操作完,大家向产品经理抱怨:通过「超脑浏览器」对Token合约部署、调用操作之后,在浏览器找不到自己的Token信息。于是产品经理第一时间拉着视觉、开发们,完成了测试网超脑浏览器的Token查询的设计,同时新版的Ultrain浏览器也在很多方面做了优化,继续往下看吧!

1、新增首页数据
打开新版Ultrain浏览器,首页除了全新的视觉设计,一眼就能看到块高、交易数、账户数、合约数、Token数的信息,帮助用户直观地了解超脑链最新数据。

2、Token查询
部署完Token合约,直接在超脑浏览器就可以查询到Token信息,超方便啦!

3、查看账户内Token信息
除了Token列表,在自己的账户内也可以查看账户拥有的Token信息啦。不用手动搜索,浏览器自动同步账户内Token信息,很贴心了哦~

4、无线端兼容
新版的整体视觉做了优化,包括列表页、详情页、创建账户流程、合约部署和调用流程等,同时也特别对无线端做了兼容处理,让用户在手机上操作时更舒服。

5、其他
开发还在性能上、缓存策略上进行了优化,使页面加载速度有了明显提升。

Ultrain浏览器的地址(https://explorer.ultrain.io/),你也来试一试吧!有问题的话,可以到开发者门户-论坛(https://bbs.ultrain.io/)给我们留言哦!

read more

consensus and smart contract development

Ultrain Technology Roadmap in 2020
B

The Ultrain main net has been running steadily for a year since it was launched on 2019.4.15. At present, the Ultrain network is composed of nearly 700 nodes, which are distributed in many countries and regions such as China, the East and West Coast of the United States, Australia, South Africa and Germany. The network deployment methods include public cloud networks (Alibaba Cloud, Amazon Cloud, Microsoft Cloud, Kingsoft Cloud), enterprise intranet, enterprise private network, open Internet and home broadband network.

On the basis of technical stability and shaping, Ultrain’s main task in 2020 is to realize the commercial implementation of blockchain technology. In the second half of 2019, we spent a lot of energy exploring and designing business models with our many business partners, and we have a full understanding of the advantages and disadvantages of blockchain technology in business competition:”Blockchain Business and Technology Status and Development Trend Outlook”. On this basis, we have determined the business model that we hope to be empowered by Ultrain technology in 2020: in a fully competitive industry, establish a mutual trust franchise business model at low cost.

In order to achieve this goal, Ultrain’s technology needs to be further upgraded from the following aspects in 2020:

Compliance with business compliance requirements: In recent months, various ministries and commissions have issued normative guidelines related to blockchain technology, such as the “Financial Distributed Ledger Technical Security Specification” issued by the Central Bank. These specifications will become the basic threshold for the application of enterprises in the future. In order to meet the requirements of these specifications and achieve commercial compliance, Ultrain needs to conduct further research and development in many aspects;

Consensus innovation: The franchise business model has two characteristics, one is that there are many franchisees, and the other is that the geographical distribution of franchisees is very scattered. This mainly brings a variety of technical challenges, including the different network environments of franchisees, and the need for users to automatically adapt to different networks without perception. There are many network nodes, and the online time of franchisees is not fixed. How to maintain the stability of the blockchain network in the face of a dynamic network. As an open network, how to ensure the security of the network; these aspects are the technical challenges we need to solve this year;

Blockchain privacy protection: In the business environment, privacy protection is the bottom line requirement for system operation. The “Personal Financial Information Protection Technical Specification” issued by the central bank at the beginning of this year can be used as a reference. Ultrain has a deep accumulation of blockchain privacy protection solutions. This year we will form a commercial solution to export and provide services;

The above are the three technical routes of Ultrain in 2020. We have further divided this technical route:

The above is the technology roadmap of Ultrain in 2020, which contains a number of world-leading technological breakthroughs. We will further publish the technical implementation details at each step and share our progress with you. Hope that Ultrain's breakthrough in technology can contribute to the commercial landing of blockchain technology.

read more

Industry dynamics and latest news about blockchain and currency

Ultrain Monthly Report(03/16–04/12)
B

Ultrain Monthly Report(03/16–04/12)

Following is the monthly report on the progress of the project from Mar. 16th -Apr. 12th, which contains two items: project development progress and community dynamic update. It is for the community members to check. Thank you for your attention.

Technology Update from Ultrain (3/16–4/12)
Ultrain’s Core Technology

According to the Central Bank’s “Financial Distributed Ledger Technical Security Specification” compliance check and improve the node code;

The node code adds national secret algorithm support to the transaction account;

Establish an on-chain data table to support miners’ daily reward data on-chain storage;

Optimize the historical data query code and improve the browser query response speed;

Calculate the Merkel tree hash of the world state change data to provide world state data verification.

Ultrain’s Ecosystem

A new version of the user relationship diagram, store settings and other functions are launched on the backstage of the merchant, which completes the development of funds management, product management, store opening help and other pages, and is scheduled to go online at the end of April;

The new version of the Hyper-physical APP is launched, optimizing the rich text display on the product detail page, optimizing the homepage effect and other functions;

Optimize the merchant entry process, complete function development such as shop reward activities and shop package purchase, and plan to go online after passing the test in early May.

Ultrain Developer Kit

U3 SDK adds national secret algorithm support;

Optimize the Ultrain One wallet wealth page to support reading on the miner reward data chain;

Optimize Ultrain One wallet transfer code to improve transfer response speed.

Ultrain’s Latest Community & Event Update

Ultrain overseas ambassadors synchronized the development of the blockchain industry around the world

In March, due to multiple factors, the global financial market was in crisis. But at the same time, in this special period, emerging technologies such as blockchain have also accelerated. Ultrain’s overseas ambassadors conducted a survey to provide you with an in-depth understanding of the development of the blockchain industry around the world.

Ultrain wished community members a happy April Fools’ Day!

Ultrain launched the technology roadmap of 2020

The Ultrain mainnet has been running steadily for a year since it was launched on 2019.4.15. On the basis of technical stability and shaping, Ultrain ’s main task in 2020 is to achieve the commercial implementation of blockchain technology, and it has clarified the business model that hopes to be empowered by Ultrain technology in 2020: in a fully competitive industry To establish a mutual trust franchise business model through low cost.

In order to achieve this goal, Ultrian’s technology needs to be further upgraded from the following aspects in 2020: 1. Compliance with business compliance requirements; 2. Consensus innovation; 3. Blockchain privacy protection. We have further divided the technical route.

The above is the progress report of Ultrain from Mar 16th to Apr 12th, looking forward to more exciting contents after that!

read more

hacker marathon and regular meetup or online game

Ultrain Monthly Report(5/11–6/7)
B

Following is the monthly report on the progress of the project from May. 11th -Jun.7th, which contains two items: project development progress and community dynamic update. It is for the community members to check. Thank you for your attention.

Technology Update from Ultrain (5/11–6/7)

Ultrain’s Core Technology

• Ultrain infrastructure

Complete the development of the Windows version of the family mining machine software, and implement the Windows 10 environment automation deployment tool to complete the internal test;

Node software adds on-chain data compression and encrypted storage, and increases data distributed storage mechanism support;

Improve the certificate system management tool to support encrypted authentication communication between nodes and between the client and the server.

Ultrain’s Ecosystem

New functions of exporting merchant orders, customizing reward rules, intelligent display of user data and other functions have been released on the S.I.R platform and updated versions have been released;

The S.I.R system completes the product video, custom sharing copy and other function development, and enters the test stage;

Complete the construction and development of the blockchain enterprise service platform and data upload, and complete the development of related systems such as new marketing activities for blockchain games.

Ultrain Developer Kit

Complete TypeScript refactoring for UltrainOne to improve code readability and maintainability.

Ultrain’s Latest Community & Event Update

Ultrain fully introduced its own blockchain certificate management system

Currently, the mainstream blockchain technology in China is called an open license chain. The license chain refers to the owners of all the nodes that make up the license chain. Their identities are authenticated, and they can only join the blockchain network after being authorized by the license. In this scenario, the network is open to authorized organizations or institutions, and there is a collaborative relationship between the participants on the chain, with an access mechanism. As a complete solution, the PKI/CA system can provide identity authentication certificates for each participant in the license chain to realize access control. It can be said that the certificate mechanism is the cornerstone of the permission chain network security.

Recently, Ultrain technical experts wrote an article, which describes the Ultrain certificate management system in detail after describing the basic concepts of PKI/CA as necessary.

Ultrain has completed development of many new functions

Ultrain independently developed a one-stop user growth technology service platform based on a small program store. The super-item system has completed iterations. It has a variety of powerful tool libraries to support the needs of merchant stores in multiple scenarios: SMS and subscription notifications, merchandise Fission posters, user relationship management … In the future, there will also be functions such as social dynamics and interaction, live broadcast playback, etc.

At present, Superphysical is engaged in store exploration and nugget activities, inviting merchants from all walks of life to open stores, and you will receive a reward for opening a store. Permanently receive 1% of the order transaction amount as a reward.

Ultrain is working closely with multiple business partners

Recently, Ultrain has helped a blockchain game to complete the construction of its marketing system, and has also completed the construction and development of a blockchain enterprise service center and data upload. In addition, there are many business partners in close negotiation and cooperation.

The above is the progress report of Ultrain from May 11th to Jun 7th, looking forward to more exciting contents after that!

read more

Dapp develop tools and high-quality application recommendations

How to build an end-to-end DApp on Ultrain - 2
R

Step2:Write DApp

There are two Dapps to be written, one is MiningDapp, the other is UDapp. We use the Javascript SDK U3.js to write the DApps. To be simple, we create the two DApps in one project.

Written by DApp

In WebStorm, create a new project -> Node.js Express App-> Template select Pug (Jade); modify the project name to CarbonDApp;

Click ‘Create’ to create a project

Import project dependent class library

Copy all the directories in node_modules in CarbonProject to the node_modules directory of CarbonDApp, and repeat the directory skipping without copying;
Copy the CarbonDApp/node_modules/u3.js/dist/u3.js file to the CarbonDApp/public/javascripts directory.

Modify the DApp server port

Since the default 3000 port is already occupied, you need to modify the server port of the DApp.

Open the bin/www file and find var port = normalizePort(process.env.PORT || '3000'); change 3000 to 3001

Create an account information browsing page

Create an index.html page in the public directory and add the following code to the page:

<html> <head> <meta charset="UTF-8"> <title>test</title> <link rel="stylesheet" href="/stylesheets/style.css"> <script src="./javascripts/u3.js"></script> <script> let u3 = U3.createU3({ httpEndpoint: 'http://127.0.0.1:8888', httpEndpoint_history: 'http://127.0.0.1:3000', broadcast: true, debug: false, sign: true, logger: { log: console.log, error: console.error, debug: console.log }, chainId:'2616bfbc21e11d60d10cb798f00893c2befba10e2338b7277bb3865d2e658f58', symbol: 'UGAS' }); async function getBalanceInfo() { let SYMBOL = 'CARB'; let account = 'ben'; const ben_balance = await u3.getCurrencyBalance({ code:'ben', symbol: SYMBOL, account: account }); document.getElementById("carbon_balance").innerHTML = '账户余额:'+ben_balance; const bob_balance = await u3.getCurrencyBalance({ code:'ben', symbol: SYMBOL, account: 'bob' }); document.getElementById("bob_balance").innerHTML = '账户余额:'+ bob_balance; const tom_balance = await u3.getCurrencyBalance({ code:'ben', symbol: SYMBOL, account: 'tom' }); document.getElementById("tom_balance").innerHTML = '账户余额:'+tom_balance; const tony_balance = await u3.getCurrencyBalance({ code:'ben', symbol: SYMBOL, account: 'tony' }); document.getElementById("tony_balance").innerHTML = '账户余额:'+tom_balance; const jerry_balance = await u3.getCurrencyBalance({ code:'ben', symbol: SYMBOL, account: 'jerry' }); document.getElementById("jerry_balance").innerHTML = '账户余额:'+tom_balance; const jack_balance = await u3.getCurrencyBalance({ code:'ben', symbol: SYMBOL, account: 'jack' }); document.getElementById("jack_balance").innerHTML = '账户余额:'+tom_balance; } getBalanceInfo(); //transfer(); </script> </head> <body> <div style="padding:8px;border:1px solid #96c2f1;background:#eff7ff"> <h1>CarbonCoin发行方</h1> <p>账户:ben</p> <p>描述:进行CarbonCoin发行的发行方,持有所有未分配的CarbonCoin</p> <p id="carbon_balance"></p> </div> <div style="padding:8px;border:1px solid #96c2f1;background:#eff7ff"> <h1>节能设备1</h1> <p>账户:bob</p> <p>描述:通过节能产生CarbonCoin的节能设备1</p> <p id="bob_balance"></p> </div> <div style="padding:8px;border:1px solid #96c2f1;background:#eff7ff"> <h1>节能设备2</h1> <p>账户:tom</p> <p>描述:通过节能产生CarbonCoin的节能设备2</p> <p id="tom_balance"></p> </div> <div style="padding:8px;border:1px solid #96c2f1;background:#eff7ff"> <h1>航空公司C</h1> <p>账户:tony</p> <p>描述:大型航空公司,化石能源使用大户</p> <p id="tony_balance"></p> </div> <div style="padding:8px;border:1px solid #96c2f1;background:#eff7ff"> <h1>汽车制造商D</h1> <p>账户:jerry</p> <p>描述:大型汽车制造商,化石能源使用大户</p> <p id="jerry_balance"></p> </div> <div style="padding:8px;border:1px solid #96c2f1;background:#eff7ff"> <h1>CarbonCoin销毁账户</h1> <p>账户:jack</p> <p>描述:用于CarbonCoin销毁的账户,持有所有销毁的CarbonCoin</p> <p id="jack_balance"></p> </div> </body> </html> Start the DApp service, test the page
In the npm interface, double click the start button

After the server is successfully started, visit http://127.0.0.1:3001/index.html and the following page appears:

It can be seen that the issuer ben account holds 10 million of all CARB Tokens issued; other accounts have not yet held CARB Token;

Create a mining.html page

Mining.html page, energy-saving device 1 and energy-saving device 2 send the calorie value generated in the first 30 seconds to the energy smart contract every 30 seconds, and redeem CarbonCoin;

Create a mining.html page in the public directory, enter the following code:

<html> <head> <meta charset="UTF-8"> <title>test</title> <link rel="stylesheet" href="/stylesheets/style.css"> <script src="./javascripts/u3.js"></script> <script> let u3_bob = U3.createU3({ httpEndpoint: 'http://127.0.0.1:8888', httpEndpoint_history: 'http://127.0.0.1:3000', broadcast: true, debug: false, sign: true, logger: { log: console.log, error: console.error, debug: console.log }, chainId:'2616bfbc21e11d60d10cb798f00893c2befba10e2338b7277bb3865d2e658f58', keyProvider: '5JoQtsKQuH8hC9MyvfJAqo6qmKLm8ePYNucs7tPu2YxG12trzBt',//bob's private_key symbol: 'CARB' }); let u3_tom = U3.createU3({ httpEndpoint: 'http://127.0.0.1:8888', httpEndpoint_history: 'http://127.0.0.1:3000', broadcast: true, debug: false, sign: true, logger: { log: console.log, error: console.error, debug: console.log }, chainId:'2616bfbc21e11d60d10cb798f00893c2befba10e2338b7277bb3865d2e658f58', keyProvider: '5KXYYEWSFRWfNVrMPaVcxiRTjD9PzHjBSzxhA9MeQKHPMxWP8kU',//tom's private_key symbol: 'CARB' }); function wait(ms = 0) { return new Promise(res => setTimeout(res, ms)); } function randomFrom(lowerValue,upperValue) { return Math.floor(Math.random() * (upperValue - lowerValue + 1) + lowerValue); } async function mining() { let owner_account = 'ben'; const tr_bob = await u3_bob.contract(owner_account); const tr_tom = await u3_tom.contract(owner_account); // let amount = U3.format.UDecimalPad(2000,4); let heat_bob = randomFrom(15000,20000); let heat_tom = randomFrom(15000,20000); await tr_bob.recordHeat(heat_bob,{ authorization: [`bob@active`] }); await tr_tom.recordHeat(heat_tom,{ authorization: [`tom@active`] }); var d=new Date(); var t=d.toLocaleTimeString(); document.getElementById("bob_log").innerHTML = 'time :'+t+', heat value :'+ heat_bob; document.getElementById("tom_log").innerHTML = 'time :'+t+', heat value :'+ heat_tom; } mining(); var int=self.setInterval("mining()",30*1000); </script> </head> <body> <div style="padding:8px;border:1px solid #96c2f1;background:#eff7ff"> <h1>节能设备1</h1> <p>账户:bob</p> <p>描述:通过节能产生CarbonCoin的节能设备1</p> <p id="bob_log"></p> </div> <div style="padding:8px;border:1px solid #96c2f1;background:#eff7ff"> <h1>节能设备2</h1> <p>账户:tom</p> <p>描述:通过节能产生CarbonCoin的节能设备2</p> <p id="tom_log"></p> </div> <div style="padding:8px;border:1px solid #96c2f1;background:#eff7ff"> <button onclick="int=window.clearInterval(int)">stop</button> </div> </body> </html>

Go to http://127.0.0.1:3001/mining.html and the following page appears:

There are two things to note here.

When sending data to the energy smart contract, you need to hold the private key of the account before you can sign and send it. In order to simplify the programming, the private key is directly written to the webpage. In the actual program, the private key needs to be protected and hidden.

To simplify the writing, the Bob and tom DApp programs are written directly to a page. Actually, they should be two DApp program instances, which are running on two devices respectively.

Now our energy-saving equipment can already send data to the smart contract, and after the energy smart contract receives the data, it will pass the data to the operator server, and the operator server will call the energy smart contract again to exchange carboncoin. So we need to establish EnergyServer;

Step3: EnergyServer

Establish event monitor and handle events

In this section, we will deal with the above calorific value data upload event.

1.1 Establish listener event server code

In the bin directory of the CarbonDApp project, create a new file msgBroker.js and enter the following code.

const { createU3 , format} = require('u3.js/src'); const http = require('http'); const port = 3002; let u3 = createU3({ httpEndpoint: 'http://127.0.0.1:8888', httpEndpoint_history: 'http://127.0.0.1:3000', broadcast: true, debug: false, sign: true, logger: { log: console.log, error: console.error, debug: console.log }, chainId:'2616bfbc21e11d60d10cb798f00893c2befba10e2338b7277bb3865d2e658f58', keyProvider:'5JbedY3jGfNK7HcLXcqGqSYrmX2n8wQWqZAuq6K7Gcf4Dj62UfL',//ben's private key symbol: 'UGAS' }); let server = http.createServer((request, response) => { const { headers, method, url } = request; console.log(method); console.log(url); let body = []; request.on('error', (err) => { console.error(err); }).on('data', (chunk) => { body.push(chunk); }).on('end', () => { body = Buffer.concat(body).toString(); console.log("received msg:", body); if (body != null && body.trim()!="") { var obj = JSON.parse(body); let heatValue = JSON.parse(obj[1]).heat.split(",")[0]; let account = JSON.parse(obj[1]).heat.split(",")[1]; exchangeCarbonCoin(account,heatValue); } response.on('error', (err) => { console.error(err); }); response.statusCode = 200; response.setHeader('Content-Type', 'application/json'); response.write("ok"); response.end(); }); }); server.keepAliveTimeout = 0; server.timeout = 0; server.listen(port, function () { console.log((new Date()) + " Server is listening on port " + port); }); function wait(ms = 0) { return new Promise(res => setTimeout(res, ms)); } async function exchangeCarbonCoin(account,heat) { let SYMBOL = 'CARB'; let code = 'ben'; const tr = await u3.contract(code); let heatValue = format.DecimalPad(heat,4); const result = await tr.exchangeCarbonCoin('ben', account, heatValue+' ' + SYMBOL, 'test', { authorization: [`ben@active`] }); let tx = await u3.getTxByTxId(result.transaction_id); while (!tx.irreversible) { await wait(1000); tx = await u3.getTxByTxId(result.transaction_id); if (tx.irreversible) { console.log(tx); break; } } }

The code establishes a service on port 3002. After the energy-saving device uploads its calorific value, the smart contract will send the energy-saving device to the service to upload the calorific value data. The service calls the exchangeCarbonCoin method of the energy smart contract to exchange the CarbonCoin.

1.2 Establish a listener event server startup script

Open the CarbonDApp/package.json file and add the following code to the scripts property: "event": "node ./bin/msgBroker"

1.3 Start the listening server

Refresh the npm window with the ‘event’ option

Double-click event to complete server startup

1.4 Register event monitoring mechanism on the chain

Query the internal network address of the machine through the ifconfig command, for example: 10.20.8.32

In the CarbonProject/test directory, create the registerEvent.js file; enter the following code in the file

const U3Utils = require('u3-utils/dist/es5'); const { createU3, format, listener } = require('u3.js/src'); const config = require('../config'); const chai = require('chai'); require('chai') .use(require('chai-as-promised')) .should(); const should = chai.should(); const expect = chai.expect; const assert = chai.assert; describe('Test cases', function() { it('event register', async () => { let account = 'ben'; const u3 = createU3(config); await u3.registerEvent(account, 'http:// 10.20.8.32:3002'); U3Utils.wait(1000); }); it('event unregister', async () => { let account = 'ben'; const u3 = createU3(config); await u3.unregisterEvent(account, ' http:// 10.20.8.32:3002'); U3Utils.wait(1000); }); });

Note that the registered address is modified to be the internal network address of the machine, and 127.0.0.1 cannot be used.
Run the event register test case to complete the event registration;

1.5 Test calorie value for CarbonCoin function

Visit http://127.0.0.1:3001/mining.html page, every 30 seconds, both bob and tom will randomly send a random value between 15000 and 20000 as the calorific value to convert the smart contract to CarbonCoin;
Visit and refresh the http://127.0.0.1:3001/index.html page, you can find that the CarbonCoin account of bob and tom is increasing every 30 seconds;

Step4:Improve DApp functionality

Add transfer function

After the energy-saving equipment acquires CarbonCoin, it can sell CarbonCoin to the enterprise, such as airlines, etc. The simple embodiment is that the equipment account can be transferred to the corporate company account;

Open the /CarbonDApp/index.html page and add the code

1.1 U3 object used when establishing the transfer

let u3_bob = U3.createU3({ keyProvider:'5JoQtsKQuH8hC9MyvfJAqo6qmKLm8ePYNucs7tPu2YxG12trzBt',//bob's private key }) let u3_tom = U3.createU3({ keyProvider:'5KXYYEWSFRWfNVrMPaVcxiRTjD9PzHjBSzxhA9MeQKHPMxWP8kU',//tom's private key })

1.2 Add the js code of the transfer to call the corresponding smart contract method

async function sendCoin(from,to){ let SYMBOL = 'CARB'; let code = 'ben'; let coins = U3.format.DecimalPad(this.randomFrom(100,500),4); if (from == 'bob'){ const tr = await u3_bob.contract(code); const result = await tr.transfer(from, to, coins + ' ' + SYMBOL, 'sendCoin', { authorization: [`bob@active`] }); let tx = await u3_bob.getTxByTxId(result.transaction_id); while (!tx.irreversible) { await wait(1000); tx = await u3_bob.getTxByTxId(result.transaction_id); if (tx.irreversible) { alert("bob send coin success:"+ coins); break; } } } else if (from == 'tom'){ const tr = await u3_tom.contract(code); const result = await tr.transfer(from, to, coins + ' ' + SYMBOL, 'sendCoin', { authorization: [`tom@active`] }); let tx = await u3_tom.getTxByTxId(result.transaction_id); while (!tx.irreversible) { await wait(1000); tx = await u3_tom.getTxByTxId(result.transaction_id); if (tx.irreversible) { alert("tom send coin success:"+ coins); break; } } } }

1.3 Add a call to the sendcoin() method on the page, update the following code

<div style="padding:8px;border:1px solid #96c2f1;background:#eff7ff"> <h1>节能设备1</h1> <p>账户:bob</p> <p>描述:通过节能产生CarbonCoin的节能设备1</p> <p id="bob_balance"></p> <p><a href="#" OnClick="sendCoin('bob','tony')">给航空公司C转账</a></p> </div> <div style="padding:8px;border:1px solid #96c2f1;background:#eff7ff"> <h1>节能设备2</h1> <p>账户:tom</p> <p>描述:通过节能产生CarbonCoin的节能设备2</p> <p id="tom_balance"></p> <p><a href="#" OnClick="sendCoin('tom','jerry')">给汽车制造商D转账</a></p> </div>

1.4 Access the page and test the function

Visit: http://127.0.0.1:3001/index.html, click the "Transfer to the airline C" button, wait for a period of time (up to about 10 seconds, confirm the time for the Ultrain transaction), the following prompt appears, indicating the transfer success.

Add a company to convert CarbonCoin to a charity point function

By converting CarbonCoin into charitable points, the company makes its own contribution to reducing carbon emissions and enhances its reputation:

Open the /CarbonDApp/index.html page and add the code

2.1 U3 object used when establishing point redemption

let u3_tony = U3.createU3({ keyProvider:'5KbHvFfDXovPvo2ACNd23yAE9kJF7Mxaws7srp6VapjMr7TrHZB',//tony's private key }) let u3_jerry = U3.createU3({ keyProvider:'5JFz7EbcsCNHrDLuf9VpHtnLdepL4CcAEXu7AtSUYfcoiszursr',//jerry's private key })

2.2 Add the redeemed js code to call the corresponding smart contract method

async function exchangeScore(account){ let SYMBOL = 'CARB'; let code = 'ben'; let to = 'jack'; let coins = U3.format.DecimalPad(this.randomFrom(10,50),4); if (account == 'tony'){ const tr = await u3_tony.contract(code); const result = await tr.exchangeScore(account, to, coins + ' ' + SYMBOL, 'sendCoin', { authorization: [`tony@active`] }); let tx = await u3_tony.getTxByTxId(result.transaction_id); while (!tx.irreversible) { await wait(1000); tx = await u3_tony.getTxByTxId(result.transaction_id); if (tx.irreversible) { alert("tony buy score success:"+ coins); break; } } } else if (account == 'jerry'){ const tr = await u3_jerry.contract(code); const result = await tr.exchangeScore(account, to, coins + ' ' + SYMBOL, 'sendCoin', { authorization: [`jerry@active`] }); let tx = await u3_jerry.getTxByTxId(result.transaction_id); while (!tx.irreversible) { await wait(1000); tx = await u3_jerry.getTxByTxId(result.transaction_id); if (tx.irreversible) { alert("jerry buy score success:"+ coins); break; } } } }

2.3 Add a call to the exchangeScore() method on the page, update the following code

<div style="padding:8px;border:1px solid #96c2f1;background:#eff7ff"> <h1>航空公司C</h1> <p>账户:tony</p> <p>描述:大型航空公司,化石能源使用大户</p> <p id="tony_balance"></p> <p><a href="#" OnClick="exchangeScore('tony');return false;">购买公益积分</a></p> </div> <div style="padding:8px;border:1px solid #96c2f1;background:#eff7ff"> <h1>汽车制造商D</h1> <p>账户:jerry</p> <p>描述:大型汽车制造商,化石能源使用大户</p> <p id="jerry_balance"></p> <p><a href="#" OnClick="exchangeScore('jerry');return false;">购买公益积分</a></p> </div>

2.4 Access the page and test the function

Visit: http://127.0.0.1:3001/index.html, click the "Buy Charity Points" button, wait for a period of time (up to about 10 seconds, confirm the time for the Ultrain transaction), the following prompt appears, indicating that the points are successfully redeemed. At the same time, you can see the number of CarbonCoins destroyed in the CarbonCoin destruction account at the bottom of the page.

Query the public welfare points exchange history

By enquiring the redemption history of charity points, we can establish a ranking of corporate charity points.

3.1 Creating a page

In the CarbonDApp/public/ directory, create a new leaderboard.html and enter the following code:

<html> <head> <meta charset="UTF-8"> <title>leaderboard</title> <link rel="stylesheet" href="/stylesheets/style.css"> <script src="./javascripts/u3.js"></script> <script> let u3 = U3.createU3({ httpEndpoint: 'http://127.0.0.1:8888', httpEndpoint_history: 'http://127.0.0.1:3000', broadcast: true, debug: false, sign: true, logger: { log: console.log, error: console.error, debug: console.log }, chainId:'2616bfbc21e11d60d10cb798f00893c2befba10e2338b7277bb3865d2e658f58', symbol: 'UGAS' }); function wait(ms = 0) { return new Promise(res => setTimeout(res, ms)); } async function getLeaderboard() { let owner_account = 'ben'; const tr = await u3.contract(owner_account); const result = await u3.getAllTxs(1,10000000,{"actions.name":"exchangeScore"},{_id:-1}); //console.log(result); let content = ''; for ( let i = 0 ;i< result.results.length;i++){ content = content + '<tr><td>'+ result.results[i].actions[0].data.from+":"+result.results[i].actions[0].data.quantity +'</td></tr>'; } document.getElementById("leaderboard").innerHTML = content; } getLeaderboard(); </script> </head> <body> <div style="padding:8px;border:1px solid #96c2f1;background:#eff7ff"> <h1>leaderboard</h1> <table id="leaderboard"> </table> </div> </body> </html>

We use the u3.getAllTxs(1,10000000,{"actions.name":"exchangeScore"},{_id:-1}); method to query all redemption transactions and print their specific data to the page.

3.2 Run page

Visit http://127.0.0.1:3001/leaderboard.html and you can see the following page:

Here is a history of all points redemption.

Summary

This tutorial system describes how to write an end-to-end web version of the DApp application. Although it has been simplified in the process of writing, it generally describes the overall picture of DApp application development, developers can do the basis of this framework. Enrich and improve your DApp application.

About developing DApp on iOS and Android, you can integrate u3.js into the corresponding hybrid Native development framework, and the principle is the same as the web version DApp.

read more