基于以太坊的智能合约开发Solidity(基础篇)

参考教程:基于以太坊的智能合约开发教程【Solidity】_哔哩哔哩_bilibili

1、第一个程序——Helloworld:

//声明版本号(程序中的版本号要和编译器版本号一致)
pragma solidity ^0.5.17;
//合约
contract HelloWorld
{//合约属性变量,也叫状态变量(定义方式:数据类型 变量名 = 数据)string myName = "helloworld";  //在solidity中,用单引号包含字符串也是可以的//合约中的方法(注意语法顺序,其中此处“view”代表方法只读,不会消耗燃料;“returns”后的是返回值类型)function getName() public view returns(string){return myName;  //返回值类型要与returns声明的严格相同}//可以修改属性变量的值,但是会消耗燃料function changeName(string _newName) public{myName = _newName;}//“pure”代表不能读取也不能改变状态变量function pureName(string _name) public pure returns(string){return _name;}/*用constant、view、pure修饰function分别表示:constant:只能读取不可改变状态变量(就是contract中定义的变量)view:只能读取不可改变状态变量,和constant一样pure:不能读取也不能改变状态变量*/}

(1)程序编译完成后,需要在虚拟机上运行,将合约部署好后便可执行刚刚编写的函数。(注意,合约一旦部署,就会永久存在于区块链上,且不可篡改,不过可以销毁)

(2)执行完成后,可以得到以下交易信息,下图所示的就是生成的区块信息:

(3)代码相关:

①属性变量定义方式:数据类型 变量名 = 数据(变量命名规则和c语言相同)

②一般用双引号包含一串字符串,不过在solidity中,用单引号包含字符串也是可以的。

③Solidity值类型:(在Solidity中,一旦一个变量被指定了某个数据类型,如果不经过强制转换,那么它就永远是这个数据类型,在调用函数时如果形参和实参类型不同将会报错

• 布尔类型(bool):可能的取值为字符常量值true或false

• 整型(int/uint):分别表示有符号和无符号的不同位数的整型变量,支持关键字uint8到 uint256(无符号,从8位到256位)以及int8到int256,以8位为步长递增

• 定长浮点型(fixed / ufixed):表示各种大小的有符号和无符号的定长浮点型,在关键字ufixedMxN和fixedMxN中,M表示该类型占用的位数,N表示可用的小数位数

• 地址(address):存储一个 20 字节的值(以太坊地址大小)

• 定长字节数组:关键字有 bytes1,bytes2,bytes3,...,bytes32

• 枚举(enum):一种用户可以定义类型的方法,与C语言类似,默认从0开始递增,一般用来模拟合约的状态

• 函数(function):一种表示函数的类型

④solidity函数的标准形式:

function functionName() {private|internal|external|public} [pure|constant|view|payable] [returns()]

在合约中定义函数要以function开头,后接函数名称,括号内则是传入函数中的参数(每一个参数的类型以及名称要依次写出,没有参数则不写),“returns”后接该函数返回值的类型(无返回值则可以不写returns)。

⑤用constant、view、pure修饰function分别表示:

    constant:只能读取、不可改变状态变量(就是contract中定义的变量)

    view:只能读取、不可改变状态变量,和constant一样,不消耗燃料

    pure:不能读取也不能改变状态变量,一个固定的输入只能有一个固定的输出

[1]以下情况被认为是修改状态:修改状态变量(函数体外部、合约内部创建的变量就是状态变量)、产生事件、创建其它合约、使用selfdestruct、通过调用发送以太币、调用任何没有标记为view或者pure的函数、使用低级调用、使用包含特定操作码的内联汇编。

[2]以下被认为是从状态中进行读取:读取状态变量、访问this.balance或者 <address>.balance、访问block,tx,msg中任意成员(除msg.sig和msg.data之外)、调用任何未标记为pure的函数、使用包含某些操作码的内联汇编。

⑥用external、public、internal、private修饰function分别表示:

    external:外部函数作为合约接口的一部分,意味着可以从其他合约和交易中调用,  一个外部函数f不能从内部调用(即f不起作用,但this.f()可以,这些后续都会详细介绍),当收到大量数据的时候,外部函数有时候会更有效率。

    public:public函数是合约接口的一部分,可以在内部或通过消息调用对于public状态变量,会自动生成一个getter函数

    internal:这些函数和状态变量只能是内部访问(即从当前合约内部或从它派生的合约 访问),不使用this调用。

    private:private函数和状态变量仅在当前定义它们的合约中使用,并且不能被派生合 约使用。

⑦solidity中函数可以递归调用。

⑧solidity可以使用import导入其它源文件:

[1]import "filename";  //从“filename”中导入所有的全局符号到当前全局作用域中

[2]import * as symbolName from "filename";  //创建一个新的全局符号symbolName,其成员均来自“filename”中的全局符号

[3]import {symbol1 as alias, symbol2} from "filename";  //创建新的全局符号alias和symbol2,分别从"filename"引用symbol1和symbol2

[4]import "filename" as symbolName;  //这条语句等同于import * as symbolName from "filename";

2、语法——逻辑运算:

//声明版本号(程序中的版本号要和编译器版本号一致)
pragma solidity ^0.5.17;
//合约
contract BoolTest
{bool a;  //创建布尔类型变量时如不初始化,默认赋为falsefunction geta() public returns(bool){return a;}function getnota() public returns(bool){return !a;  //a当前为false,经过非运算后会返回true}int c = 1;int d = 2;//(这部分与c语言几乎完全相同,就不列举所有情形了)function cdequal() public returns(bool){return c==d;  //c与d当前不相等,c==d不成立,会返回false}function cdequalAnd() public returns(bool){return c==d && true;  //c==d返回false,false与true进行与运算,结果为false}function cdequalOr() public returns(bool){return c==d || true;  //c==d返回false,false与true进行或运算,结果为true}function cdnotequalAnd() public returns(bool){return c!=d && true;  //c与d当前不相等,c!=d成立,返回true,true与true进行或运算,结果为true}
}

3、语法——整型与算术运算:

//声明版本号(程序中的版本号要和编译器版本号一致)
pragma solidity ^0.5.17;
//合约
contract MathTest
{//加(a与b为传入方法中的参数,下同理)function add(uint a,uint b) public returns(uint){return a+b;}//减function minus(uint a,uint b) public returns(uint){return a-b;}//乘function multiply(uint a,uint b) public returns(uint){return a*b;}//除function divide(uint a,uint b) public returns(uint){return a/b;}//取余运算function mod(uint a,uint b) public returns(uint){return a%b;}//幂运算function square(uint a,uint b) public returns(uint){return a**b;}
}

4、语法——位运算:

//声明版本号(程序中的版本号要和编译器版本号一致)
pragma solidity ^0.5.17;
//合约
contract MathTest
{//uint8表示大小为8个位的无符号整型uint8 a = 3;  //二进制表示为00000011uint8 b = 4;  //二进制表示为00000100//按位与(该部分和c语言也几乎完全相同)function bitwiseAnd() public returns(uint8){return a&b;}//按位或function bitwiseOr() public returns(uint8){return a|b;}//按位取反function tilde() public returns(uint8){return ~a;}//按位异或function caret() public returns(uint8){return a^b;}//左移(左移运算符后接左移的位数)function leftShift() public returns(uint8){return a<<1;}//右移(右移运算符后接右移的位数)function rightShift() public returns(uint8){return a>>1;}
}

(图源:https://blog.csdn.net/aiwaston/article/details/113665723)

5、语法——复合运算:

//声明版本号(程序中的版本号要和编译器版本号一致)
pragma solidity ^0.5.17;
//合约
contract MathTest
{uint a = 1;//该语法也和c语言基本完全相同//输出afunction add1() public returns(uint){return a++;  //执行完该语句后a的值会加1}//输出a+1function add2() public returns(uint){return ++a;  //执行该语句前a的值会加1,然后再执行该语句}//输出afunction sub1() public returns(uint){return a--;  //执行完该语句后a的值会减1}//输出a-1function sub2() public returns(uint){return --a;  //执行该语句前a的值会减1,然后再执行该语句}
}

6、现象——整型溢出:

//声明版本号(程序中的版本号要和编译器版本号一致)
pragma solidity ^0.5.17;
//合约
contract MathTest
{//这部分也与c语言几乎完全相同function flow() view public returns(uint8){uint8 mm  = 255;  //二进制为11111111mm++;return mm;  //mm只有8位,但是对于mm,再加1会得到100000000,只能取前8位,于是返回0而不是256}function flow2() view public returns(uint256){uint8 mm  = 255;mm++;return mm;  //即使返回值声明有256位,但是在“mm++”这一步mm就被修改为0,所以返回的还是0}function flow3() view public returns(uint){uint mm  = 255;  //这次没对mm的位数进行限制,它可以装下100000000mm++;return mm;}function flow4() view public returns(uint8){uint8 nn = 0;nn--;return nn;  //对00000000做减法,会先给“第九位”添1(要明确nn的位数),那么就会得到结果11111111,转换成十进制就是255(对于有符号数,就涉及到了补码的运算,同理,先转换成补码按此规律运算,再转换回十进制)}
}

7、现象——非法运算:

//声明版本号(程序中的版本号要和编译器版本号一致)
pragma solidity ^0.5.17;
//合约
contract MathTest
{function errorTest() view public returns(int){int a = 2;int b = 3;return a/b;  //既然声明了返回值为整型,那么就不可能得到小数//不过solidity允许整型运算的过程中存在小数,只是结果不能接纳小数,比如2/5-2/5//solidity会将表达式计算出结果后再按照一定的规则(比如整形溢出等)进行处理,比如2**99-2**99+1}function errorTest2() view public returns(int){int a = 2;int b = 0;return a/b;  //0不能做除数,这个方法甚至不能成功编译}function errorTest3() view public returns(int){int a = -1;int b = 0;return b >> a;  //位移运算符不接受负数}}

8、语法——固定长度字节数组:

//声明版本号(程序中的版本号要和编译器版本号一致)
pragma solidity ^0.5.17;
//合约
contract ByteArray
{bytes1 public num1 = 0x7a;  //1个字节长度的变量bytes2 public num2 = 0x7a68;  //2个字节长度的变量bytes12 public num3 = 0x7a68656e676a69616e78756e;  //12个字节长度的变量
}

(1)在solidity中,直接用public声明成员变量,编译部署后,会生成一个默认的get方法,通过该方法可以直接查看这个成员属性,而不需要通过自拟函数返回这个成员属性。

(2)字节数组同样支持位运算以及逻辑运算。

(3)固定长度字节数组不可以仅仅对某个字段进行更改(可以仅对某个字段进行读取,如下表所示),要么就直接对其整体重新赋值

名称

num3[0]

num3[1]

num3[2]

num3[3]

num3[4]

num3[5]

num3[6]

num3[7]

num3[8]

num3[9]

num3[10]

num3[11]

内容

0x7a

0x68

0x65

0x6e

0x67

0x6a

0x69

0x61

0x6e

0x78

0x75

0x6e

(4)定长字节数组的关键字有bytes1,bytes2,bytes3,...,bytes32。

(5)不管是定长数组还是动态长度数组,都不能越界访问,否则会报错。

9、语法——动态长度字节数组:

//声明版本号(程序中的版本号要和编译器版本号一致)
pragma solidity ^0.5.17;
//合约
contract DynamicByteArray
{bytes public name = new bytes(2);  //为动态字节数组开辟2个字节的空间function initName() public{name[0] = 0x7a;  //对动态长度字节数组进行初始化name[1] = 0x68;}function getLength() view public returns(uint){return name.length;  //8个位(一个字节)为一个长度单位}function changeName() public{name[0] = 0x88;  //可以对某一字段进行修改}function changeLength() public{name.length = 5;  //可以修改数组的长度,不过修改的同时会将数组的内容全部置为0}function pushTest() public{name.push(0x99);  //可以在数组末尾追加字节元素,同时增加数组的长度}
}

(1)动态长度字节数组可以仅对某个字段进行更改

(2)可以通过修改动态长度数组的length属性修改动态长度数组的长度,不过修改的同时会将数组的内容全部置为0。

(3)动态长度数组有push方法,使用该方法可以在数组末尾追加指定的字节元素,同时增加数组的长度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/211738.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python轴承故障诊断 (四)基于EMD-CNN的故障分类

目录 前言 1 经验模态分解EMD的Python示例 2 轴承故障数据的预处理 2.1 导入数据 2.2 制作数据集和对应标签 2.3 故障数据的EMD分解可视化 2.4 故障数据的EMD分解预处理 3 基于EMD-CNN的轴承故障诊断分类 3.1 训练数据、测试数据分组&#xff0c;数据分batch 3.2 定义…

stu05-前端的几种常用开发工具

前端的开发工具有很多&#xff0c;可以说有几十种&#xff0c;包括记事本都可以作为前端的开发工具。下面推荐的是常用的几种前端开发工具。 1.DCloud HBuilder&#xff08;轻量级&#xff09; HBuilder是DCloud&#xff08;数字天堂&#xff09;推出的一款支持HTML5的web开发…

硬件开发笔记(十四):RK3568底板电路LVDS模块、MIPI模块电路分析、LVDS硬件接口、MIPI硬件接口详解

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/134634186 红胖子网络科技博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬…

软考高级备考-系统架构师(机考后新版教材的备考过程与资料分享)

软考高级-系统架构设计师 考试复盘1.考试结果2.备考计划3.个人心得 资料分享 考试复盘 1.考试结果 三科压线过&#xff0c;真是太太太太太太太幸运了。上天对我如此眷顾&#xff0c;那不得不分享下我的备考过程以及一些备考资料&#xff0c;帮助更多小伙伴通过考试。 2.备考…

time模块(python)

一.sleep休眠 [rootrhel8 day04]# vim demo01_time.py import time def banzhuan():print("搬砖")time.sleep(3.5) #让程序休眠3.5秒print("结束")banzhuan()[rootrhel8 day04]# python3 demo01_time.py 搬砖 结束运行时&#xff0c;会发现程序中间暂停…

【3DsMax】制作简单的骨骼动画

效果 步骤 首先准备4个板子模型展开放置好 添加一个4段的骨骼 选中其中的一块板子添加蒙皮命令 在蒙皮的参数面板中&#xff0c;设置每块板子对应哪块骨骼 设置好后你可以发现此时就已经可以通过骨骼来控制模型了 接下来就可以制作动画 点击左下角“时间配置”按钮 设置一下动…

HarmonyOS--ArkTS(1)--基本语法(1)

目录 基本语法概述 声明式UI描述 自定义组件 创建自定义组件 自定义组件的结构--struct &#xff0c;Component&#xff0c;build()函数 生命周期 基本语法概述 装饰器&#xff1a; 用于装饰类、结构、方法以及变量&#xff0c;并赋予其特殊的含义。如上述示例中Entry、C…

VSCode安装与使用

VS Code 安装及使用 1、下载 进入VS Code官网&#xff1a;地址&#xff0c;点击 DownLoad for Windows下载windows版本 注&#xff1a; Stable&#xff1a;稳定版Insiders&#xff1a;内测版 2、安装 双击安装包&#xff0c;选择我同意此协议&#xff0c;再点击下一步 选择你…

【Vulnhub 靶场】【hacksudo: ProximaCentauri】【简单 - 中等】【20210608】

1、环境介绍 靶场介绍&#xff1a;https://www.vulnhub.com/entry/hacksudo-proximacentauri,709/ 靶场下载&#xff1a;https://download.vulnhub.com/hacksudo/hacksudo-ProximaCentauri.zip 靶场难度&#xff1a;简单 - 中等 发布日期&#xff1a;2021年06月08日 文件大小&…

【LeetCode:70. 爬楼梯 | 递归 -> 记忆化搜索 -> DP】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

【图片版】计算机组成原理考前复习题【第3章 存储系统-2(Cache)】

目录 前言 考前复习题&#xff08;必记&#xff09; 结尾 前言 在计算机组成原理的学习过程中&#xff0c;我们深入探索了计算机系统概述这一重要领域。计算机系统作为现代科技的核心&#xff0c;是整个计算机科学的基石。我们将学到的知识与理论转化为了能够解决现实问题…

如何防止恶意调用和攻击对抖音商品详情API的影响?

防止恶意调用和攻击对抖音商品详情API的影响是开发者和平台必须关注的问题。恶意调用和攻击可能导致服务中断、数据泄露或其他安全问题&#xff0c;对平台和用户造成损失。本文将介绍一些常见的恶意调用和攻击方式&#xff0c;并提出相应的防范措施&#xff0c;以确保抖音商品详…

python画动漫形象(魔法少女小圆晓美焰,super beautiful)

1.源代码 import turtle as te import time WriteStep 15 # 贝塞尔函数的取样次数 Speed 5 Width 600 # 界面宽度 Height 500 # 界面高度 Xh 0 # 记录前一个贝塞尔函数的手柄 Yh 0 def Bezier(p1, p2, t): # 一阶贝塞尔函数 return p1 * (1 - t) p2 * t def Bezier_2(x1…

stu06-VSCode里的常用快捷键

Alt Z&#xff1a;文字自动换行。当一行的文字太长时&#xff0c;可以使用。或者查看→自动换行Alt Shift ↓ &#xff1a;快速复制当前行到下一行Alt Shift ↑ &#xff1a;快速复制当前行到上一行Alt B&#xff1a;在默认浏览器中打开当前.html文件Ctrl Enter&#xf…

端口复用和重映射

一、端口复用 &#xff08;1&#xff09;端口复用概念 端口复用是将一个I/O赋予多个功能&#xff0c;通过设置I/O的工作模式来切换不同的功能。 STM32有很多的内置外设&#xff0c;这些外设的外部引脚都是与GPIO复用的。也就是说&#xff0c;一个GPIO如果可以复用为内置外设的…

《PySpark大数据分析实战》图书上线啦

《PySpark大数据分析实战》图书上线啦 《PySpark大数据分析实战》图书上线啦特殊的日子关于创作关于数据关于Spark关于PySpark关于图书/专栏 《PySpark大数据分析实战》图书上线啦 特殊的日子 不知不觉一转眼入驻CSDN已经满一年了&#xff0c;这真是一个充满意义的特殊的日子&…

sfp8472学习CDR

1,cdr名称解释 因为光信号传输至一定距离的时候,通常是长距离传输,其波形会出现一定程度的失真,接收端接收到的信号是一个个长短不一的脉冲信号,这个时候在接收端,我们就无法得到我们需要的数据。所以,这个时候就需要有信号的再生,信号的再生功能为再放大、再整形和再…

[足式机器人]Part2 Dr. CAN学习笔记-自动控制原理Ch1-2稳定性分析Stability

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;DR_CAN Dr. CAN学习笔记-自动控制原理Ch1-2稳定性分析Stability 0. 序言1. 稳定的分类2. 稳定的对象3. 稳定的系统4. 系统稳定性的讨论5. 补充内容——Transfer Function(传递函数) - nonzero Initial Condition(非零初始…

ubuntu20 安装docker

一.官网安装文档 &#xff08;基本按官方文档安装&#xff09; Install Docker Engine on Ubuntu | Docker Docs 二.安装步骤 1.docker 需要64位操作系统、linux内核要在3.1以上 #uname -r 2.卸载可能存在的旧版本 #sudo apt-get remove docker docker-engine docker-ce …

《Mamba: Linear-Time Sequence Modeling with Selective State Spaces》阅读笔记

论文标题 《Mamba: Linear-Time Sequence Modeling with Selective State Spaces》 作者 Albert Gu 和 Tri Dao 初读 摘要 Transformer 架构及其核心注意力模块 地位&#xff1a;目前深度学习领域普遍的基础模型。 为了解决 Transformers 在长序列上的计算效率低下的问题…