以太坊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 合約名,這種方式的寫法。

掌握了合約的結構,下一節,我們講講合約的數據類型。