首页 > 其他分享 >Solidity 入门

Solidity 入门

时间:2022-12-18 10:23:36浏览次数:43  
标签:function dna 入门 Solidity name Ant uint string

基本语法

版本指令

所有Solidity源码都必须指明版本,用于标明Solidity编译器的版本,这是为了避免将来新的编译器破坏代码

pragma solidity ^0.4.20; // 声明版本

// 定义一个合约
contract AntFamily {

}

状态变量

状态变量是定义在合约内部,但是不在函数内部的变量,会永久保存在合约存储空间中,也就说它们会被写入区块链中

pragma solidity ^0.4.20;

contract AntFamily {
  
  uint dnaDigits = 12;
  
}

数学运算

在 Solidity 中,数学运算与其它程序设计语言相同:

  • 加法: x + y
  • 减法: x - y
  • 乘法: x * y
  • 除法: x / y
  • 取模: x % y
  • 幂运算:x ** y
// 表示6的2次方
uint a = 6 ** 2;

结构体

通过结构体来定义新的类型,结构体允许生成一个更复杂的数据类型,可以有多个属性

struct Book {
    string name;
    uint page;
}

函数定义

习惯上函数里的变量都是以(_)开头 (不是硬性规定) 以区别全局变量

function buyBook(string _name, uint _count) {

}

数组

如果想建立一个集合,可以使用数组这种数据类型,支持两种数组: 静态数组和动态数组

// 固定长度为3的静态数组:
uint[3] fixedArray;
// 固定长度为5的string类型的静态数组:
string[6] stringArray;
// 动态数组,长度不固定,可以动态添加元素:
uint[] dynamicArray;

也可以建立一个结构体类型的数组:

Book[] books;

状态变量被永久保存在区块链中,所以在合约中创建动态数组来保存结构化的数据是非常有意义的

公共数组:

Book[] public books;

数组和结构体的使用

如下传见了Ant结构体,和Ant类型的数组,定义了ceateAnt函数:

pragma solidity ^0.4.20;

contract AntFamily {
  
  uint dnaDigits = 12;
  uint dnaModulus = 10 ** dnaDigits;
  
  struct Ant {
    string name;
    uint dna;
  }
  
  Ant[] public ants;
  
  function createAnt(string _name, uint _dna) {
    ants.push(Ant(_name,_dna)); // 创建一个结构体并添加到数组中
  }
  
}
      

keccak256散列函数的使用

该函数将一个字符串转换为一个256位的16进制数字

//bc6bb462e38af7da48e0ae7b5cbae860141c04e5af2cf92328cd6548df111fcb
keccak256('xxx');
//3a60bbc72c8477330650d5aae5e7d73f0d15a6efe7e8aab4fa3c33a3a8c3b467
keccak256('xxy');

事件

事件是合约和区块链通讯的一种机制,应用可以“监听”某些事件,并做出反应,使用event关键字来定义事件,使用emit关键字在函数中触发事件

pragma solidity ^0.4.20;

contract AntFamily {
  
  event NewAnt(uint indexed antId,string name,uint dna);
  
  uint dnaDigits = 12;
  uint dnaModulus = 10 ** dnaDigits;
  
  struct Ant {
    string name;
    uint dna;
  }
  
  Ant[] public ants;
  
  function createAnt(string _name, uint _dna) {
    uint id = ants.push(Ant(_name, _dna))-1;
    emit NewAnt(id,_name,_dna);
  }
  
  function createRandomAnt(string _name) {
    uint rand = uint(keccak256(_name));
	uint randDna = rand % dnaModulus;
    createAnt(_name, randDna);
  }
  
}

复杂组合

pragma solidity ^0.4.20;

contract AntFamily {
  
  event NewAnt(uint indexed antId, string name, uint dna);
  
  event NewHouse(uint indexed houseId,string name,uint existGoods,uint maxGoods);
  
  uint dnaDigits = 12;
  uint dnaModulus = 10 ** dnaDigits;
  
  struct Ant {
    string name;
    uint dna;
  }
  
  struct House {
    string name;
    uint existGoods;
    uint maxGoods;
  }
  
  Ant[] public ants;

  House[] public houses;
  
  function createAnt(string _name, uint _dna) {
    uint id = ants.push(Ant(_name, _dna)) - 1;
    emit NewAnt(id, _name, _dna);
  }
  
  function createRandomAnt(string _name) {
    uint rand = uint(keccak256(_name));
		uint randDna = rand % dnaModulus;
    createAnt(_name, randDna);
  }
  
  function createHouse(string _houseName,uint _existGoods,uint _maxGoods) {
    uint houseId = houses.push(House(_houseName,_existGoods,_maxGoods))-1;
    emit NewHouse(houseId,_houseName,_existGoods,_maxGoods);
  }
  
}

映射

//可以用来通过userId 存储/查找的用户名
mapping (uint => string) userIdToName;

使用:

pragma solidity ^0.4.20;

