20分钟入门solidity(1)

news2025/1/8 21:02:13

1. Solidity简介

Solidity是一种静态类型编程语言,专门用于在以太坊区块链上编写智能合约。它借鉴了JavaScript、Python和C++的语法,非常适合开发在以太坊虚拟机(EVM)上运行的应用程序。
智能合约:表达商业、法律关系的契约,如:DeFi中表达为投资人和金融组织之间的关系,投资人有什么样的权益,做资产交换,遵守什么样的过程
运行机制:
在这里插入图片描述
来一次transaction驱动一次EVM,transaction是序列的形成,故EVM不会出现并发问题
transaction要么成功或失败,失败会回退到transaction开始之前的状态

2. 环境设置

在编写Solidity合约之前,需要安装一些必要的工具:
Remix IDE:这是一个基于浏览器的IDE,专门用于编写、编译和部署Solidity智能合约。可以通过访问Remix来使用。
Node.js和npm:用于安装和管理以太坊开发工具,如Truffle和Ganache。
在线工具:https://remix.ethereum.org/

3. 基本结构

一个Solidity合约的基本结构如下:

pragma solidity >=0.4.16 <0.8.0;// 声明Solidity版本

contract ZombieFactory {//定义合约
  // 这里建立事件
  event NewZombie(uint zombieId, string name, uint dna);
  uint dnaDigits = 16;//
  uint dnaModulus = 10 ** dnaDigits;
  //结构体
  struct Zombie {
    string name;
    uint dna;
  }
  // 动态创建公共数组
  Zombie[] public zombies;//public 数组, Solidity 会自动创建 getter 方法
  // 函数
  function _createZombie(string _name,uint _dna) private {
    zombies.push(Zombie(_name, _dna));
    // 这里触发事件
    uint id = zombies.push(Zombie(_name,_dna))-1;
    emit NewZombie(id, _name, _dna);
  }

  function _generateRandomDna(string  _str) private view returns (uint) {
    uint rand = uint(keccak256(_str));
    return rand % dnaModulus;
  }

  function createRandomZombie(string _name) public {
    uint randDna = _generateRandomDna(_name);
    _createZombie(_name, randDna);
  }
  // 构造函数
    constructor(uint _initialNumber, string memory _initialString) {
        myNumber = _initialNumber;
        myString = _initialString;
    }

}

4. 详细解释

4.1 版本声明

pragma solidity ^0.8.0;

4.2 合约定义

contract ZombieFactory {
    ...
}

4.3 状态变量(也是成员变量)

uint dnaDigits = 16;//
uint dnaModulus = 10 ** dnaDigits;
变量的可见性:合约外部,本合约,子合约
public:完全可见;
private:本合约内部可见,合约的里函数都是可以使用的;
其他不可见internal:对继承子合约可见

4.4 结构体

结构体是创建复杂(有多种数据类型的集合)的数据类型,和C的结构体一样

struct Zombie {
    string name;
    uint dna;
  }

4.5 数组

Solidity 支持两种数组: 静态 数组和_动态_ 数组:

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

4.6 构造函数

// 合约在区块链的部署时,产生构造函数,默认public
constructor(uint _initialNumber, string memory _initialString) {
        myNumber = _initialNumber;
        myString = _initialString;
    }

4.7 函数

function _createZombie(string _name,uint _dna) private {
    zombies.push(Zombie(_name, _dna));
    // 这里触发事件
    uint id = zombies.push(Zombie(_name,_dna))-1;
    NewZombie(id, _name, _dna);
  }

function createRandomZombie(string _name) public {
    uint randDna = _generateRandomDna(_name);
    _createZombie(_name, randDna);
  }

function 函数名(参数) [可见性][交易相关性][...] returns{...}

函数可见性
默认值的变化:刚开始public,现在取消了
private 
public 
internal 和 private 类似,不过, 如果某个合约继承自其父合约,这个合约即可以访问父合约中定义的“内部”函数。
external 与public 类似,只不过这些函数只能在合约之外调用 - 它们可以被合约内的其他函数调用,但是会产生新的message。

