我是靠谱客的博主 开朗砖头,这篇文章主要介绍Solidity入门学习笔记——编程语言,调试方法及测试手段,现在分享给大家,希望可以做个参考。

前言:此文为学习笔记,摘自Solidity 0.6.8中文文档及博客以及一些学习视频中,无商业用途。侵删

一. Solidity语言介绍

以太坊Solidity是一种面向智能合约的高级语言,是静态型语言。其语法与JavaScript类似。solidity是用于生成在EVM上执行的机器级代码的工具。solidity编译器获取高级代码并将其分解为更简单的指令。Solidity代码封装在Contracts中。

二.Solitity变量类型

相对其他语言编程而言而言,Solitity的变量类型更少。

  1. 整形
  2. 布尔
  3. 地址(address)
  4. 枚举
  5. 函数
  6. 定长字节数组 类似[32]byte
    变量类型详细介绍:
    1.整形:
    1.关键字:int/uint(uint8到uint256,步长为8(无符号,最多为256位),int8为int256)各种大小的有符号和无符号整数。
    2.对于整形 X,可以使用 type(X).min 和 type(X).max 去获取这个类型的最小值与最大值。
复制代码
1
2
3
4
5
6
7
/**定一个myfirsttesttest合约.**/ contract myfirsttest{ uint age=8; }

这里我们就定义了一个变量名为age的变量 并赋值了8.
2.布尔类型
类似于其他编程语言,分为true和false这里就不多介绍了。
3.地址
这是其他编程语言没有的。我们详细介绍一下。
1⃣️代表以太坊地址、大小20个字节、160位、所有地址都可以用uint160进行编码。
2⃣️地址类型有两种形式:
1.address:用于保存一个20字节的值(以太坊地址的大小)
2.address payable:可支付地址,与address相同。不过有成员函数transfer和pay。
⚠️这种区别背后的思想是 address payable 可以接受以太币的地址,而一个普通的 address 则不能。
注意⚠️:只能通过的表达式 payable(

) 将 address 类型转换为 address payable 类型。
在这里插入图片描述
地址类型成员变量:
1.balance(余额):可以使用 balance 属性来查询一个地址的余额, 也可以使用 transfer 函数向一个可支付地址(payable address)发送 以太币Ether:
2.send(转移):send 是 transfer 的低级版本。如果执行失败,当前的合约不会因为异常而终止,但 send 会返回 false。
特别注意:
在使用 send 的时候会有些风险:如果调用栈深度是 1024 会导致发送失败(这总是可以被调用者强制),如果接收者用光了 gas 也会导致发送失败。 所以为了保证 以太币Ether 发送的安全,一定要检查 send 的返回值,使用 transfer 或者更好的办法: 使用接收者自己取回资金的模式。
示例代码:可以使用属性余额查询地址的余额,并使用传递函数将串行发送到地址。

复制代码
1
2
3
4
address x = 0x123; address myAddress = this; if (x.balance < 10 && myAddress.balance >= 10) x.transfer(10);

4.枚举类型:
枚举enum是在Solidity中创建用户定义类型的一种方法。 它们是显示所有整型相互转换,但不允许隐式转换。 从整型显式转换枚举,会在运行时检查整数时候在枚举范围内,否则会导致异常( assert 类型异常 )。 枚举需要至少一个成员,默认值是第一个成员.
5.函数类型:
函数类型是一种表示函数的类型。可以将一个函数赋值给另一个函数类型的变量,也可以将一个函数作为参数进行传递,还能在函数调用中返回函数类型变量。 函数类型有两类:

1. 内部(internal) 函数类型
2. 外部(external) 函数类型

内部函数只能在当前合约内被调用(更具体来说,在当前代码块内,包括内部库函数和继承的函数中),因为它们不能在当前合约上下文的外部被执行。 调用一个内部函数是通过跳转到它的入口标签来实现的,就像在当前合约的内部调用一个函数。

外部函数由一个地址和一个函数签名组成,可以通过外部函数调用传递或者返回。
函数类型表示成如下的形式:

复制代码
1
2
function (<parameter types>) {internal|external} [pure|constant|view|payable] [returns (<return types>)]

与参数类型相反,返回类型不能为空 —— 如果函数类型不需要返回,则需要删除整个 returns () 部分。

三.Solidity数据结构

在这里插入图片描述
1.structs 结构体
Solidity提供了一种以结构形式定义新类型的方法。结构是自定义类型,可以对多个变量进行分组。

复制代码
1
2
3
4
5
6
7
8
9
10
11
pragma solidity >=0.4.22 <0.7.0; contract Ballot { struct Voter { uint weight; // weight is accumulated by delegation bool voted; // if true, that person already voted address delegate; // person delegated to uint vote; // index of the voted proposal }

这里我们就定义了一个含有4个成员的结构体。特别注意结构最多只能有16个。超过该成员可能会发生以下错误:Stack too Deep 堆栈太深。
2.Arrays数组:
Solidity中的数组可以具有编译时固定大小,也可以是动态的。

复制代码
1
2
3
uint[3] fixed; //array of fixed length 3 uint[] dynamic; //a dynamic array has no fixed size, it can keep growing

3.mappings映射
映射可以看作是哈希表,它们被虚拟地初始化,使得每个可能的键都存在并被映射到其字节表示全为零的值:类型的默认值。
映射声明为:Mapping(_Keytype => _ValueType )

复制代码
1
2
3
4
5
6
7
8
9
10
11
contract MappingExample { mapping(address => uint) public balances; function update(uint newBalance) { balances[msg.sender] = newBalance; }} contract MappingUser { function f() returns (uint) { MappingExample m = new MappingExample(); m.update(100); return m.balances(this); }}

四.Solidity控制结构

除了switch和goto之外,JavaScript中的大多数控制结构都在Solidity中可用。

所以有:if,else,while,do,for,break,continue,return,
? :,使用从C或JavaScript中已知的通常语义。

注意:没有像C和JavaScript那样从非布尔类型到布尔类型的类型转换。
示例代码:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
contract ControlStructure { address public a; function ControlStructure>){ // if-else can be used like this if(input1==2) a=1; else a=0; // while can be used like this while(input1>=0){ if(input1==5) continue; input1=input1-1; a++;} // for loop can be used like this for(uint i=0;i<=50;i++) { a++; if(a==4) break; } //do while can be used like this do { a--; } (while a>0); // Conditional Operator can be used like this bool IsTrue = (a == 1)?true: false; /*will show an error because there is no type conversion from non-boolean to boolean */ if(1) { }

继承
Solidity通过复制包含多态的代码来支持多重继承。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
contract Owned { address Owner ; function owned() { owner = msg.sender; }} contract Mortal is Owned { // 'is' keyword is used for inheritance function kill(){ self-destruct(owner); }} contract User is Owned, Mortal //Multiple inheritance { string public UserName; function User(string _name){ UserName = _name; }}

以上就是对solidity语言的入门学习。

最后

以上就是开朗砖头最近收集整理的关于Solidity入门学习笔记——编程语言,调试方法及测试手段的全部内容,更多相关Solidity入门学习笔记——编程语言内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(75)

评论列表共有 0 条评论

立即
投稿
返回
顶部