链课堂02 | 企业应用开发为何选择Fabric?
最近以太坊的智能合约开发很火。然而,几乎没有企业级区块链应用选择用以太坊开发。结合在实际项目应用过程中的经验来看,小编认为以太坊不适合做企业级应用的原因有这三点:权限控制不够,以太坊智能合约查错纠错门槛高、成本高,以太坊智能合约调用的不确定性。而Fabric在这几点上有很大优越性,小编将在后文为大家一一阐述。
01 多维度权限控制
B端应用的开发很多时候是复杂繁琐的。相比之下,以太坊非常方便,你只需要启动客户端钱包,就可以如下图所示开始智能合约的开发了:
或者用remix:
然而,当一切准备就绪后,客户爸爸告诉我,我们的商业数据属于重要机密,要求对有授权的节点才做数据共享,没有授权的节点应该做数据隔离。然后我们发现,在以太坊上没有数据隔离和权限认证的。
这个时候,Fabric的优势很明显了。完整的多维度的证书权限控制,Channel支持节点之间建立数据隔离,Docker化部署智能合约。客户需要的人家都能满足,客户没想到的,他可能也已经做好了。从下面的证书目录结构就可见一斑:
├── ordererOrganizations
│ └── example.com
│ ├── ca
│ ├── msp
│ ├── orderers
│ ├── tlsca
│ └── users
└── peerOrganizations
├── org1.example.com
│ ├── ca
│ ├── msp
│ ├── peers
│ ├── tlsca
│ └── users
└── org2.example.com
├── ca
├── msp
├── peers
├── tlsca
└── users
02 低查错门槛
不知道广大Solidity开发者听到以太坊智能合约爆出漏洞时是什么心情,反正小编每次听到都会有一种心跳加速、血液循环加快的条件反射。
以前做业务开发的时候小编的流程是这样的:
出BUG的时候大概是这样的:
然而,现实的情况是这样的:
出BUG的时候是这样的:
自从做了以太坊智能合约开发以后,小编的开发流程就变成了这样:
出BUG的时候小编的内心是这样的:
而自从用Fabric做智能合约开发以后,情况是这样的:
出BUG的时候是这样的:
嗯,还是原来的味道,还是熟悉的配方!
03 智能合约调用
不知道大家听到接口调用的时候会想到什么,反正小编的第一个反应就是restful,http,api,tcp等等。然而,自从用了以太坊以后,接口调用的画风就变了。首先你需要有类似下面这样的api:
[{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"}...
然后,你所发起的调用,其实可能是这样的:
0x23b872dd0000000000000000000000006e80d21aa536cefdb4a6d5f879af619ef97157760000000000000000000000009f5217d4a04a10649547f5ccd835e2d69efc2a0e00000000000000000000000000000000000000000000000006f05b59d3b20000
面对这样的调用,小编内心有一种无力感。
当然也可能是类似这样的:
var request = {targets: peerNames,chaincodeId: chaincodeName,
fcn: fcn,args: args,chainId: channelName,txId: tx_id};
let results = await channel.sendTransactionProposal(request);
用json传参数,小编感到很安心。
04 小结
说了这么多,其实企业级的应用,考虑更多的是权限控制,数据隔离,开发成本,运维成本等方面。而以太坊做为目前最权威的智能合约公链,显然侧重点不在这方面。而Fabric本身就是针对企业级区块链平台而设计,相较以太坊来说确实会更适合企业级应用。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- golang实现php里的serialize()和unserialize()序列和反序列办法详解
- php和html的区别点详细总结
- 详解在YII2框架中使用UEditor编辑器发布文章
- 在Laravel的Model层做数据缓存的实现
- Thinkphp5.0 框架使用模型Model添加、更新、删除数据操作详解
- php连接mysql数据库最简单的实现方法
- 解决laravel id非自增 模型取回为0 的问题
- PHP7.0连接DB操作实例分析【基于mysqli】
- Laravel获取当前请求的控制器和方法以及中间件的例子
- laravel中数据显示方法(默认值和下拉option默认选中)
- laravel请求参数校验方法
- ThinkPHP 5.x远程命令执行漏洞复现
- 关于php开启错误提示的总结
- php创建类并调用的实例方法
- php异常处理捕获错误整理