合约函数的交易属性:

view:用于读取合约状态的函数,不能修改状态
pure:纯函数,与合约状态无关,只和输入有关
默认是写操作:全网广播,共识确认

4.8 结构体和数组

// 创建一个新的Person:
Person satoshi = Person(172, "Satoshi");

// 将新创建的satoshi添加进people数组:
people.push(satoshi);
你也可以两步并一步,用一行代码更简洁:

people.push(Person(16, "Vitalik"));
注:array.push() 在数组的 尾部 加入新元素 ,所以元素在数组中的顺序就是我们添加的顺序, 如:

uint[] numbers;
numbers.push(5);
numbers.push(10);
numbers.push(15);
// The `numbers` array is now equal to [5, 10, 15]

5、数据类型

5.1 基本数据类型

● 布尔类型(bool):布尔类型表示真或假的值,默认值是 false。
● 整数类型:整数类型分为有符号和无符号两种。有符号整数类型包括int8、int16、int32、int64等,而无符号整数类型包括uint8、uint16、uint32、uint64等。这些类型表示不同位数的整数,默认值是0。
● 固定点数类型:固定点数类型用于处理小数。例如,fixed和ufixed表示固定点数,后面可以跟着小数点的位数。
● 地址类型(address):地址类型表示以太坊网络上的账户地址(钱包的地址)。默认值是0x0000000000000000000000000000000000000000
● 补充:
● 字节类型(bytes):字节类型表示一组字节数据。例如,bytes32表示32个字节的数据。
● 动态字节数组类型(bytes):动态字节数组类型与字节类型类似,但其长度可变。
● 字符串类型(string):字符串类型表示文本数据。默认值是空字符串
● 枚举类型(enum):枚举类型用于定义一组离散的可能取值。

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

contract MyContract {
    bool public myBool;        // 默认值为 false
    uint public myUint;        // 默认值为 0
    address public myAddress;  // 默认值为 0x0000000000000000000000000000000000000000
    string public myString;    // 默认值为 ""
    uint[] public myArray;     // 默认值为一个空的、长度为 0 的数组
}
动态数组(包括字符串数组)和映射(mapping)的默认值是一个空的、长度为0的集合

补充:
address payable 是一种特殊的 address 类型,它可以用来接收和发送以太币。
address 类型则是一个普通的地址,只能接收以太币但不能主动发送。
由于 address payable 是 address 的子类型,
因此可以从 address payable 转换为 address,但反过来则不行。

pragma solidity ^0.8.0;

contract ConversionExample {
    address public addr;

    constructor() {
        address payable payableAddr = msg.sender;
        addr = payableAddr;  // 隐式转换
        addr = address(_payableAddr);  // 显示转换
    }
}


5.2、gas消耗

每次调用这个store函数,我们都会发送一个交易。因为每次在更改区块链状态的时候,我们都会发送交易,可以在右下角Remix的日志区域,查看交易细节。
你可以看到交易消耗了多少gas,可以看到这里的数字比发送交易所用到的21000 gas要多的,那是因为这里的操作会消耗更多的计算量。每个区块链计算gas的方式不同,但最简单的理解是,做越多的操作,消耗更多的gas。记住,只有更改状态的时候才支付gas

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2258618.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【毕业设计选题】数据科学与大数据专业毕业设计选题与建议

目录 前言 毕设选题 开题指导建议 更多精选选题 选题帮助 最后 前言 大家好,这里是海浪学长毕设专题! 大四是整个大学期间最忙碌的时光&#xff0c;一边要忙着准备考研、考公、考教资或者实习为毕业后面临的升学就业做准备,一边要为毕业设计耗费大量精力。学长给大家整…

AI开源南京分享会回顾录

