首页 > 其他分享 >Solidity初学

Solidity初学

时间:2023-12-05 20:22:05浏览次数:30  
标签:function 0.8 solidity Solidity 初学 uint variable public

https://www.youtube.com/watch?v=xv9OmztShIw&list=PLO5VPQH6OWdVQwpQfw9rZ67O6Pjfo6q-p

helloworld

// SPDX-License-Identifier: MIT 
// 如果没有上面的license就会出现黄色warning, 挺难看的..
pragma solidity ^0.8; // 指定solidity编译版本, 带了^号说明要在该版本(0.8)以上, 不加的话就是指定在(0.8)版本
contract HelloWorld {
    /**
     * @dev Prints Hello World string
     */
    function print() public pure returns (string memory) {
        // public是指明这个函数/变量能在合约部署后能够访问, 所以后面我能执行这个function
        return "Hello World!";
    }
}

编译(compile)和部署(deploy)

Remix的环境做得非常友好了, 它还自带了Remix VM测试用账号. 在Environment下设置. 我用的是之前配置好的MetaMask账号. 这两个是有区别的.

  • 前者是部署在仅在浏览器内运行的本地区块链上, 一般不用等什么交易确认的, 非常快
  • 后者是部署到MetaMask连接到的mainnet上. 我用的是holesky测试网, 所以在测试网上会有我的交易记录. 我还需要等区块链确认了我才能用我部署的合约.
    合约部署申请
    申请成功
    交易记录
    环境
    部署完成后, Deploy下会有显示, 如下图.
    helloworld执行结果

(常见的)数据类型

Java类似, solidity数据类型是分为了值类型和引用类型.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8;
contract ValueTypes {
    bool public b = true;
    uint public u = 123; // uint = uint256 0 to 2**256 - 1
                         //        uint8 0 to 2**8 - 1, and uint16...
    int public i = -123; // int = int256 -2**255 to 2**255 -1, and int128...
    int public minInt = type(int).min;
    int public maxInt = type(int).max;
    // address和bytes32都是格式不对就立马报错. 
    // 后者跟加密算法keccak256有关.
    address public addr = 0x02342Ea564978abBf379b377eE58A0d7142121d4;
    bytes32 public b32 = 0x000000000000000000000000000000000000000000000000000000000000007b;
}

函数(function)

external表示部署合约后可以调用这个函数, pure表示这个函数是只读的, 不会向区块链写入其它内容.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8;
contract FunctionInfo {
    function add(uint x, uint y) external pure returns(uint){
        return x + y;
    }
    function sub(uint x, uint y) external pure returns(uint){
        return x - y;
    }
}

编译, 部署后执行. 注意solidity可以处理溢出错误是在它0.8版本之后. 我在执行sub的时候是先用了参数2,3, 溢出后就是图中的内容.
加减法执行结果

变量类型

视频说得有点复杂, 实际上可以理解为作用范围和生命周期的不同.

state variable

state variable在区块链上存储的变量. 定义在合约内部, 函数外部.

local variable

局部变量相对于状态变量, 是定义在函数内部.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8;
contract StateVariable {
    uint public stateval = 123;
    function foo() external  {
        uint localval = 123;
        stateval = localval + stateval + 10;
    }
}

img
state variablelocal variable作用就如上所示了. state variable会一直存在, 而local variable在函数执行完之后就被销毁了.

global variable

一般是存储区块链交易/事务或者账户地址之类的.
view关键字修饰的函数可以从state variableglobal variable读取数据, pure函数不行.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8;
contract GlobalVariables {
    function globalVars() external view returns(address, uint, uint){
        address addr = msg.sender; // 调用此函数的地址
        uint timestamp = block.timestamp; // uinx时间戳
        uint num = block.number; // 当前block的编号
        return (addr, timestamp, num);
    }
}

img

view 和 pure

其实用错了的话编译器是有提示的, 就不多说了.
img
img

简单案例: Counter

