您的位置 首页 java

浅说区块链架构和WEB2架构的不同

WEB2和WEB3虽然在名字上非常的相似,但从技术和架构上看,其实是完全不一样的。我们在WEB2上习得的架构经验和法则,在WEB3上并不太适用,需要重新学习和实践。

WEB2发展这些年,从单体应用到现在的 微服务 ,整体技术体系和设施已经非常的完善和成熟了,以至于有人自嘲的说自己就是个CRUD工程师(意思是说工作中经常做的就是数据库的增删改查)。我们大致罗列一下web2里都有哪些,后面解说web3的时候会有一定的关联。

仅说最核心的。web2里做一个应用,首先考虑的用什么存储数据。如 mysql , es, mongodb 等,这个看业务特点,运维能力和团队能力。选用不同的存储服务,就需要建立起不同服务的周边全套设施,如开发时如何使用和优化,平时如何监控,如何设计容量规划,如何备份和恢复等;其次,使用什么开发语言和框架。语言的可选择性不是很大,要看团队和运维的综合考虑。框架的选择看团队控制力,是否有足够的能力来把握。现在优秀的框架有很多, Spring Cloud 就比较常用。有了这些,我们就能运行起一个最小单元的项目,提供服务了。

再向外部拓展。服务要上线就用 jenkins 发布。查问题有链路追踪技术,如pinpoint。还得有应用监控,基础监控,这些设施是用来发现业务量是否高,机器资源是否足够等问题的。服务要高可用就得多实例运行。多实例运行就得有个负载均衡或用微服务发现。入口得做负载均衡,就需要考虑用网关。实例多了就得考虑资源使用率和部署效率,就有了容器化或自动化部署。到这里,整个服务构建的链路就完成了。

那区块链下如何做呢?

有几个概念需要理清楚,不理解就好比WEB2下不了解GET、POST,不了解什么是数据库,也就无法理解,怎么实现一个点赞功能(有状态服务,数据需要持久化)。

那哪些是区块链的核心概念。区块,分布式账本和状态机!

区块可以看做是一个个的包裹,这个包裹是矿工打包的(因为有奖励费用,俗称挖矿),里面全是交易记录,打包到区块里的交易才是有效的。(ps思考题:那矿工打包的区块怎么就成了分布式账本呢?因为 p2p 协议的同步和共识机制。如何保证没有双花问题?也就是如何保证我仅有的1ETC,不被花费两次。为何需要等最少6个确认,才认为交易是安全的。我这里就不细说的,如果对这个有兴趣的可以看看B站上 北京大学 肖臻老师的区块链公开课。)

分布式账本和状态机。这个可以说是区块链里最大的不同了。状态机是分布式账本,但是分布式账本不是状态机。bitcoin,dogecoin, ltc 是分布式账本, eth ,torn,polygon是状态机。分布式账号最大的特点是,里面的交易输入和输出从一开始就固定,没有任何的运算逻辑。反过来就是, 状态机 可以运算。那状态机如何运算?就是靠EVM(会 java 的同学会知道有 JVM )和合约代码。合约代码在交易里,每次验证交易的时候,合约代码都会执行,执行成功提交状态到状态机,失败则回滚到之前的状态。EVM在每个客户端节点上执行,在每个矿工客户端上执行。(ps思考题:为什么智能合约能实现闪电贷?—提示,事务保证,状态提交或回滚)。一个公链想要能支持状态机,就必须先改造存储结构,因为比特币里没有办法直接知道一个地址的余额,但是合约里又有大量的账号相关查询,如何解决?从底层体系改造,自从V神提出可编程的区块链,他就看到了这点,重新实现一套状态机区块链,也是在他的推动下,ETH才实现了一个和比特币完全不一样的内在实现,状态机和智能合约。

好了,接下来说说如何开发智能合约,从小的点切入进来。

tips: 区块链没有后端!web UI + blockchain + 合约 是整个体系的基本构成。

合约可以看成后端代码,看成API,看成服务。不过代码是开源的,因为要证明你是不作恶的,契约嘛。

先简单说说合约开发。ETH常用Solidity开发,也有其他的选择,比如用 python 。要是Hyperledger,还可以用golang,具体研究不多。合约的开发web IDE 可用 remix。开发脚手架可以用hardhat,公共库比较知名的用 zeppelin ,之前很多合约爆出漏洞就出在数据类型的处理上,这个库做了比较好的防范。

web UI 用 web3,有不同语言的实现,如web3.js或we3j(java)。这个是用来和区块链进行交互的,比如发送交易,查询余额等。那web3.js是如何和区块链进行交易的呢?区块链的节点不就是个实现了p2p协议同步数据用的么?是的,区块链接口虽然有提供 rpc 接口,但web3 SDK是不会直接和区块链通讯的,而是调用像 alchemy 公司infura 服务提供的接口,来实现链上数据读写的。

有人说,区块链智能合约是一个黑暗森林(关键字:区块链 黑暗森林)。事实还真是这样,看看那些暴雷的合约,几个亿的美金可能就被锁死,被盗。为何这么难?有bug及时修复, 止损 啊。但是,在区块链上,因为不可更改性,你无法阻止!无法改bug!

智能合约一经部署,不可更改。我当初看到这个,心如死灰,人在江湖走,哪能不出bug? 现在对这句话有个新的解读是,设计不良的合约,不可更改。但从设计层面,可以解决这个问题。那解决这个问题有个套路吗?能有个什么设计模式么?就像web2里的MVC模式,工厂模式,代理模式。。太多。答案是,有的。

解决智能合约不能更改的模式是,使用可升级合约模式开发(对于web2里的代理模式),关键字 upgrading smart contracts 。当前还有其他的,比如我只希望管理员能管理这个合约,那就 user roles,这些功能 zeppelin 也做了一些封装。其实从这里你能看出来状态机的用途了吧,能看出和web2存储的不同了吧。

引出一个复杂的问题。如何从工程角度实现一个像 uniswap 或 aave 这样的 DeFi?总不能只写一个合约搞定所有事情吧?那合约接口如何管理?如何升级?管理员怎么实现?我如何调用外部数据呢,怎么解决可信问题,是幂等的吗?怎么实现随机数?区块链上的数据怎么查询呢?这里就不细说了,有机会专门来写。这里写出来算是抛砖引玉了。自行研究有路可循,研究著名项目,建议看 uniswap ,先从白皮书开始,找 youtube 视频,在参照白皮书提问研究代码,此处重点,不要部署不要部署!会花费相当大的精力,部署不是必要的。

最后,说说生态吧。上面其实面比较偏。给大家看一下更大的世界。

浅说区块链架构和WEB2架构的不同

我的微信公众号 永飞手记 feidaonote

文章来源:智云一二三科技

文章标题:浅说区块链架构和WEB2架构的不同

文章地址:https://www.zhihuclub.com/192697.shtml

关于作者: 智云科技

热门文章

网站地图