区块链笔记:Solidity语言之程序示例、程序结构、数据类型、表达式以及控制结构、异常处理

本文主要是介绍区块链笔记:Solidity语言之程序示例、程序结构、数据类型、表达式以及控制结构、异常处理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Solidity程序示例

// 指定编译版本
pragma solidity ^0.4.21;// 指定contract名字
contract MyContract {// 定义合约中的变量uint256 totalQty;enum Colors (WHITE, BLACK, RED, GREEN, PINK)uint[5] eachLine=[1,2,3,4,5];struct StudyInfo {uint height;address voteAddress;}function MyContract(uint256 _initQty) public {totalQty = _initQty;}function changeEachLine(uint _index, uint _value) public {eachLine[_index] = _value;}
}// 合约的继承
contract MySonContract is MyContract{}
  • 这是一份使用Solidity语言编写的以太坊智能合约的源代码
  • 源码第一行指定编译版本,以太坊在发展过程当中升级了很多版本,包括编译器
  • 不同版本的Solidity之间会存在一些差异,需要指定版本
  • 指定这个合约的名字MyContract, 在这个合约中可以定义变量,枚举量,数组,结构体函数等
  • 合约还可以具备继承关系,和我们通常的程序没什么特别的差别和javascript类似

Solidity 程序结构

  • 以contract定义为一个完整的结构
  • 每个contract相当于java的类
  • 里面包含构造函数、方法、变量等元素
  • contract可以集成其他的contract,方笔智能合约的编写
// 指定编译版本
// ^表示兼容之前的版本,最高只能0.4.19
pragma solidity ^0.4.19// 引入其他文件 import 关键字
import "other_file_name"// 指定contract, 并且加入文档注释,语法:/** ... */
/** @MyContract is a test contract */
contract MyContract {// 单行注释/*多行注释多行注释*/// 变量定义// 方法定义}// 合约集成
contract MySonContract is MyContract{}

主要的数据类型

pragma solidity ^0.4.19;
contract MyContract {// 变量定义mapping(address => uint) public balances;uint x;bool y;string myname;int32 quantity;bytes32 hashValue;address myaddress;
}
  • mapping类型,相当于其他语言里面的关联数组或者key-value结构
    • 这里定义了一个mapping类型,address是地址,以太坊里面有账户地址的概念
    • 这里是通过一个地址关联一个uint类型的值,并且这个变量的名称叫balances
  • uint 无符号类型
  • bool 布尔类型
  • string 字符串
  • int32 32位的整数类型
  • bytes32 32位字节大小的值
  • address 地址类型,在以太坊中专有,实际是一个20个字节大小的数据,也就是160位

表达式以及控制结构

pragma solidity ^0.4.19;contract MyContract {// variable definitionmapping(address => uint) public balances;uint appleQty;uint orangeQty;bool isSuccess;// constructor functionfunction MyContract() public {balances[msg.sender] = 1000;appleQty = 10;orangeQty = 20;isSuccess=true;}// additionfunciton Add() public view returns(uint) {uint r = appleQty + orangeQty;if(r > 100) {return r;} else {return 0;}}// cyclecalcfunction cyclecalc() public pure returns(uint) {uint r = 10;while (r >= 0) {r --;}return r;}
}
  • contract定义一个构造方法,和java中类似,没有返回值,名称和合约名称一样
  • 这就是为什么说Solidity中的合约相当于Java中的类
  • public说明这个方法为公共的,外部可以调用
  • 这里的msg.sender说明合约的调用者的地址,是指合约当前调用者地址,不是一个固定的
  • 这里是构造方法,只有合约在部署的时候,才可以执行一次,谁去部署合约,这个地址就是谁的(部署者)
  • Add方法里面有if判断
  • cyclecalc方法里面有循环处理
  • 这是Solidity中的一些基本表达和控制结构

异常处理

  • 数组越界、Gas不足、除0异常
  • 程序中可以手动抛出异常, 基于不同的场景下
pragma solidity ^0.4.19;contract MyContract {function openDoor(uint paramValue) public payable returns(uint) {assert(paramValue > 0);return msg.value + paramValue;}
}
  • 上面程序中有一个参数paramValue, 这个值必须大于0,否则会出现异常
  • 使用assert进行异常捕获,这是一种异常处理的典型应用
  • 当然还有其他方式也可以处理异常
  • 异常处理在编写智能合约中,对条件的检查起到很重要的作用
  • 智能合约部署后不可篡改,另外智能合约会与某些资产发生关系,是关联的
  • 对于条件的校验是非常需要的

这篇关于区块链笔记:Solidity语言之程序示例、程序结构、数据类型、表达式以及控制结构、异常处理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/950958

相关文章

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟 开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚 第一站:海量资源,应有尽有 走进“智听

06 C++Lambda表达式

lambda表达式的定义 没有显式模版形参的lambda表达式 [捕获] 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 有显式模版形参的lambda表达式 [捕获] <模版形参> 模版约束 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 含义 捕获:包含零个或者多个捕获符的逗号分隔列表 模板形参:用于泛型lambda提供个模板形参的名

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

【区块链 + 人才服务】可信教育区块链治理系统 | FISCO BCOS应用案例

伴随着区块链技术的不断完善,其在教育信息化中的应用也在持续发展。利用区块链数据共识、不可篡改的特性, 将与教育相关的数据要素在区块链上进行存证确权,在确保数据可信的前提下,促进教育的公平、透明、开放,为教育教学质量提升赋能,实现教育数据的安全共享、高等教育体系的智慧治理。 可信教育区块链治理系统的顶层治理架构由教育部、高校、企业、学生等多方角色共同参与建设、维护,支撑教育资源共享、教学质量评估、

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学