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 去获取这个类型的最小值与最大值。
/**定一个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 类型。
Solidity入门学习笔记——编程语言,调试方法及测试手段_第1张图片
地址类型成员变量:
1.balance(余额):可以使用 balance 属性来查询一个地址的余额, 也可以使用 transfer 函数向一个可支付地址(payable address)发送 以太币Ether:
2.send(转移):send 是 transfer 的低级版本。如果执行失败,当前的合约不会因为异常而终止,但 send 会返回 false。
特别注意:
在使用 send 的时候会有些风险:如果调用栈深度是 1024 会导致发送失败(这总是可以被调用者强制),如果接收者用光了 gas 也会导致发送失败。 所以为了保证 以太币Ether 发送的安全,一定要检查 send 的返回值,使用 transfer 或者更好的办法: 使用接收者自己取回资金的模式。
示例代码:可以使用属性余额查询地址的余额,并使用传递函数将串行发送到地址。

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) 函数类型

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

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

function (<parameter types>) {internal|external} [pure|constant|view|payable] [returns (<return types>)]

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

三.Solidity数据结构

Solidity入门学习笔记——编程语言,调试方法及测试手段_第2张图片
1.structs 结构体
Solidity提供了一种以结构形式定义新类型的方法。结构是自定义类型,可以对多个变量进行分组。

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中的数组可以具有编译时固定大小,也可以是动态的。

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 )

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那样从非布尔类型到布尔类型的类型转换。
示例代码:

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通过复制包含多态的代码来支持多重继承。

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入门学习笔记——编程语言,调试方法及测试手段)