solidty 跟javascript有一定的相似
认识一个最简单的存储合约
让我们先看一下最基本的例子。现在就算你都不理解也不要紧,后面我们会有更深入的讲解。
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;
contract Storage {
uint256 number;
function set(uint256 _num) public {
number = _num;
}
function get() public view returns (uint256) {
return number;
}
}
- 第一行是说明源代码是根据GPL 3.0版本授权的。默认情况下,在发布源代码时加入机器可读许可证说明是很重要的。由于提供源代码总是涉及版权方面的法律问题,Solidity 编译器鼓励使用机器可读的 SPDX 许可证标识符,比如:
// SPDX-License-Identifier: MIT
至于什么是SPDX 大家可以参考如下资料:
首先是SPDX,这是个组织名,其网站为:
SPDX 许可证列表 |软件包数据交换 (SPDX)SPDX-License-Identifier 组合起来就是在指SPDX的许可证列表
后面的格式为 :+ SPDX的许可证列表中的某个许可证
比如上面例子中的MIT 许可:
MIT 基本信息
全名:MIT License 麻省理工学院许可证 标志符:MITMIT的具体内容
特此免费授予获得(“软件”)副本的任何人不受限制地处理本软件的许可,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或出售本软件副本的权利
- 第二行是告诉编译器源代码所适用的Solidity版本为>=0.7.0 及 <0.9.0 。这样的说明是为了确保合约不会在新的编译器版本中发生异常的行为。关键字
pragma
是告知编译器如何处理源代码的通用指令 -
uint256 number;
这一行代码声明了一个名为 number 的状态变量,其类型为 uint256 (256位无符号整数)。 你也可以认为它是数据库里的一个插槽,并且可以通过调用管理数据库代码的函数进行查询和更改。在这个例子中,上述的合约定义了set
和get
函数,可以用来修改或检索变量的值。 - 当然,任何人都可以再次调用
set
,传入不同的值,覆盖你的数字,这个数字仍会被存储在区块链的历史记录中。后面我们会讲到怎样施加访问限制,以确保只有你才能改变这个数字。
执行原理
在一个去中心化的世界,我们的程序并不紧紧活一台机器的CPU 上, 在一个去中心化的世界是由很多节点组成的P2P 网络。合约代码会在各节点上[Full Node]单独运行,而事实上P2P的各节点相互之间都不信任的,所以每个节点都会存一份自己的状态(Distributed Ledger,分布式账本),在该示例就是number,当调用store()的时候,大家都改变了number,此时需要一种共识机制(PoS),如果PoS认为number合法,此次调用完成。 否则回滚上一个number的值,因此每一次改变状态变量的调用都是以一个事务Transcation来执行。
第二个例子
// SPDX-License-Identifier: MIT标签:count,SPDX,function,Solidity,基础,number,介绍,public,MIT From: https://blog.51cto.com/u_1540468/5897725
pragma solidity ^0.8.13;
contract Counter {
uint public count;
// Function to get the current count
function get() public view returns (uint) {
return count;
}
// Function to increment count by 1
function inc() public {
count += 1;
}
// Function to decrement count by 1
function dec() public {
// This function will fail if count = 0
count -= 1;
}
}