热门标签 | HotTags
当前位置:  开发笔记 > 开发工具 > 正文

从零学本体dApp开发(8):白话解读本体智能合约为何要消耗gas?

原创|工匠(来自本体社区的技术人员)---------------写在前面最近在利用业余时间学习本体的开发。我打算把自己学习的过程记录下来࿰

原创 | 工匠 (来自本体社区的技术人员)

---------------


写在前面

最近在利用业余时间学习本体的开发。我打算把自己学习的过程记录下来,一方面便于自己梳理学到的东西,另一方面希望可以通过笔记的共享,能使本体后来的开发者少走弯路。

由于是初学者,学习本体开发的过程中遇到了很多问题,在此,特别感谢本体社区的各位老师(宏雷、楚笙、Mickey、雪飞的逆袭、Andy季、周佩文等)耐心地为我解答各种各样的问题,本体有你们,真好!


 


学习本篇的目的:

 

在《本体SmartX到底是个是啥》一文中我们学习了使用SmartX进行智能合约开发,其中提到智能合约的部署和运行都需要消耗gas,就是ONG,这样篇我们来学学为什么需要消耗gas。


 

目录:

1. 本体部署和运行智能合约为何要gas?

2. 部署和运行要消耗多少gas?

3. 合约消耗gas的具体过程

 


1.本体部署和运行智能合约为何要gas?

智能合约的部署是什么?简单来说就是把智能合约编译出来的可执行文件放到区块链中。部署的过程可以可以理解成你在windows上安装一个软件,但是只是安装,还没有运行。智能合约的调用,就好比是windows上安装的这个软件运行起来了。

一开始我不能理解为什么部署也要消耗gas,后经社区专业人员的讲解弄懂了。区块链上的资源,如RAM、CPU和网络等,都非常的宝贵的,就像EOS中租用任意一种资源都要收费的。把合约部署到区块链上,其实是会占用RAM的,所以智能合约的内容越大,需要消耗的gas就越贵。

而智能合约执行,需要消耗gas也好理解了,因为代码执行是需要占用CPU和网络资源的,这些资源有些是节点提供的,所以消耗的gas都会奖励给节点(即矿工)。

 


2.部署和运行要消耗多少gas?

 

在SmartX进行智能合约部署时,会调用Cyano wallet钱包。就像你在网上买东西,付款时要绑定银行卡一样。调用的界面如下:

里面会涉及到连个数量,Gas price和Gas limit。

Gas limit 是在执行智能合约的 opcode 过程中计步时使用,理论上智能合约越复杂,需要的 GAS limit 数量越高,Ontology 交易设定最低的 GAS limit 数量是 20000

 

我们知道代码在计算机上时一步一步执行的,本体中智能合约也时按步计费的,智能合约余额复杂,执行的步数就越多,就消耗越多的gas。

 

GAS price 是给执行 opcode 定价,GAS price 越高,共识节点会优先打包该笔交易

GAS price 其实就时每步的单价,那么需要消耗的总gas = Gas limit x GAS price 。

 

这里社区的专业人员用出租车来类比,会很好理解。我们坐出租车按里程计算,里程数就相当于Gas limit,出租车有起步价,就是三公里,而Gas limit 也有起步价,为20000,即你的智能合约执行步数少于20000,也按20000来算。

而每公里的单价就和GAS price 一样,高峰期时我们很难打到车,可以通过加价来更快地打到车,同样的在区块链拥堵时,把GAS price 设的高一点,合约就会被优先执行。

 

交易费用= GAS limit x GAS price ,实际的交易费用分以下三种情形:


  • 执行 opcode 步数等于 GAS limit

    交易费用 = GAS Price x GAS limit

  • 执行 opcode 步数大于 GAS limit

    交易费用 = GAS Price x GAS limit

    交易失败,但 GAS 不会退还。

  • 执行 opcode 步数小于 GAS limit

    交易费用 = GAS Price x (opcode实际消耗)

    多余的 GAS 会退还,但最低消费是 20000。

所有的 ONT, ONG 的转账 GAS limit 消费默认固定都是20000。

 