// SPDX-License-Identifier: MIT
pragma solidity ^0.8;
contract Counter {
    uint public count;
    function inc() external {
        count += 1;
    }
    function dec() external {
        count -= 1;
    }
}

img

标签:function,0.8,solidity,Solidity,初学,uint,variable,public
From: https://www.cnblogs.com/joey-redfield/p/17878090.html

相关文章

  • 软件测试/人工智能|Python运算符:初学者指南
    什么是运算符?运算符是用于进行各种运算操作的符号或关键词。在数学和计算机编程中,运算符被用来表示不同的运算操作,例如加法、减法、乘法、除法等。比如:1+2,其中,1和2为操作数,+为运算符。a=18,其中,a和18为操作数,=为运算符。print(),其中,print为操作数,()为运算符。Pyt......
  • 《初学C语言第15天》
    //////————————————————————进阶版////数据在内存中的存储////1.数据类型的介绍//#include<stdio.h>//intmain()//{// inta=10;//4字节// floatf=10.0;//4字节// shortintb=10;// printf("%p\n",f);// return0;//}////整型类型//char......
  • 乘风破浪,遇见生成式人工智能(Generative AI)之初学者课程,第一章: 生成式人工智能和LLM
    课程资源https://github.com/microsoft/generative-ai-for-beginners课程学习环境设置Fork课程仓库到自己的账号https://github.com/microsoft/generative-ai-for-beginners/fork点击'CreateFork'按钮即可。准备GitHubCodespaces为了避免运行代码时出现任何依赖性......
  • 《初学C语言第14天》
    ////结构体成员的访问//#include<stdio.h>//typedefstructstu//{// //成员变量// charname[20];// shortage;// chartele[12];// charsex[7];//}Stu;//voidPrint1(Stutmp)//形参tmp//形参是实参的一份临时拷贝,且此块空间放到其他的位置上即tmp位置上(存在空间浪费......
  • 《初学C语言第11天》
    ////求定积分-----------已给函数接口//#include<stdio.h>//#include<stdlib.h>//#include<math.h>//doublesquare(doublex)//平方//{//  returnx*x;//x^2//}//doublecube(doublex)//立方//{//  returnx*x*x;//x^3//}///*你编写的积分函数嵌入在这里开始*//......
  • 《初学C语言第10天》
    ////------------------------------------------------------------例题1,2//1////给出一百分制成绩,要求输出成绩等级'A'、B、C、D'、E。////90分以上为'A',80~89分为B.70~79分为C,60~69分为D60分以下为E。//#define_CRT_SECURE_NO_WARNINGS1//#include<stdio.h>//int......
  • 《初学C语言第9天》
    //如何写出好的、易调试的代码//#define_CRT_SECURE_NO_WARNINGS//#include<stdio.h>//#include<string.h>//strcpy所需头文件//intmain()//{// //strcpy——字符串拷贝// chararr1[]="##########";// chararr2[]="bit";// strcpy(arr1,arr2);//将arr......
  • 《初学C语言第9天》
    //如何写出好的、易调试的代码//#define_CRT_SECURE_NO_WARNINGS//#include<stdio.h>//#include<string.h>//strcpy所需头文件//intmain()//{// //strcpy——字符串拷贝// chararr1[]="##########";// chararr2[]="bit";// strcpy(arr1,arr2);//将arr......
  • 《初学C语言第8天》
    ////代码调试——调用堆栈//#include<stdio.h.>//voidtest2()//{// printf("hehe");//}//voidtest1()//{// test2();//}//voidtest()//{// test1();//}//intmain()//{// test();// return0;//}////研究程序死循环的原因//#include<stdio.h>//#in......
  • 《初学C语言第七天》
    ////写一个代码打印1-100之间所有3的倍数的数字//#include<stdio.h>//intmain()//{// inti=1;// for(i=1;i>=1&&i<=100;i++)// {// if(i%3==0)// {//  printf("%d\n",i);// }// }// return0;//}//写代码将三个整数数按从大到小输出//......