在只有比特币的年代,区块链能够实现简单的价值产生和转移,但却未出现更多的商业模式。

以太坊给区块链带来了维度的提升,基于区块链的应用渐趋丰富,区块链的各种商业模式加速涌现。

这其中很重要的原因,是以太坊给区块链带来了一套图灵完备的编程语言。

区块链的主要功能,是实现了多方的共识。

  Solidity 介绍

Solidity语言和Java存在着些许相似之处。

在众多编程语言中,Java是发展较为成熟的。

Java代码在Java虚拟机(JVM)执行。

JVM屏蔽掉了操作系统的差异,使得Java成为一个跨平台的语言。一套Java代码可在Windows、Linux、Mac上通用,而不需要关心操作系统的差异。

Solidity与Java类似。代码写好后,都需要通过编译器将代码转换成二进制。

  • 在Java中,编译器是Javac,
  • 对于Solidity,是solc。

生成后的二进制代码,会放到虚拟机里执行。

  • Java代码在Java虚拟机(JVM)中执行,
  • 在Solidity中,是一个区块链上的虚拟机EVM。

Solidity与Java的不同之处在于,Solidity是服务于区块链的语言,代码在区块链上执行。

  • EVM是区块链上的一个执行器。每个区块链节点都有一个EVM。
  • Solidity在EVM中被执行后,EVM对区块链的数据进行了改变。这些数据的改变交由共识算法去共识。
  • Solidity的操作仅限于EVM内部,不能访问外部不确定系统或数据,如系统时钟,网络文件系统等。

Solidity的设计目的,是给区块链提供一套统一的逻辑,让相同的代码跑在区块链的每个节点上,借助共识算法,让区块链的数据以统一的方式进行改变,达到全局一致的结果。

  Solidity 实现细节

以此处的Demo合约为例,合约中有一个全局变量m,并有一个函数add(),实现给全局变量m增加x数值的功能。

通过合约编译器solc,可将此合约编译成二进制。

二进制的每个字(8 bit),表示一个EVM的操作码(OPCODE)。

Demo合约编译出的二进制及其相应的OPCODE如下,实现了完整的Demo合约的功能,包括

  • 对合约的装载、
  • 合约接口的调用
  • 异常处理的逻辑。

其中,标红部分是add()方法的实现。

将add()函数的OPCODE的标红部分摘取出来,可看到其具体的实现思想与汇编代码相同,是一种基于堆栈式的操作。

其中的

  • SLOAD将区块链上指定位置的数据读入堆栈顶部,
  • ADD实现将堆栈顶端的两个数据相加,
  • SSTORE再将相加后放在堆栈顶部的结果写入区块链下一个区块的数据中,为下个区块的共识做准备。

  • 在合约二进制被部署到区块链上后,
  • 通过发送交易调用合约里的方法。
  • 节点根据交易将合约代码装载入EVM中,
  • 并根据交易的传参执行合约上相应的函数add()。

EVM执行合约代码,从区块链上读入当前区块的数据,进行相加操作,并将结果写入下一个区块(等待共识的区块)对应的状态数据中。

此后,共识算法将待执行的区块共识落盘,区块高度增加,区块链上的数据完成更新。

上述步骤可见,Solidity的实现与当今已有的做法有着很多相似之处。

  • 编译,用的是传统的套路,将代码转换成虚拟机可执行的二进制;
  • 执行,也是与传统方式相同,借助堆栈作为缓冲区执行二进制代码。

  Solidity 局限与改进

Solidity由于是第一个大规模应用的智能合约语言,存在着一些有待改进的地方。

Solidity不够灵活。

  • Solidity语言受到自身堆栈深度的限制,函数传参和局部参数的个数总和不能超过16个。要实现一些比较复杂的函数难免有些鸡肋。
  • Solidity是一种强类型的语言,但其类型转换较为麻烦。将整型转换成字符串时需要转换成二进制再拼接。
  • 在字符串的操作上,缺少一些方便的函数。

Solidity的性能较差。

在执行上,OPCODE的执行是一种用程序模拟的汇编执行器,而不是直接使用CPU的资源。

(因为opcode由evm执行,但evm是计算机上的一个程序,evm本身的代码是要在cpu上运行时,因此说,不直接使用cpu资源)

在存储上,Solidity的底层存储单位是32字节(256 bits),对硬盘的读写要求较高,浪费了大量的存储资源。

针对上述两点,FISCO BCOS提供了一种用C++写合约方式:预编译合约。开发者可以用C++编写智能合约逻辑,并将其内置在节点中。

预编译合约的调用方法与Solidity合约相同,通过合约地址即可直接调用。FISCO BCOS提供了参数解析,将调用的参数解析成C++可识别的格式。

预编译合约突破了Solidity语言的限制,借助强大的C++语言,可以灵活的实现各种逻辑,灵活性大大提高。同时,C++的性能优势也得到了很好的利用,通过预编译合约编写的逻辑,相比于Solidity语言来说,性能得到提升。

https://mp.weixin.qq.com/s/Z6r94E8kRJ6ROUhdugtjpw

