跳转至

0.Solidity

编译器:Remix

Resources

Solidity0.8课程:Solidity

Solidity 高级程序设计:Solidity

基本概念

事务

事务意味着你想做的一系列操作,要么一点没做,要么全部完成。它具有原子性,不存在仅执行一部分的情况;事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样

交易

交易可以看作一个地址发送到另外一个地址的消息。区块链中的交易遵守事务的特性,交易总是由发送人(创建交易的地址)进行签名。

地址

EVM 中有两类地址:

  • 外部地址:由公钥-私钥对控制
  • 常用的助记词,keystore 文件等只是方便用户储存,底层还是会转成私钥。
  • 一般是钱包应用创建的地址。
  • 合约地址:由地址一起存储的代码控制。

存储/内存/栈

存储:每一个地址都有一个持久化的内存,存储是将 256 位字映射到 256 位字的键值存储区。所以数据类型的最大值是 uint256/int256/bytes32,合约只能读写存储区内属于自己的部分。

内存:合约会试图为每一次消息调用获取一块被重新擦拭干净的内存实例。所以储存在内存中的数据,在函数执行完以后就会被销毁。

:合约的所有计算都在一个被称为栈(stack)的区域执行

EVM

image-20230924191219277

image-20230924191022620

What is a Contract in Solidity?

类似Java中的Class

contract是存储在以太坊区块链网络中的合约函数及其数据(状态)的集合。

程序结构

image-20230924191547813

Solidity Compilation Process

image-20230924191612831

Comments

注解

类似Rust

string message = "Hello World!"; // 这是单行注释

/**
  * 这是块注释
  * 这是块注释
 */

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

/// @title  一个简单的数据存储演示
/// @author Anbang(亚洲洲长,地球球长,银河系的最后守护者,人类文明的唯一指导者)
/// @notice 您智能将此合约用于最基本的演示
/// @dev    提供了存储方法/获取方法
/// @custom:xx    这是实验的测试合约(自定义的描述)
contract  TinyStorage {
    // data
    uint256 storedData;

    /// @notice 储存 x(第一种 NatSpec 写法)
    /// @param _x: storedData 将要修改的值
    /// @dev   将数字存储在状态变量 storedData 中
    function set(uint256 _x) public{
        storedData = _x;
    }

    /**
     * @notice 返回存储的值(第二种 NatSpec 写法)
     * @dev    检索状态变量 storedData 的值
     * @return 储存值
     */
    function get() public view returns(uint256){
        return storedData;
    }
}

image-20230923123411700

文档输出

使用 NatSpec 描述注释的另一个好处是,当被编译器解析时,上面示例中的代码将生成两个不同的 JSON 文件。

solc --userdoc --devdoc a.sol