0.Solidity
编译器:Remix
Resources¶
Solidity0.8课程:Solidity
Solidity 高级程序设计:Solidity
基本概念¶
事务¶
事务意味着你想做的一系列操作,要么一点没做,要么全部完成。它具有原子性,不存在仅执行一部分的情况;事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样
交易¶
交易可以看作一个地址发送到另外一个地址的消息。区块链中的交易遵守事务的特性,交易总是由发送人(创建交易的地址)进行签名。
地址¶
EVM 中有两类地址:
- 外部地址:由公钥-私钥对控制
- 常用的助记词,keystore 文件等只是方便用户储存,底层还是会转成私钥。
- 一般是钱包应用创建的地址。
- 合约地址:由地址一起存储的代码控制。
存储/内存/栈¶
存储:每一个地址都有一个持久化的内存,存储是将 256 位字映射到 256 位字的键值存储区。所以数据类型的最大值是 uint256
/int256
/bytes32
,合约只能读写存储区内属于自己的部分。
内存:合约会试图为每一次消息调用获取一块被重新擦拭干净的内存实例。所以储存在内存中的数据,在函数执行完以后就会被销毁。
栈:合约的所有计算都在一个被称为栈(stack)的区域执行
EVM¶
What is a Contract in Solidity?¶
类似Java中的Class
contract是存储在以太坊区块链网络中的合约函数及其数据(状态)的集合。
程序结构
Solidity Compilation Process
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;
}
}
文档输出¶
使用 NatSpec
描述注释的另一个好处是,当被编译器解析时,上面示例中的代码将生成两个不同的 JSON 文件。
solc --userdoc --devdoc a.sol