区块链 Fisco bcos 智能合约(11)-深入浅出Solidity相关推荐

  1. 区块链 Fisco bcos 智能合约(19)-区块链性能腾飞:基于DAG的并行交易执行引擎PTE

    在区块链世界中,交易是组成事务的基本单元. 交易吞吐量很大程度上能限制或拓宽区块链业务的适用场景,愈高的吞吐量,意味着区块链能够支持愈广的适用范围和愈大的用户规模. 当前,反映交易吞吐量的TPS(Tr ...

  2. 区块链 Fisco bcos 智能合约(22)-全面的性能分析工具

    前 言 We should forget about small efficiencies, say about 97% of the time: premature optimization is ...

  3. 【区块链DAPP】智能合约概述

    智能合约概述 智能合约是运行在区块链公链上的一种代码,该代码由Solidity编写,并通过区块链的智能合约虚拟机来执行,以达到对区块链编程的目标.可以将区块链公联理解为操作系统,Solidity是编写 ...

  4. 区块链中的智能合约是什么?

    链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. "智能合约是一套以数字形式定义的承诺,承诺控制着数字资产并包含了合约参与者约定的权利和义务,由计算机系统自动执 ...

  5. 行走在区块链上的智能合约

    链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. 我和你打一个赌,我赌明天是雨天,你赌是晴天,赌注100大洋.假设明天是晴天,然后你跑过来管我要100大洋的赌金,我装疯卖 ...

  6. 分享实录|区块链技术与智能合约入门(开发实例)

    2019独角兽企业重金招聘Python工程师标准>>> 1 什么是区块链 1.1白话讲解区块链 现在区块链特别火,可能大家都听说过区块链,听说过比特币,那到底什么是区块链? 前几天和 ...

  7. 区块链技术:智能合约入门

    什么是智能合约 一个智能合约是一套以数字形式定义的承诺(promises) ,包括合约参与方可以在上面执行这些承诺的协议.一个合约由一组代码(合约的函数)和数据(合约的状态)组成,并且运行在以太坊虚拟 ...

  8. fisco bcos 智能合约开发

    项目需求2张表:资源表.资源访问记录表,需要资源上链智能合约.访问记录上链智能合约.以及资源所有权转移智能合约. FISCO BCOS提供合约KV存储接口开发模式,可以通过合约创建表,并对创建的表进行 ...

  9. 区块链 fisco bcos 2.72 在多机器上部署多个docker节点 ubuntu

    一.安装 1. 安装依赖 安装curl.openssl: sudo apt-get update sudo apt install -y curl openssl 2. 安装docker: (1)安装 ...

  10. 编写区块链游戏学智能合约 教程2:僵尸攻击人类

    该教程来自 CryptoZombies 网址:https://cryptozombies.io/zh/course/ CryptoZombies 是个在编游戏的过程中学习 Solidity 智能协议语 ...

最新文章

  1. vb 使用Array.ConvertAll将object类型数组转为string类型数组
  2. python面向接口编程_Python 中的面向接口编程
  3. Spring-Cloud中各个组件的职责
  4. 前端学习(2247)为什么用git-new
  5. ubuntu14.04下安装cudnn5.1.3,opencv3.0,编译caffe及配置matlab和python接口过程记录
  6. 【Flink】Error during binlog processing last offset stored = null binglog reader near position
  7. python websocket实现消息推送_python Django websocket 实时消息推送
  8. 实训|第七天横扫Linux磁盘分区、软件安装障碍附制作软件仓库
  9. 文字描边_CSS3实现文字描边的2种方法
  10. 简单理解Binder机制的原理
  11. oracle的imp输出日志,Oracle下的exp/imp
  12. linux usb 存储设备,找到哪个驱动器对应于Linux中的哪个USB大容量存储设备
  13. win10上U盘插到电脑上无法显示盘符也打不开怎么办
  14. python用smtp发邮件怎么抄送_邮件未发送给抄送中的人
  15. 计算机扩大C盘分区容量,教你在保留数据的情况下,如何把C盘容量无限扩大!...
  16. 蜂鸟E203开源RISC-V开发板:蜂鸟FPGA开发板和JTAG调试器介绍
  17. RetinaNet模型在DDSM数据集的应用问题(3)
  18. python import注意事项
  19. App架构师实践指南四之性能优化一
  20. hdu5078 hdu5074 顺便写一写鞍山

热门文章

  1. linux下的hosts文件
  2. ABP 集成 nswag 根据 Swagger API 自动生成操作类代码
  3. [3]java1.8线程池—ThreadPoolExecutor
  4. ios微信上无法自动播放音频的情况
  5. JavaScript Array(数组)对象
  6. Delphi初浅入门笔记之六:高级数据类型
  7. 排序算法--基数排序
  8. java opencv去除干扰线_电子产品硬件研发—提高抗干扰性能的常用方法
  9. 拓端tecdat|数据分析促进白血病预测诊断
  10. 拓端tecdat|在Python中使用LSTM和PyTorch进行时间序列预测