contract AntFamily {
  
  event NewAnt(uint indexed antId, string name, uint dna);
  event NewHouse(uint indexed houseId, string name, uint existGoods, uint maxGoods);
  
  uint dnaDigits = 12;
  uint dnaModulus = 10 ** dnaDigits;
  
  struct Ant {
    string name;
    uint dna;
  }
  
	struct House {
    string name;
    uint existGoods;
    uint maxGoods;
  }

  Ant[] public ants;
	House[] public houses;
  
  mapping (uint => identity) public antToOwner;
  mapping (identity => uint) ownerAntCount;
  mapping (uint => identity) houseToOwner;
  
  function createAnt(string _name, uint _dna) {
    uint id = ants.push(Ant(_name, _dna)) - 1;
    antToOwner[id] = msg.sender;
    ownerAntCount[msg.sender]++;
    
    emit NewAnt(id, _name, _dna);
  }
  
  function createRandomAnt(string _name) {
    uint rand = uint(keccak256(_name));
		uint randDna = rand % dnaModulus;
    createAnt(_name, randDna);
  }
  
  function createHouse(string _houseName, uint _existGoods, uint _maxGoods) {
    uint houseId = houses.push(House(_houseName, _existGoods, _maxGoods)) - 1;
    houseToOwner[houseId] = msg.sender;
    
    emit NewHouse(houseId, _houseName, _existGoods, _maxGoods);
  }
  
}

require

使得函数在执行过程中,当不满足某些条件时抛出错误,并停止执行

function sayHiToBob(string _name) public returns (string) {
  // 比较 _name 是否等于 "Bob". 如果不成立,抛出异常并终止程序
  require(keccak256(_name) == keccak256("Bob"));
  // 如果返回 true, 运行如下语句
  return "Hi!";
}

这样调用函数 sayHiToBob(“Bob”),它会返回“Hi!”。而如果你调用的时候使用了其他参数,它则会抛出错误并停止执行。 因此,在调用一个函数之前,用 require 验证前置条件是非常有必要的

标签:function,dna,入门,Solidity,name,Ant,uint,string
From: https://www.cnblogs.com/N3ptune/p/16990040.html

相关文章

  • [深度学习]卷积神经网络快速入门
    卷积神经网络结构了解​​https://mp.weixin.qq.com/s?__biz=MzA3MzI4MjgzMw==&mid=2650728746&idx=1&sn=61e9cb824501ec7c505eb464e8317915&scene=0#wechat_redirect​​(推......
  • [深度学习]深度学习快速入门资料
    深度学习入门必须要的数学基础:微积分和线性代数深度学习最具代表性综述论文(方便了解目前研究现状)LecunY,BengioY,HintonG.Deeplearning[J].Nature,2015,521(7553)......
  • linux 安装运行redis与Spring连接配置,10分钟快速入门
    linux是一方面是开源免费的,另一面其长时间运行的可靠性远高于其他系统,所以是目前国内绝大多数公司部署项目的首选。其中部署项目往往需要配套诸如Mysql、maven、redis等等......
  • [机器学习] Yellowbrick使用笔记1-快速入门
    Yellowbrick是一个机器学习可视化库,主要依赖于sklearn机器学习库,能够提供多种机器学习算法的可视化,主要包括特征可视化,分类可视化,回归可视化,回归可视化,聚类可视化,模型选择......
  • [编程基础] Python装饰器入门总结
    Python装饰器教程展示了如何在Python中使用装饰器基本功能。文章目录​​1使用教程​​​​1.1Python装饰器简单示例​​​​1.2带@符号的Python装饰器​​​​1.3用参......
  • [图像处理]YUV图像处理入门5
    12yuv420转换为rgb(opencvmat)yuv格式具有亮度信息和色彩信息分离的特点,但大多数图像处理操作都是基于RGB格式,而且自己造轮子工作量太大。因此通常都会将yuv转换为rgb,再用......
  • [图像处理]YUV图像处理入门3
    5yuv420格式的灰阶测试图本程序中的函数主要是为YUV420P视频数据流的第一帧图像添加边框。函数的代码如下所示:/***@file5yuv_graybar.cpp*@authorluohen*@briefg......
  • [图像处理]YUV图像处理入门4
    9yuv420图像截取本程序中的函数主要是对YUV420P视频数据流的第一帧图像进行截取。类似opencv中的rect函数,函数的代码如下所示:/***@file9yuv_clip.cpp*@authorluohen......
  • [图像处理]YUV图像处理入门2
    1分离YUV420中YUV分量本程序中的函数主要是将YUV420P视频数据流的第一帧图像中的Y、U、V三个分量分离开并保存成三个文件。函数的代码如下所示:/***@file1yuv_split.cp......
  • [图像处理]YUV图像处理入门1
    目前数字图像处理技术已经应用生活各个方面,但是大部分教程都是利用第三方库(如opencv)对RGB图像格式进行处理。对于YUV图像格式的图像处理教程较少。于是博主搬运总结了多个......