AI 开源南京分享会&#xff0c;已于2024年11月30日下午在国浩律师&#xff08;南京&#xff09;事务所5楼会议厅成功举办。此次活动由 KCC南京、PowerData、RISC-Verse 联合主办&#xff0c;国浩律师&#xff08;南京&#xff09;事务所协办。 活动以“开源视角的 AI 对话”为主…

Linux24.04 安装企业微信

今天工作需要把windows系统换成了linux&#xff0c;但是公司的沟通工具是企业微信。去企业微信官网看了&#xff0c;没有linux版本&#xff0c;只能想办法解决了&#xff0c;不然再换回去就太坑了。 方案 1、使用docker容器&#xff0c;2、使用deepin-wine 本人对docker不太熟…

架构学习第六周--Kubernetes(二)

目录 一、Service与服务发现 1.1&#xff0c;Service资源基本概念 1.2&#xff0c;名称解析 二、应用编排 2.1&#xff0c;Deployment控制器 2.2&#xff0c;DaemonSet和StatefulSet控制器 2.3&#xff0c;Job和CronJob控制器 三、认证体系 3.1&#xff0c;认证介绍 3…

[SWPUCTF 2021 新生赛]crypto9

[MoeCTF 2021]Web安全入门指北—GET 意思是GET传参&#xff0c;moeflag 就可以得到falg 输入?moeflag flag为&#xff1a; NSSCTF{ff26110b-8793-403c-990e-15c7f1820596} [SWPUCTF 2021 新生赛]crypto9 #gpt写的代码 from itertools import product letter_list ABCDEFG…

Python爬虫之Selenium的应用

【1】Selenium基础介绍 1.什么是selenium&#xff1f; &#xff08;1&#xff09;Selenium是一个用于Web应用程序测试的工具。 &#xff08;2&#xff09;Selenium 测试直接运行在浏览器中&#xff0c;就像真正的用户在操作一样。 &#xff08;3&#xff09;支持通过各种driv…

VSCode设置字体

参考文章&#xff1a;【面向小白】vscode最佳实践&#xff08;2&#xff09;—— 字体设置&#xff08;fira code更纱黑体&#xff09;&#xff0c;这篇文章末尾给了安装字体的链接。 配置的字体还是很好看的。 ‘Fira Code Retina’, ‘Sarasa Mono Sc’ 需要注意的一个点&am…

Edge SCDN深度解析,边缘安全加速的创新实践

边缘安全加速&#xff08;Edge Secure Content Delivery Network&#xff0c;SCDN&#xff09;是酷盾安全推出的边缘集分布式 DDoS 防护、CC 防护、WAF 防护、BOT 行为分析为一体的安全加速解决方案。通过边缘缓存技术&#xff0c;智能调度使用户就近获取所需内容&#xff0c;为…

币安移除铭文市场的深度解读:背后原因及其对区块链行业的影响

引言&#xff1a; 就在昨天&#xff0c;2024年12月10号&#xff0c;币安宣布将移除铭文市场&#xff08;Inscriptions Market&#xff09;。这一消息引发了全球加密货币社区的广泛关注&#xff0c;尤其是在比特币NFT和数字收藏品市场快速发展的背景下。铭文市场自诞生以来迅速…

微信小程序--创建一个日历组件

微信小程序–创建一个日历组件 可以创建一个日历组件&#xff0c;来展示当前月份的日期&#xff0c;并支持切换月份的功能。 一、目录结构 /pages/calendarcalendar.wxmlcalendar.scsscalendar.jscalendar.json二、calendar.wxml <view class"calendar"><…

鸿蒙ArkTS语言基础语法详解

文章目录 鸿蒙ArkTS语言基础语法详解一、引言二、ArkTS语言概述1. ArkTS语言特点2. TypeScript基础语法2.1 类型注解2.2 接口2.3 泛型2.4 类的继承2.5 类的访问修饰符 三、ArkTS的基本组成3.1 装饰器3.2 UI描述3.3 自定义组件3.4 系统组件3.5 属性方法和事件方法 四、自定义组件…

