图片来自包图网
【51CTO.com原创稿件】轻松筹作为国内受欢迎的健康保障平台,自成立之初就聚焦公众健康领域,成立三年多时间里,帮助超过 160 万个家庭筹集善款超过 200 亿元。
作为业内的领军企业,轻松筹的大病众筹业务无论从用户规模还是筹款规模能够在短时间内爆发式增长。
而核心原因是轻松筹利用技术能力让大众捐款的效率更高,让筹款的整个过程更透明。这其中不仅借助了互联网技术,还在业内率先落地了区块链技术。
2018 年 5 月 18-19 日,由 51CTO 主办的全球软件与运维技术峰会在北京召开。
在“区块链技术”分会场,轻松筹联合创始人李汐带来了《轻松筹在公益和互助领域的区块链应用》的主题演讲。
本文主要分为三个方面跟大家分享一个公益众筹领域的区块链项目是如何实现“落地”的,希望能给大家带来启发:
- 为什么要选择区块链技术?
- 什么是阳光链?
- 区块链技术如何在公益和互助领域落地?
为什么要选择区块链技术?
我于 2014 年 9 月开创了轻松筹。历经了三年的发展,我们现在已有 5.5 亿个用户,完成了 C 轮融资,马上要进入 D 轮融资了。
由于我们的业务场景,包括医疗、健康、公益、和保险等都比较切合区块链的应用领域,因此我们于 2017 年上半年开始尝试与区块链相关的技术和研究工作。
目前我主要研究的是如下三个区块链项目:
- 比特币,已经跑通了 UTXO(Unspent Transaction Output,未消费的交易输出,比特币的数据结构模型)的底层代码。
- 以太坊,它是在比特币的基础上做出了重大改变,创新了智能合约,仔细研究过图灵完备的 EVM。
- BM(区块链人物之 Daniel larimer)开发的 EOS(Enterprise Operation System,为商用分布式应用设计的一款区块链操作系统)。
此前,BM 有过 STEEM(代币)和 BTS(BitShares,比特股)两个非常成功的案例,最近他从事的 EOS 是 DPOS(共识机制)的一个亮点。
什么是阳光链?
我们的产品阳光链,主要通过定位公有链,让用户可以公开地去下载它们的帐本,也可以让用户参与到竞争之中,并加入到我们的节点里来。
由于公司并不涉及到代币,因此我们在设计的过程中,没有在系统的架构里实现 Token 的细节,而仅仅预留了一些功能性的接口。
此举的好处在于能够符合国家所倡导的:区块链技术的核心竞争力是要能够接入法律支付,给使用区块链的第三方用户提供更低的门槛。而且,我们所提供的区块链重点是一个分布式的帐本。
我们只是在共识机制上借鉴了 EOS 的 DPOS 机制,而更多的是从公益的角度出发,通过选举一些节点,并更多地从正能量方面引导节点的加入。
在节点的竞争过程中,我们也会进行大量的投票,只有通过了半数的选票才会选出这些节点。同时,我们也能通过有效的机制,来防止这些节点的“作恶”。
现在,我们已经调整为每 1 秒种产生一个区块,从而保证了每天的交易都能够达到更高的效率。
阳光链特性
和其他的区块链应用一样,我们的阳光链也具有如下四个特性:
- 去中心化的分布式帐本。在节点的上传过程中,所有的交易数据都是由不同的节点达成共识之后,才允许打包上传的,因此避免了某个中心化节点持续上传的情况。
- 帐本公开透明。用户可以下载帐本。
- 在公有链上运行一个智能合约。
- 不可篡改。由于它是一个串行式的数据库,因此不允许用户直接在上面修改数据。如果你要篡改,就必须先在区块链上删除一条记录。
阳光链共识机制
在共识机制上,根据 EOS 的 DPOS 机制,我们会先选出几个预先节点。之后我们会搭建几个区块链社区,包括一些有公益偏好的机构,允许它们在通过了半数以上的投票后,作为新的节点加入进来。
上周我们对一台 4 核 8G 的服务器做了压力测试,大概能达到一千多笔的处理量(虽然 EOS 号称能达到百万笔的理论值)。
相对于 EOS“每 0.5 秒产生一个区块”的情况,我们调整为 1 秒。我们所考虑的原因是:如果 1 秒钟内的区块链交易达到了 1 万笔,那么在 0.5 秒之内就会有 1M 的数据需要被传送到另一个节点。
而在此过程中,如果设置为“每 0.5 秒产生一个区块”,则很容易出现节点分叉、或网络数据无法同步。
经过调试,我们发现:“每 1 秒产生一个区块”是比较适合的。我们的整体逻辑是:在 1 秒之内对服务器上所有的交易数据完成打包,并产生一个区块。
我们目前调整的 TPS 值是 1000,在业务高峰期时,如果出现交易量的猛增,我们会在底层逐步调整,并慢慢升至 5000。
因此在这 1 秒钟之内,服务器将 5000 笔交易打包成一个区块,并以广播的形式同步给下一个节点。
当然,此举对于网络的开销是巨大的。因为我们需要在 1 秒钟之内把所有 5000 笔交易全部验证完毕,并且广播出去。
而由于节点之间遵循的是一种轮询的方式,那么下一个节点就不一定能在 1 秒钟之后收到上一个节点的区块;而且就算收到了,如果它与前面的节点未完成同步,就可能出现分叉。
因此,倘若把当时服务器上所有的交易重新打包的话,就很容易形成软分叉(并非技术上导致的硬分叉)。
而一旦分叉增多,则会浪费磁盘的空间。可见这种节点之间的差异,对于网络和服务器的要求都特别高。
阳光链区块链浏览器
上图是我们新发布的区块链产品区块链浏览器。它参考了以太坊的模式,我们可以用它来查看实时产生的最新区块与交易、以及每个块里有多少笔交易。
这是一款我们自己定制和设计的区块浏览器。如果你在我们的轻松筹上进行了捐款,那么本地就会为你申请一个地址。你拿着这个地址,就可以到我们的浏览器上,搜索到刚才交易所处的区块链。
同时,为了去中心化,我们在浏览器上还添加了区块节点。这样我们不只是在打包时,能够看到每个区块所做的明显标识。
还能在服务器不在本地的情况下,提示用户可以切换到区块链上的其他节点。完成切换之后,你会发现数据的显示都是一样的。
区块链技术如何在公益和互助领域落地?
区块链技术使公益更加"透明"
下面我来分享一下我们在公益行业是如何做应用场景的。目前,区块链“火爆”的原因是:它解决了银行之间不信任、和跨国结算的问题。
对应到公益上,我们希望完全实现公开透明的状态,让用户在区块链上能够查询到公益组织每一分钱的具体走向。因此,我们抱着改革公益的目的,做出了阳光链。
阳光链分为如下几个部分:
- 某人生病了、或者需要救治,那么他会在这个链上发布一个项目,我们将其抽象为一个智能合约。
而在技术的角度看来:在合约里声称需要多少钱,以及往合约里面打钱,都可以被抽象为程序代码。
- 爱心人士予以捐款,并通过去中心化的方式去查看捐款记录。因为有了区块链,用户不必再到各个平台去注册新的帐号,而只需拥有一对公私钥便可。
一旦数据在本地被加密,平台就没有办法拿到破解或修改用户的数据了,而必须经过用户的授权方可。可以说,这是移动互联网 3.0 时代的革新。
- 第三方机构,如一些基金组织,它们为了做到公开透明,也必须在这个链上发布合约代码,与各种智能合约进行交互。所有产生的交互都会被存在这个区块链上。
- 我们轻松筹是一个流量的入口。它通过提供捐助信息,让所有的用户都聚集到该平台上,并最终导流到区块链中。
公益组织筹款合约
我们的代码兼容以太坊的 EVM 库。目前区块链有三套代码:BTC、以太坊、和 EOS。当然 Fabric 还有些值得借鉴之处。
就合约代码而言,在每个公益组织加入之后,首先会被分配到的信息包括:名字(如 XX 基金会)、代号、合约版本号、收款的精度,但不涉及到任何 Token 的概念。
其中 totalWithdrawNum 表示该组织可以取出多少善款。最后再通过构造函数,对名称和代号进行初始化。
接着是用户捐款环节,分为两个步骤:
- 我们第一次调用充值接口,让用户通过微信、支付宝、或银行卡将金额充入合约。
我们会反馈用户:“钱被充值到了区块链上”,并被放入了一个总池子—totalSupply 中,以及对应的地址上有多少金额。然后进行支付接口的回调。
我们通过集成支付的 SDK,直接对接第三方支付的回调,以防止“作恶”。因为 SDK 的第一步就是告知用户,他在该区块链上向公益组织充了多大数额的款项。
- 公益组织提取善款,我们通过 TransferByWhite 来设置白名单,以保证只有该公益组织才能够自己调用合约,提取金额。
上图是申请提现动作的代码。其实就是利用加减乘除的简单算法,进行金额上的运算。
受捐者众筹项目合约
每个捐款项目发起的第一步都是要产生合约。我们会为每个项目 LoveProject 继承该组织的合约。
项目在创建之初包含有 ProjectName 和一个哈希值,该哈希值可通过检索的方式来定位本项目,以表明本项目可以筹得多少钱,有多少用户为它捐了款、和最终可以提取多少金额。
在此我们通过 Userlist,直接在页面上“拉出”区块链上的数据。
如上图所示,创建受捐者众筹项目也是要有一个构造函数:
- 第一步,通过 Donate 在支付的过程中回调第三方平台,用函数来确认充值完毕,随即告知合约该地址上已有了金额。
- 第二步,调用捐赠功能将善款捐出去。
之所以分成两步是因为:我们可以将捐赠的动作对外公开,以供其他人调用该方法。
当然我们也可以添加条件限制,以检查此前是否有过充值行为,只有完成了充值、且在区块链上有相应的记录,项目才允许发出提现动作。
区块链浏览器
我们的区块链浏览器,每秒都会在持续给交易进行打包,并按照时间顺序显示到页面上。
那么用户就可以在每个区块中查询到有多少笔交易。通过这种将数据在区块链上公示的方式,大家可以建立共识。
前面提到的区块链浏览器一般是供技术人员,或资深玩家所使用的。他们可以将每笔交易的哈希值复制出来,在区块链浏览器中进行查询。
而对于普通用户而言,由于他们并不了解区块链和交易哈希等技术,因此我们在产品层面上,做出了类似于投递包裹的展示效果,以跟踪显示捐款的流向,同时也方便用户实时查询到自己捐款的记录和去向。
区块链在保险行业的探究与落地
下面和大家分享一下轻松互助。它始于 2016 年 4 月,目前已有约四千万名用户的加入。该模式非常简单:以往根据客户所够买的商业保险,由保险公司进行理赔。
如今根据互助保险,每个用户只需要花费 10 块钱,凭借规模效应,就能形成互助式基金。
倘若某个用户得了保内的疾病,该基金便可赔付 30 万。与传统的商业保险相比,它大幅降低了用户的成本。
那么根据这种业务模式,区块链需要凭借其公开透明的特点和相应的记录,向公正公司证明,该用户在 180 天的观察期之前,确实没生过病。
用户可以去选择区块链上的任何一个节点,而这些节点正是大家在区块链上所选举出的共识机构。
在我们的逻辑中,最为核心的部分当属用户数据的隐私保护。由于在参保时,用户需要输入其姓名和身份证号等信息,我们既不能将这些隐私数据存储在公有链上,以供任何人随意查询;又不能采取中心化的存储方式。
个人隐私信息加密
在区块链隐私保护的技术上,我们采用的是数字加密的思路,即:运用了 PBKDF2 的算法理论。
如上图所示,第一个 RPF 是一个伪随机数,也就是哈希值;第二个是用户的密码;第三个是随机盐;第四个是迭代系数;第五是前面哈希值所打出的长度。
最终该函数会根据用户的迭代次数和原始数据,通过加密打出一个式样。
说到哈希,目前比较完善的方法是采用 HMAC_SHA256 算法,它产生一个 32 位的哈希值。
而在上述 PBKDF2 所使用的伪随机数算法中,它通过 C6 的迭代次数,最终加密打出 32 位的式样。
众所周知,迭代的次数越多、哈希运算的次数也就越多(如 2000 年的 1000 次),那么打出来的值就越安全。
在 2005 年时,迭代的次数已达 4000 到 10000 次;2011 年,LastPass 提出要运行 5000 次。
而到了 2018 年,以太坊的哈希要重复迭代运算可达 10240 次;同样在 2018 年,1Password(著名的密码管理器)使用到了 100000 次。
那么为什么迭代次数可以防止暴力破解呢?如上图所示,用一台普通的 GPU 进行哈希运算 10240 次,如果你的密码长度为 8 位,那么迭代时就是 8×8=64 位。
可见,要破解该式样,需要运算 150 万年。显然,此方法算出来的 PIN(私钥)可以有效防御暴力破解。
AES 对称加密
在加密方法上,我们使用的是 AES 对称加密。就目前而言,它的加密效率最高,破解程度也相对较难。
在运算原理上,它会把前面得出的 256 个字节打成 32 个字节的私钥,对原始数据进行加密。
在具体流程上,用户的身份证信息通过 PIN 进行加密,得到一个 AES 加密过的字母串。
这个数值通过帐号的公钥,传送到 IPFS 的去中心化空间予以存储。在取出的时候,我们通过哈希值和公钥的 PIN,到 IPFS 处获取便可。
考虑到未来可能实现了的量子计算、或其他破解方式,我们还是将各种加密数据存放在了私有链之上。只要用户自己不泄露,安全性就能够得到保证。
互助浏览器
互助浏览器同样也比较贴近用户。当用户需要转账时,系统会将他输入的姓名和身份证所产生的哈希值,与原始哈希进行对比。只有完全匹配,我们才确认是用户本人的真实操作。
另外,我们的互助同样也会有 180 天的观察期,只有在观察期结束之后,用户才能申请赔付。当然,这些所有的信息都会被永久地保存在区块链上
李汐,轻松筹联合创始人& CTO,在金融科技 Fintech 领域有多年核心技术和管理经验,受邀担任过全球互联网架构大会 GIAC、云栖大会等演讲嘉宾。负责公司工程方向的技术把控和技术人才培养,领导并完成了轻松筹大数据、海量核心交易平台和“阳光链”区块链等项目。对比特币、以太坊、数字钱包及智能合约有深入研究,目前专注于轻松筹区块链在公益和互助领域的产品和研发。
【51CTO原创稿件,合作站点转载请注明原文作者和出处为51CTO.com】