首页 > 其他分享 >区块链特辑——solidity语言基础(三)

区块链特辑——solidity语言基础(三)

时间:2023-01-10 22:55:39浏览次数:36  
标签:index 型态 预设值 Sum solidity uint 条件 特辑 区块

Solidity语法基础学习

五、映射类型:

映射型态

Mapping Type

映射钥匙Key → 真实资料 Value

mapping(KeyType → ValueType) VariableName

·关键字:mapping

  ·宣告一个映射,后面需定义钥匙(Key)与资料(Value)的型态

·KeyType

  ·只能使用“内建型态(int,uint,……)”、“bytes”、“string”,或者“contract”与“列举enum型态”。

  ·不支持“使用者自定义”或“复杂”的型态,如“映射mapping”、“结构structs”或“阵列arry”

·ValueType

  ·可以是任何型态

  ·各种值的预设值:

    字串→预设值→空

    数字→预设值→0

    布尔值→预设值→0/false

 

mapping的原理

·所有的value都会被初始化成“预设值”。

  ·原因是在以太坊的空间上,所有未初始化的空间,都是0,换言之就是每个型态被迪定义的“预设置”。

·Key并不会被存在mapping型态里,因此使用者没办法从mapping中取得所有的Key

·那他是怎么查询的呢?

  ·keccak256(Key)→Value

·因此,mapping没有办法记录长度、大小、在没有key的情况下也不能列出所有的value

Example:学号与成绩

·建立一份合约class

·建立一个映射,将学号映射到成绩中:

  ·学号uint

  ·成绩uint

·提供一个函数update来更新学生成绩

  ·update(uint student_id,uint score)

·提供一个函数getScore来取得学生成绩

  ·get(uint students_id) → uint score

代码示例:

 

//SPDX-License-Identifier:MIT
pragma solidity ^0.8.17;

contract Class {
    mapping(uint => uint) Students;
    function update(uint id,uint score) public {
        Students[id] = score;
    }
    function set(uint id) public view returns(uint) {
        return Students[id];
    }
}

六、循环体:

控制结构

Control Structure

前言:在程序中会遇见同一件事情需要用很多次,需要重复很多次,这时不可能将代码复制很多次,就需用“控制结构”进行控制。

·关键词:if

  ·当满足“条件”的时候,则执行“{}内的代码”

·条件必须是个“布尔值”

  ·也就是逻辑判断,如:未满十八岁、是否高于最低薪资、论文有无抄袭、参考资料有无正确引用等。

若“000”,则“XXX”,否则“ZZZ”

if(条件){/*做点事儿*/} else{/*做点儿别的事儿*/}

·关键字:if-else

  ·当满足“条件”的时候,则执行“{}内的代码”

  ·若不满足“条件”则执行“else{}内的代码”

 

很多条件的情况

if(条件A){} else if (条件B){}……

·关键字:if-(else-if)*-else

·当有多个条件时,可以排序多个条件,else不一定要有

Example:成绩计算(if)

//SPDX-License-Identifier:MIT
pragma solidity ^0.8.17;

contract Class {
    //声明一个列表然后将值赋予列表
    uint[] Scores = [90,91,92,93,94];
    //定义一个函数X,这个函数公开可见可读可写,作用是返回一个无符号整数,输出元素计算总和,同时index自加一直到预设条件
    function X() public view returns(uint) {
        //这里将Sum预设值归零
        uint Sum = 0;
        //这里将index预设值归零
        uint index = 0;
        //这里开始while循环体
        while (index < 5) {
            //这里是Sum将Score中的每一个元素输出并相加
            Sum = Sum + Scores[index];
            //index自加确保在列表元素输出完后,能够跳出循环
            index++;
        }
        //最终返回总和
        return Sum;
    }
}

 

重复做事 for

for (宣告;条件;事后修改的事) {/*做点事儿*/}

·关键字:for(  ;  ;  ){}

  ·在满足条件下,重复执行{}内的代码。

·宣告:

  ·循环事实上就是计数器,因此宣告是为了帮助我们制造出计数器的变数,计数器不一定是整数,只要能被利用在“条件判断中”的型态都可以使用。

  ·要遍历阵列的所有元素:for (uint index;  ;  )  {……}

·条件:同if

·事后修改的事:比如说增加计数器等修改的行为。

·若“条件”没写,则为一个“无限循环”是停不下来的。 

Example:统计学生成绩(for)

//SPDX-License-Identifier:MIT
pragma solidity ^0.8.17;