STM32 HAL库之SDIO例程 Micro SD卡 - 2

1、硬件图 2、示例代码 根据提示配置SDCLK为72/3 24MHz。 static void MX_SDIO_SD_Init(void) {/* USER CODE BEGIN SDIO_Init 0 */SD_InitTypeDef Init;Init.ClockEdge SDIO_CLOCK_EDGE_RISING;Init.ClockBypass SDIO_CLOCK_BYPASS_DISABLE;Init.ClockPo…

小程序开发中的插件生态与应用-上

更多精彩内容都在公zhong号&#xff1a;小白的大数据之旅 在小程序的开发过程中&#xff0c;插件作为扩展功能、提升效率的重要工具&#xff0c;扮演着不可或缺的角色。它们不仅能够帮助开发者快速集成复杂的功能模块&#xff0c;还能优化开发流程&#xff0c;缩短项目周期。 …

深入了解Text2SQL开源项目(Chat2DB、SQL Chat 、Wren AI 、Vanna)

深入了解Text2SQL开源项目&#xff08;Chat2DB、SQL Chat 、Wren AI 、Vanna&#xff09; 前言1.Chat2DB2.SQL Chat3.Wren AI4.Vanna 前言 在数据驱动决策的时代&#xff0c;将自然语言查询转化为结构化查询语言&#xff08;SQL&#xff09;的能力变得日益重要。无论是小型创业…

Java面试之单例模式浅谈

单例模式是Java面试中常会问到的一个问题&#xff0c;众所周知&#xff0c;单例模式分为两大部分&#xff1a;饿汉模式和懒汉模式。但是&#xff0c;如果当面试官问道关于单例模式的话&#xff0c;如果你只答出这两种模式&#xff0c;且懒汉模式还是最基础最简陋版的话&#xf…

零距离对接Modnbus转Profinet网关连接伺服与PLC

本研究案例详细阐述了开疆智能Modbus转Profinet网关KJ-PNG-201在实现HD3-L系列通用伺服驱动器与PLC互联中的应用。所涉及的设备包括西门子S7-1200 PLC、Modbus转Profinet网关以及HD3-L系列通用伺服驱动器。通过网关转换MODBUS协议的伺服驱动器与PROFINET协议的PLC之间的通信&am…

集成方案 | Docusign + 泛微,实现全流程电子化签署!

本文将详细介绍 Docusign 与泛微的集成步骤及其效果&#xff0c;并通过实际应用场景来展示 Docusign 的强大集成能力&#xff0c;以证明 Docusign 集成功能的高效性和实用性。 在现代企业运营中&#xff0c;效率和合规性是至关重要的。泛微作为企业级办公自动化和流程管理的解决…

CTF-WEB: php-Session 文件利用 [第一届国城杯 n0ob_un4er 赛后学习笔记]

step 1 搭建容器 教程 A5rZ 题目 github.com Dockerfile 有点问题,手动修复一下 FROM php:7.2-apacheCOPY ./flag /root COPY ./readflag / COPY ./html/ /var/www/html/ COPY ./php.ini /usr/local/etc/php/php.ini COPY ./readflag /readsecretRUN chmod 755 /var/www…

融资融券哪家证券公司利率3.8%,融资融券交易流程科普

融资融券哪个券商合适主要考虑券商业务实力与佣金费率等相关因素。 业务方面&#xff0c;一些大型上市券商业务更加成熟。这些券商在融资融券市场中占据重要地位&#xff0c;资金充足&#xff0c;券源丰富&#xff0c;能够满足投资者多样化的投资需求。 融资融券的利率和佣金…

Java 使用 Redis 实现微博热搜功能

在社交平台上&#xff0c;热搜功能是一个非常重要的组成部分。它展示了当前最热门的话题&#xff0c;帮助用户迅速了解最受关注的事件。在微博等平台上&#xff0c;热搜榜单通常是实时变化的&#xff0c;可能会根据用户的互动数据&#xff08;如搜索频次、点赞量、评论数等&…