我们在部署和执行合约要先填写GAS limit 和 GAS price的具体数量,其实就是支付预付款,但实际用款不一定和预付款一样,当实际用款和预付款一样多时,就正好,实际用款小于预付款时,多余的会退回钱包,当实际用款大于预付款是,合约就不能部署或运行成功,但预付款也不会退的。

所以我们在设定GAS limit 时一定要稍微设置的到一点,因为小了,合约不成功,gas也没了。所以要做好gas的估算。

 


3.合约消耗gas的具体过程

 

其实合约部署过程中消耗gas,也是一笔交易过程,交易的一方时合约开发者,另一方是本体系统,只不过消耗的这笔gas最终本体系统还要奖励给矿工。

当合约部署成功后,就是交易成功后,SmartX中会显示出这笔交易的相关信息,如下图:

 

 

我们可以根据交易的哈希值,到区块链上查询这笔交易,或者直接在solo-chain里面查询,如下如的第一行就是刚刚部署智能合约成功的交易,

 

点击右侧“Detail”按钮,可以看到详细的信息如下图:

可以看到消耗的gas是10000000000,相当于10个ONG,而交易涉及的两个地址,发送方是我钱包的账户,接受方是治理合约地址,这个gas还会根据本体合约内部的分配规则分配给矿工。

 


写在最后

希望有更多的小伙伴参与到本体开发学习中来,让我们共同为本体的生态建设添砖加瓦!感兴趣的小伙伴可以联系我,共同学习!



推荐阅读
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • 服务器上的操作系统有哪些,如何选择适合的操作系统?
    本文介绍了服务器上常见的操作系统,包括系统盘镜像、数据盘镜像和整机镜像的数量。同时,还介绍了共享镜像的限制和使用方法。此外,还提供了关于华为云服务的帮助中心,其中包括产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题和视频帮助等技术文档。对于裸金属服务器的远程登录,本文介绍了使用密钥对登录的方法,并提供了部分操作系统配置示例。最后,还提到了SUSE云耀云服务器的特点和快速搭建方法。 ... [详细]
  • 如何实现JDK版本的切换功能,解决开发环境冲突问题
    本文介绍了在开发过程中遇到JDK版本冲突的情况,以及如何通过修改环境变量实现JDK版本的切换功能,解决开发环境冲突的问题。通过合理的切换环境,可以更好地进行项目开发。同时,提醒读者注意不仅限于1.7和1.8版本的转换,还要适应不同项目和个人开发习惯的需求。 ... [详细]
  • 2016 linux发行版排行_灵越7590 安装 linux (manjarognome)
    RT之前做了一次灵越7590黑苹果炒作业的文章,希望能够分享给更多不想折腾的人。kawauso:教你如何给灵越7590黑苹果抄作业​zhuanlan.z ... [详细]
  • 本文介绍了H5游戏性能优化和调试技巧,包括从问题表象出发进行优化、排除外部问题导致的卡顿、帧率设定、减少drawcall的方法、UI优化和图集渲染等八个理念。对于游戏程序员来说,解决游戏性能问题是一个关键的任务,本文提供了一些有用的参考价值。摘要长度为183字。 ... [详细]
  • 如何去除Win7快捷方式的箭头
    本文介绍了如何去除Win7快捷方式的箭头的方法,通过生成一个透明的ico图标并将其命名为Empty.ico,将图标复制到windows目录下,并导入注册表,即可去除箭头。这样做可以改善默认快捷方式的外观,提升桌面整洁度。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • Java和JavaScript是什么关系?java跟javaScript都是编程语言,只是java跟javaScript没有什么太大关系,一个是脚本语言(前端语言),一个是面向对象 ... [详细]
  • 恶意软件分析的最佳编程语言及其应用
    本文介绍了学习恶意软件分析和逆向工程领域时最适合的编程语言,并重点讨论了Python的优点。Python是一种解释型、多用途的语言,具有可读性高、可快速开发、易于学习的特点。作者分享了在本地恶意软件分析中使用Python的经验,包括快速复制恶意软件组件以更好地理解其工作。此外,作者还提到了Python的跨平台优势,使得在不同操作系统上运行代码变得更加方便。 ... [详细]
author-avatar
mobiledu2502870743
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有