contract Class {
    uint[] Score = [90,91,92,93,94];
    function X() public view returns(uint) {
        //声明一个Sum变量,将其预设值归零
        uint Sum = 0;
        //这里for循环结构是(宣告;条件;事后修改的值){执行代码}
        //事实上这里宣告就是声明一个可以结束循环体的循环控制值
        for ( uint index = 0;index < 5;index++ ) {
            Sum = Sum + Score[index];
        }
        return Sum;
    }
}

 

重复做事 while

·关键字:while( ) { }

·在特定条件下,重复执行{ }内的代码。

·条件:同if

·若“条件”没写,则为一个“无限循环”是停不下来的。

Example:统计成绩(while)

//SPDX-License-Identifier:MIT
pragma solidity ^0.8.17;

contract Class {
    uint[] Score = [90,91,92,93,94];
    function X() public view returns(uint) {
        //声明一个Sum变量,将其预设值归零
        uint Sum = 0;
        //这里for循环结构是(宣告;条件;事后修改的值){执行代码}
        //事实上这里宣告就是声明一个可以结束循环体的循环控制值
        for ( uint index = 0;index < 5;index++ ) {
            Sum = Sum + Score[index];
        }
        return Sum;
    }
}

离开当前循环 break

break

·关键字:break

  · 跳出当前循环

·若嵌套状态,如for( ){for( ){for( ){ } } },就需要三个break。

 

跳出本次循环 continue

continue

·关键字:continue;

  ·跳过本次循环

    ·在“for”时,跳过以后会执行“事后修改的事”;

    ·在“while”时,就会跳回条件判断

  ·当执行到continue的时候,会无条件跳过continue后的代码。

标签:index,型态,预设值,Sum,solidity,uint,条件,特辑,区块
From: https://www.cnblogs.com/wybsignal/p/17041620.html

相关文章

  • solidity 内存(memory) 可变数组的增删改查 操作
    //SPDX-License-Identifier:MITpragmasolidity^0.8.9;libraryArray{functionpush(uint256[]memory_nums,uint256_num)internalpure{assemb......
  • 区块链入门 ③ - 交易
    区块链入门③-交易交易概述比特币交易本质上包含交易参与者价值转移的相关信息数据结构。比特币区块链是一本全球复式记账总账簿,每笔交易都是在比特币区块链上的一个......
  • 区块链的技术基础
    区块链的技术基础拜占庭将军问题:​​https://www.8btc.com/article/70370​​区块链的类型:公有区块链、联盟链(又名许可链)、侧链分布式算法在经济学上的扩展加密签名算法......
  • 产业区块链一周快讯速览(六)
    政策公告成都印发首个“元宇宙”政策文件,提出到2025年元宇宙相关产业规模达到1500亿元成都市新经济发展工作领导小组办公室近日印发《成都市元宇宙产业发展行动方案(2022......
  • Web3区块链DAS域名注册教程 tron trx链波卡钱包地址解析 用户名转账 ENS
    而在去中心化系统中,大部分人充值、转账时,使用的都是区块链原生的长地址,比如:ETH的地址:0x9euo8sHip*******dHld90CKB的地址:ckHUEI829D********hfjdD0在操作过程中,这......
  • HTML学习之表格,列表,区块,布局
    HTML表格表格由<table>标签来定义。每个表格均有若干行(由<tr>标签定义),每行被分割为若干单元格(由<td>标签定义)。字母td指表格数据(tabledata),即数据单元格的内容。数......
  • AI&BlockChain:“知名博主独家讲授”人工智能创新应用竞赛【精选实战作品】之《基于计
    AI&BlockChain:“知名博主独家讲授”人工智能创新应用竞赛【精选实战作品】之《基于计算机视觉、自然语言处理、区块链和爬虫技术的智能会议系统》软件系统案例的界面简介、......
  • 麻将与区块链
    转网上的段子:【其实,世界上最早的区块链项目,起源于中国麻将】甲首先发起一个申请,我要打麻将,组建一个麻将局,这就相当于创建一个区块,这个区块就会被广播给乙、丙、丁、A、B、C......
  • 处理区块链中大数的转化,显示整数部分使用千分位,保留精度
    在我们写区块链中常遇到后端返回的非常大的数字,需要前端处理显示,一开始我们使用数字直接除以18个0,会发现在整除的时候会莫名的出现一堆长的数字丢失了相应的精度。是因为浮......
  • solidity智能合约开发工具Atom及其插件安装
    Atom简介Atom代码编辑器支持Windows、Mac、Linux三大桌面平台,完全免费,并且已经在GitHub上开放了全部的源代码。开发团队将Atom称为一个“为21世纪创造的可配置的编辑器”,......