Solidity是一种静态类型、面向合约的高级编程语言,专门为编写智能合约而设计,它被用于eth和其他兼容区块链平台。
Solidity语言受到了C++、Python和JavaScript等语言的影响,旨在提供一种安全、易于理解的方式来创建和管理智能合约。
特点
静态类型:Solidity是一种静态类型语言,这意味着所有变量的类型在编译时都必须明确指定。
面向合约:Solidity中的主要构建块是合约(Contracts),它们类似于面向对象编程中的类。合约可以包含状态变量、函数、事件、修饰符等。
继承:Solidity支持多重继承,允许合约继承其他合约的属性和行为。
兼容EVM:Solidity编写的智能合约被编译成EVM(虚拟机)字节码,这使得它们可以在eth网络上部署和执行。
什么是智能合约?
智能合约(Smart contract )是一种旨在以信息化方式传播、验证或执行合同的计算机协议。智能合约允许在没有第三方的情况下进行可信交易,这些交易可追踪且不可逆转。智能合约概念于1995年由Nick Szabo首次提出。
智能合约的目的是提供优于传统合约的安全方法,并减少与合约相关的其他交易成本。
简单地说,智能合约可以理解为一个自执行的协议。智能合约可以自动处理协议的履行、管理、以及支付。
例如,可以编写这样一个智能合约:本月底之前,老王转账给小张1个以太币,这个智能合约部署后,就会在月底之前,自动把老王的1个以太币转账给小张,无需人为干预。
关键零件:
1. 逻辑: Solidity 允许使用 if-else 语句、for 和 while 循环以及其他逻辑运算符,如 and、or、not。
2. 作用域: Solidity 具有全局、契约和函数级别的作用域。每个变量或函数都有一个特定的范围,在该范围内可以访问或修改它。
3. 模式: Solidity 具有可用于编写智能合约的通用设计模式,例如 Open-Close Principle 和 Pull Payment 模式。
4. 函数: Solidity 支持内部和外部函数。内部函数只能被同一合约内的其他函数调用,而外部函数可以被任何合约或外部调用。
5. 结构: Solidity 允许创建自定义数据结构,例如结构和数组。
6. 库: Solidity 支持库的使用,库是可以被多个合约调用的可重用代码块。
让我们亲自动手,使用代码示例和解释来解释这些关键组件中的每一个。
以下是用 Solidity 编写的逻辑示例。
function checkAge(uint age) public pure returns (bool) {
if (age >= 18) { // this line checks if the input age is greater than or equal to 18
return true; // if the above condition is met, it returns true
} else {
return false; // if the above condition is not met, it returns false
}
}
该函数具有public和pure可见性,这意味着它不读取或修改状态变量,仅使用传递给它的参数或其中存在的局部变量返回值。它可以在编译期间从外部调用而不会产生任何副作用。
如果年龄大于或等于 18 岁,则该函数还返回一个布尔值true,否则返回一个布尔值false。
很简单,对吧?现在让我们在下面的示例中编写一些 Solidity 范围。
contract Enitandev {
uint private age = 25; // this line declares a private variable of type uint called age and assigns it the value 25
function getAge() public view returns (uint) { // this function is public and read-only
return age; // this line returns the value of the private variable age
}
}
Solidity值类型
布尔(bool):可能的取值为字符常量值 true 或 false
整型(int/uint):分别表示有符号和无符号的不同位数的整型变量; 支持
关键字 uint8 到 uint256(无符号,从 8 位到 256 位)以及 int8 到 int256, 以 8 位为步长递增
定长浮点型(fixed / ufixed): 表示各种大小的有符号和无符号的定长浮
点型;在关键字 ufixedMxN 和 fixedMxN 中,M 表示该类型占用的位数,
N 表示可用的小数位数
地址(address):存储一个 20 字节的值(以太坊地址大小)
定长字节数组:关键字有 bytes1, bytes2, bytes3, …, bytes32
枚举(enum):一种用户可以定义类型的方法,与C语言类似,默认从0
开始递增,一般用来模拟合约的状态
函数(function):一种表示函数的类型