Web3学习系列——Solidity基础(1)

120 阅读3分钟

第一个智能合约

集成开发环境Remix

remix.ethereum.org/#lang=en&op…

脚本语言 Solidity

这个我感觉没啥,程序员出身,就是了解下

  1. 基础数据类型
  2. 函数写法
// 声明一个智能合约,名为SimpleStorage
contract SimpleStorage {

    // 定义一个名为favoriteNumber的公开变量,类型为uint256。
    uint256 public favoriteNumber;

    // 定义一个名为store的公开函数,接受一个名为_favoriteNumber的uint256类型的参数。
    function store(uint256 _favoriteNumber) public {
    
        // 这意味着每当这个函数被调用时,favoriteNumber的值都会被更新为函数调用时传入的值。
        favoriteNumber = _favoriteNumber;
    }
}

简单的交易流程

  1. 点击编译,如果出现绿色√证明程序运行正确

image.png

  1. 点击部署,出现下面的交易就意味着部署成功了

image.png

这里的Account是虚拟的,每个账户都配有一个以太(ETH)余额。这些账户和余额完全是虚拟的,用于在Remix的虚拟Ethereum环境中进行测试和开发,使开发者能够模拟智能合约的交互和以太币的转账,而无需连接到实际的以太坊网络。

可以看到当我们成功部署了一个合约时,eth被消耗了

  1. 执行交易,点开我们部署好的合约

image.png

可以看到我们声明的store函数,在输入框中输入数字,点击store,就可以执行函数了

关键字view和pure

view

不进行任何交易操作,只是读取数据

image.png

pure

不进行任何交易操作,也不能读取数据,但是可以得到一些结果

image.png

数据类型Struct

我理解就是JavaScript中的对象类型

数组

image.png

其实有编程基础,这都很好理解,定义一个struct类型的变量People

声明一个数组people,里面元素的类型就是People

用People创造一个People类型的变量,然后push进去people数组,就可以读到啦

但是这里出现了一个新的标识符memory

  • memory关键字表明newPerson是一个临时变量,它将在内存中创建一个People类型的新实例,其生命周期仅限于当前函数调用。
  • 在这个示例中,使用memory意味着newPerson变量在函数执行完毕后不会被保存到区块链上,它仅用于函数内部的计算或逻辑处理。 ———————————————————————————————————————

Storage、Memory、Calldata

Storage

  • storage用于持久存储数据,其数据存储在区块链上。
  • storage变量是永久的,即它们会在交易之间持久保存。
  • 修改storage数据会耗费更多的Gas,因为这会永久改变区块链的状态。

Memory

  • memory用于临时存储数据,其数据仅在外部函数调用的上下文中存活。
  • memory变量在函数调用结束后即被清除,不会永久存储在区块链上。
  • 使用memorystorage更加节省Gas,因为它不会修改区块链的状态。

Calldata

  • calldata是一种不可变、只读的存储位置,专门用于存储函数的输入参数。
  • calldata类型的变量在整个函数调用过程中都是不可变的。
  • memory类似,calldata也是一种临时的数据存储方式,但它更加节约Gas。

Mapping

复合类型,这个也好理解,看看就懂

image.png