以太坊Solidity智能合约开发(一) - 合约结构
掌握了以太坊的一些知识体系后,作为技术开发者,首先要学习的就是以太坊智能合约的开发。我们先从学习合约的开发开始,因为后面的技术栈中,我们需要用支持与以太坊交互的编程语言与以太坊交互,与合约交互,都是基于合约的代码逻辑来的,所以,接下来我们这个系列里,我们先从学会掌握solidity智能合约开发开始。
我们打开智能合约在线编辑器,编辑器的具体使用我就不具体教学了,可以自行百度或者谷歌学习编辑器的使用。我们在这里还是主要注重学习solidity语言的开发入门,在这里我们使用的都是solidty的0.8版本的特性。
开篇我们先学习下solidity合约的结构。
状态变量
状态变量是永久地存储在合约存储中的值。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract SimpleStorage {
uint storedData; // 状态变量
// ...
}
函数
函数是合约中代码的可执行单元。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract SimpleAuction {
function bid() public payable { // 函数
// ...
}
}
函数修饰符
函数修饰符可以用来以声明的方式改良函数语义。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract Test {
address public seller;
modifier onlySeller() { // 修饰器
require(
msg.sender == seller,
"Only seller can call this."
);
_;
}
function abort() public onlySeller { // 将修饰器声明在函数中做限制
// ...
}
}
事件
事件是能方便地调用以太坊虚拟机日志功能的接口。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract Test {
event BidEvent(address bidder, uint amount); // 事件
function bid() public payable {
// ...
emit BidEvent(msg.sender, msg.value); // 触发事件
}
}
继承
父合约继承子合约使用is关键字。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "./child.sol"; // 导入合约
contract Father is child {
// ...
}
构造函数
constructor是在合约部署前进行初始化构建的操作。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract Test {
uint public initialize;
constructor() {
initialize = 100; // 合约部署后initialize的值为100
}
function setInitialize(uint _initialize) external {
initialize = _initialize; // 设置initialize的值
}
}
总结:从上面我们可以学习到,solidity0.8版本特性中,合约的编写必须声明 SPDX-License-Identifier,否则会发出警告,因为合约代码通常都是开源的,进行许可声明以表明其他人可以如何使用这份代码。
声明版本的写法一定要使用 pragma solidity 版本号。
合约的开始一定是使用 contract 合约名,这种方式的写法。
掌握了合约的结构,下一节,我们讲讲合约的数据类型。