Solidity语言简介
发布日期:2021-06-28 22:10:31
浏览次数:2
分类:技术文章
本文共 2414 字,大约阅读时间需要 8 分钟。
Solidity是一种用于编写智能合约的高级语言。Solidity程序需要运行在以太坊虚拟机(EVM)上。 语言特性 语法接近于JavaScript,是一种面向对象的编程语言。但却拥有多种其他语言没有的特性。 1. 由于以太坊底层是基于账户的,所以需要一个特殊的address类型。用于定位用户、定位智能合约、定位合约的代码(智能合约本身也需要一个账户)。 2. 由于Solidity语言本身是支持支付的,提供了一个特殊的关键字:payable。可以在语言层面直接支持支付。 3. 存储需要使用区块链,数据的每一个状态都是可以永久存储的,所以需要确定变量使用内存还是区块链。 4. 运行环境是在去中心化的网络上,所以会比较强调合约或函数执行的调用方法。因为原来一个简单的函数变为了一个网络上的节点中的代码执行。 5. 异常处理,一旦出现异常,所有的执行都会被回撤。主要是为了保证合约执行的原子性。以避免中间状态出现的数据不一致。 Demo pragma solidity ^0.4.0; contract Calc { function add(uint a, uint b) returns(uint) { return a + b; } } 函数类型 可以将函数声明作为数据类型,类似C/C++中的函数指针。函数类型可以用于声明变量,也可以用于函数的参数和返回值。 数据存储位置(内存或区块链中) memory storage 数组、struct可以使用memory或storage 函数参数类型默认是memory的。直接在函数中声明的局部变量默认是storage 数组 数组可以是一维的,也可以是多维的。可以是固定长度,也可以是可变长度。 函数传入数组参数值时要使用中括号([…]) 如[1,2,3,4] 结构体(struct) struct用于自定义数据类型,成员可以是string、int、uint、address、结构体。 结构体可以用于函数的返回值,但是返回结构体的函数只能在合约内部调用。如果在函数中要返回结构体中的变量值,需要用返回多个值的函数。 映射(字典mapping) 通过key获取对应的value key:可以是除了映射类型外的任何类型的值。 value:可以是任何类型的值,包括映射。 重置变量(delete) delete:重置变量 uint、int:0 string:”” address struct { int a; string s; } delete不能重置mapping 类型的变量 mapping(uint=>string) public names; delete names; 结构控制 Solidity不支持goto和switch。 if …else… while do while for break; continue; return ? : view函数与pure函数 0.4.17以前, 用constant修饰函数,0.4.17以后,用view取代constant view修饰的函数,只能读取storage变量的值,不能写入。 pure修饰的函数,不能对storage变量进行读写。 函数调用(使用new创建合约) 函数的调用方式: 1.普通的调用 2.命名参数调用 3.调用另外一个合约中的函数(使用new创建合约) 返回多值函数与多值解构 function fun() public returns(uint, bool, string) { return (10,true,’abc’); } 以太坊计量单位 ether = 以太币//比特币 wei finney szabo 时间计量单位 seconds、minutes、hours、days、weeks和years 异常处理 一旦发生异常,所有的操作都会回滚。 异常处理函数: assert(bool condition) // 0xfe 无效 用于检测内部错误 require(bool condition) // 0xfd reback 用于检测输入和外部组件 revert() reback 合约成员的访问权限 external 用external声明的合约成员可以被其他的合约和交易调用。但不能直接调用(不能直接调用f()),应该使用this.f()。外部函数有时在接收大数组时会更有效率。 public 与external类似,可以在外部和内部调用。 internal 用internal声明的函数和变量只能在内部使用,但可以继承。 private 只能在内部调用,不能继承。 getter函数 Solidity为成员变量自动生成了getter函数。 在同一个合约中,访问合约的成员变量,可以通过内部的方式(data),也可以通过外部的方式(this.data())。 如果要访问另外一个合约中的成员变量,只能通过this.data()。 支持函数重载 继承 合约支持多继承,但同时只会创建一个合约。 编译器会将父合约的所有成员都复制到子合约中。 如果子合约函数与父合约函数相同,则不复制,相当于重写(override)父合约的相同函数。 抽象合约 抽象合约:合约中包含没有实现的函数。 如果一个合约从另一个抽象合约继承,但并没有实现所有的抽象函数,那么当前合约仍然是一个抽象合约。 抽象合约是不能部署到以太坊上的。 接口 限制 1.不能从其他的合约和接口继承 2.不能定义构造函数 3.不能定义变量 4.不能定义结构体和枚举 库 库与合约类似,但库的目的是在一个指定的地址,仅部署一次,然后通过EVM中复用代码。这就意味着库函数调用时,代码是在调用库函数的合约的上下文中执行。通过this可以获得调用合约。 库的限制: 1.不能定义状态变量 2.不能继承或被继承 3.不能接收以太(ether)转载地址:https://blog.csdn.net/yhc166188/article/details/79941129 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
留言是一种美德,欢迎回访!
[***.207.175.100]2024年04月20日 20时57分56秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
HttpsURLConnection 返回 400
2019-04-29
python基础语法05
2019-04-29
Linux基础01
2019-04-29
工作总结04-脚本
2019-04-29
01-MYSQL8环境搭建
2019-04-29
02-初始数据库
2019-04-29
03-基础查询和排序
2019-04-29
查漏补缺!Android开发还会吃香吗?Android面试题及解析
2019-04-29
安卓开发权威指南!2021大厂Android面试经验,不吃透都对不起自己
2019-04-29
java安卓ios开发!字节跳动上千道精选面试题还不刷起来!不吃透都对不起自己
2019-04-29
java安卓开发!那些年Android面试官常问的知识点,送大厂面经一份!
2019-04-29
java开发安卓app!已成功拿下字节、腾讯、脉脉offer,系列篇
2019-04-29
ndk开发字符串转十六进制!我的阿里春招之路分享,帮你突破瓶颈
2019-04-29
上海大厂Android面试经历:这么香的技术还不快点学起来,算法太TM重要了
2019-04-29
不可多得的干货!Flutter中网络图片加载和缓存源码分析,持续更新中
2019-04-29
做了6年的Android,Jetpack-MVVM高频提问和解答,跳槽薪资翻倍
2019-04-29
农民工看完都会了!Flutter尽然还能有这种操作!终获offer
2019-04-29
安卓开发api!Android面试中常问的MMAP到底是啥东东?附面试题答案
2019-04-29
安卓开发入门视频!你了解过移动端适配吗?复习指南
2019-04-29