• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

区块链Solidity智能合约语言学习笔记

武飞扬头像
不凉帅
帮助1

Solidity简介

以太坊拥有多种高级语言,可用于编写智能合约,每种语言都受到另一种广泛使用的语言的启发。最流行的一种叫做Solidity,它基于JavaScript。由于Solidity是迄今为止最成熟的以太坊语言,因此它是社区大力鼓励开发人员现在使用的语言。

Solidity是一种语法类似JavaScript的高级语言。它被设计成以编译的方式生成以太坊虚拟机代码。使用它很容易创建用于投票、众筹、封闭拍卖、多重签名钱包等等的合约。

编译环境

Remix在线编译器: http://remix.app.hubwiz.com/

VScode编译器也行,其插件:

                                       学新通 

第一个程序Hello world

参考:https://blog.csdn.net/weixin_45067603/article/details/105726491

  1.  
    pragma solidity ^0.4.0;
  2.  
     
  3.  
    contract helloworld {
  4.  
    string myword = "helloworld";
  5.  
     
  6.  
    function show() public view returns(string){
  7.  
    return myword;
  8.  
    }
  9.  
     
  10.  
    function changMyword(string _newWord) public{
  11.  
    myword = _newWord;
  12.  
    }
  13.  
     
  14.  
    }

学新通

学新通

solidity的四种可见度/访问权限

  • public:任何人都可以调用该函数,包括DApp的使用者。
  • private:只有合约本身可以调用该函数(在另一个函数中)。
  • internal:只有这份合同以及由此产生的所有合同才能称之为合同。
  • external:只有外部可以调用该函数,而合约内部不能调用。

solidity的三种修饰符

view: 可以自由调用,因为它只是“查看”区块链的状态而不改变它

pure: 也可以自由调用,既不读取也不写入区块链

payable:常常用于将代币发送给合约地址。

solidity的函数应有以下部分组成

function

你的函数名字(类型1 名字,类型2 名字,。。。,类型n 名字) 如果没有就什么都不填即可

可见度/访问权限,即public/private/internal/external 如果不写则系统默认为public并且警告

修饰符,即view/pure/payable 如果需要花费gas则不写

returns(类型1 名字,类型2 名字,。。。,类型n 名字)

布尔值bool

  1.  
    pragma solidity ^0.4.0;
  2.  
     
  3.  
    contract helloworld {
  4.  
    bool boola=true; //声明一个布尔类型的值,只用一个等号
  5.  
    function booltesta() public view returns(bool){
  6.  
    return boola;
  7.  
    }
  8.  
     
  9.  
    function booltestb(int a,int b) public pure returns(bool){
  10.  
    return a==b;
  11.  
    }
  12.  
     
  13.  
    function boolteston(int a,int b) public pure returns(bool){
  14.  
    return !(a==b);
  15.  
    }
  16.  
    }
学新通

学新通  

与,或

即: &&  ||

通常运算符

即 ,-,*,/,%以及特殊的符号**代表x的x次幂

位运算符

1.& 操作数之间转换成二进制之后每位进行与运算操作(同1取1)

2.| 操作数之间转换成二进制之后每位进行或运算操作(有1取1)

3.~ 操作数转换成二进制之后每位进行取反操作(直接相反)

4.^ 操作数之间转换成二进制之后每位进行异或操作(不同取1)

5.<<操作数转换成二进制之后每位向左移动x位的操作

6.>>操作数转换成二进制之后每位向右移动x位的操作

可变长度byte数组

声明方法

  1.  
    bytes arr = new bytes(length);
  2.  
     
  3.  
    function arrlengthchange(uint a) public { arr1.length=a;  }

String型

  1.  
    pragma solidity ^0.4.0;
  2.  
    contract stringtest1{
  3.  
    string testword='helloworld'; //68656c6c6f776f726c64为这串字符的16进制
  4.  
     
  5.  
    function stringlength() public view returns (uint){
  6.  
    //return testword.length; 直接返回长度会报错
  7.  
    return bytes(testword).length; //强制类型转换之后可以
  8.  
    }
  9.  
     
  10.  
    function stringchange() public {
  11.  
    //testword[0]='A'; 直接进行变更会报错
  12.  
    bytes(testword)[0]='A'; //41为A的16进制值,强制类型转换之后可以修改
  13.  
    }
  14.  
     
  15.  
    function getname() public view returns(bytes){
  16.  
    return bytes(testword); //查看16进制的string
  17.  
    }
  18.  
     
  19.  
    function stringchangetest() public view returns(byte){
  20.  
    return bytes(testword)[0]; //查看第一位是否被修改
  21.  
    }
  22.  
     
  23.  
    }
学新通

学新通

string类型是怎么存储数据的

英文字符(A-z)以及特殊字符(&*@#&%())等为一个字节
中文字符为3个字节 PS.solidity中文输入支持很差

  1.  
    pragma solidity ^0.4.0;
  2.  
     
  3.  
    contract stringstoragetest{
  4.  
    string testword1='asldhlkasdh';
  5.  
    string testword2='^*^*%*()*-/';
  6.  
    string testword3='中文字符';
  7.  
    string testword4='中文字符6666';
  8.  
     
  9.  
    function getest1() public view returns(uint){
  10.  
    return bytes(testword1).length;
  11.  
    }
  12.  
    function getest2() public view returns(uint){
  13.  
    return bytes(testword2).length;
  14.  
    }
  15.  
    function getest3() public view returns(uint){
  16.  
    return bytes(testword3).length;
  17.  
    }
  18.  
    function getest4() public view returns(uint){
  19.  
    return bytes(testword4).length;
  20.  
    }
  21.  
    }
学新通

学新通  

固定长度字节数组bytes的截断 

结论:位数足够则保留前面的,位数不够再后面加0

  1.  
    pragma solidity ^0.4.0;
  2.  
     
  3.  
    contract bytetest1{
  4.  
    bytes10 testword=0x68656c6c6f776f726c64; //helloworld
  5.  
    function transbytes1() public view returns(bytes1){
  6.  
    return bytes1(testword);
  7.  
    }
  8.  
    function transbytes2() public view returns(bytes5){
  9.  
    return bytes5(testword);
  10.  
    }
  11.  
    function transbytes3() public view returns(bytes12){
  12.  
    return bytes12(testword);
  13.  
    }
  14.  
    }

学新通

固定长度数组入门

结论:
1.如果不赋值,那么默认所有位均为0
2.支持直接使用.length查看数组长度,但不支持对数组长度做修改
3.不支持通过.push添加数据

  1.  
    pragma solidity ^0.4.0;
  2.  
     
  3.  
    contract fixedarrtest{
  4.  
    uint[3] testarr1;//不进行赋值直接声明数组
  5.  
    uint[3] testarr2=[1,2,3];//声明数组并进行赋值
  6.  
     
  7.  
    function showarr1() public view returns(uint[3]){
  8.  
    return testarr1; //如果不赋值,那么默认所有位均为0
  9.  
    }
  10.  
     
  11.  
    function showarr2() public view returns(uint[3]){
  12.  
    return testarr2;
  13.  
    }
  14.  
     
  15.  
    function initarr() public{
  16.  
    testarr1[0]=12;//进行赋值操作
  17.  
    }
  18.  
     
  19.  
    function lengthtest() public view returns(uint){
  20.  
    return testarr1.length;//solidity支持直接查看数组长度
  21.  
    }
  22.  
     
  23.  
    function changelengthtest() public view returns(uint){
  24.  
    //testarr1.length=testarr1.length 3;//solidity不支持直接修改数组长度
  25.  
    }
  26.  
     
  27.  
    function pushtest() public view {
  28.  
    //testarr2.push(2);//solidity不支持直接push数据到数组
  29.  
    }
  30.  
     
  31.  
    }
学新通

学新通

可变长度数组入门

注意:与固定数组区别在于创建时是否定义长度
结论:
1.如果不初始化就无法单独赋值,但可以push或者改长度使有值之后再进行赋值。即必须修改的这一位不能为空 
2.支持直接使用.length查看数组长度,也支持对数组长度做修改。
将数组长度缩小则会从前往后保留
将数组长度增长则后面原本没有值的位会被默认置0
3.支持直接通过.push方法在末尾添加数值

  1.  
    pragma solidity ^0.4.0;
  2.  
     
  3.  
    contract dynamicarrtest{
  4.  
    uint[] testarr=[1,2,3,4,5];
  5.  
     
  6.  
    function showarr() public view returns (uint[]){
  7.  
    return testarr;
  8.  
    }
  9.  
     
  10.  
    function changearr() public{
  11.  
    //for(uint i=0;i<5;i ){
  12.  
    testarr[0] = 2;//如果不使0位有值,那么该函数无用
  13.  
    //}
  14.  
    }
  15.  
     
  16.  
    function lengthtest() public view returns(uint){
  17.  
    return testarr.length;
  18.  
    }
  19.  
     
  20.  
    function changelengthtest1() public{
  21.  
    testarr.length=1;
  22.  
    }
  23.  
     
  24.  
    function changelengthtest2() public{
  25.  
    testarr.length=10;//变长之后后面默认置0
  26.  
    }
  27.  
     
  28.  
    function pushtest() public{
  29.  
    testarr.push(6);//可变数组支持此操作
  30.  
    }
  31.  
     
  32.  
    }
学新通

学新通

 固定长度二维数组


结论
1.初始化时,uint[ i ] [ j ]表示有j个元素,每个元素包含i个值(和其他许多语言不同)
2.二维数组可以直接获取长度,既可以获得所有元素个数,也可以获得单独元素有多少值
3.对二维数组进行增删改等操作时时是与初始化时反过来的,即uint[ i ] [ j ]表示第i个元素的第j个值(和其他许多语言一样)
4.不支持push方法,也不支持对长度进行修改
原文链接:https://blog.csdn.net/weixin_45067603/article/details/105751748

 可变长度二维数组


结论
1.初始化时,uint[ i ] [ j ]表示有j个元素,每个元素包含i个值(和其他许多语言不同)
2.可变长度二维数组可以直接获取长度,既可以获得所有元素个数,也可以获得单独元素有多少值
3.对二维数组进行增删改等操作时时是与初始化时反过来的,即uint[ i ] [ j ]表示第i个元素的第j个值(和其他许多语言一样)
4.不支持push方法
5.支持对长度进行修改,修改后默认值为0
6.未声明的值不能直接赋值,修改长度之后默认有值才可以
 原文链接:https://blog.csdn.net/weixin_45067603/article/details/105751748

数组字面量


结论:
1.返回数组时,returns()括号里面的类型要与return的数据类型相同。
通过getarr1和getarr2可以知道,return之后的会默认最小数据类型,比如小于255的就默认为uint8类型, return [1,2,3]就默认uint8,return [256,2,3]就默认uint16等等,然而returns()里面的uint默认为uint256,所以报错,需注意
2.可以通过对return里面任意一个数值来进行强制转换来改变数据类型
3.可以直接接受参数来进行计算

  1.  
    pragma solidity ^0.4.0;
  2.  
     
  3.  
    contract finaltest{
  4.  
    function getarr1() public view returns(uint[3]){
  5.  
    // return [1,2,3]; 报错,此处为uint8,而需要返回的是uint256
  6.  
    }
  7.  
    function getarr2() public view returns(uint[3]){
  8.  
    // return [256,2,3];报错,此处为uint16,而需要返回的是uint256
  9.  
    }
  10.  
    function getarr3() public view returns(uint8[3]){
  11.  
    return [1,2,3]; //成功
  12.  
    }
  13.  
    function getarr4() public view returns(uint16[3]){
  14.  
    return [256,2,3]; //成功
  15.  
    }
  16.  
    function getarr5() public view returns(uint32[3]){
  17.  
    return [uint32(1),2,3]; //可以通过对return里面任意一个数值来
  18.  
    //进行强制转换来改变数据类型
  19.  
    }
  20.  
    function getarr6(uint[] num) public view returns(uint){
  21.  
    uint sum=0;
  22.  
    for(uint i=0;i<num.length;i ){
  23.  
    sum =num[i]; //可以直接接受参数来进行计算,
  24.  
    //参数需要按照格式来,此处就应该为[x1,x2,x3,x4,...,xn]
  25.  
    }
  26.  
    return sum;
  27.  
    }
  28.  
    }
学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgaaifa
系列文章
更多 icon
同类精品
更多 icon
继续加载