1.Solidity语言介绍
以太坊提供了一个去中心化网络平台,在这个平台上允许用户部署智能合约。用户在部署智能合约前需要先用编程语言编写智能合约代码。智能合约支持许多种编程语言,其中最受欢迎且维护最好的的编程语言之一是Solidity语言。点击查看Solidity官方文档教程。
Solidity语言的特点:
- 花括号语言(使用{}的语言)。
- 静态语言(编译时已知变量类型)。
- 支持继承、库和复杂的用户定义类型等特性。
2.Solidity语言编程示例
在正式学Solidity语言前,先从一个预订书籍合约示例开始,示例如下。(当前合约看不懂不要紧,后续会详细介绍)。
/*第01句*/ // SPDX-License-Identifier: GPL-3.0
/*第02句*/ pragma solidity >=0.7.0 <0.9.0;
/*第03句*/ contract OrderBooks{
/*第04句*/ uint bookPrice = 10;
/*第05句*/ uint balance = 50;
/*第06句*/ uint orderID = 0;
/*第07句*/ mapping(uint => OrderMessage) orderRecords;
/*第08句*/ struct OrderMessage{
/*第09句*/ uint orderTime;
/*第10句*/ uint bookPrice;
/*第11句*/ uint orderQuantity;
/*第12句*/ OrderStatus status;
/*第13句*/ }
/*第14句*/ enum OrderStatus{unpaid, shipped, received, evaluated}
/*第15句*/ event OrderResult(uint bookPrice, uint orderQuantity, string resultMessage);
/*第16句*/ error NotEnoughFunds(uint amountPayable, uint balance, string promptMessage);
/*第17句*/ modifier isBalanceEnough(uint _orderQuantity){
/*第18句*/ uint aggregateAmount = _orderQuantity * bookPrice;
/*第19句*/ if(balance < aggregateAmount){
/*第20句*/ revert NotEnoughFunds(aggregateAmount, balance, unicode"余额不足");
/*第21句*/ }
/*第22句*/ _;
/*第23句*/ }
/*第24句*/ function order(uint _orderQuantity) public isBalanceEnough(_orderQuantity){
/*第25句*/ balance = balance - _orderQuantity * bookPrice;
/*第26句*/ OrderMessage memory orderMsg;
/*第27句*/ orderMsg.orderTime = block.timestamp;
/*第28句*/ orderMsg.bookPrice = bookPrice;
/*第29句*/ orderMsg.orderQuantity = _orderQuantity;
/*第30句*/ orderMsg.status = OrderStatus.shipped;
/*第31句*/ orderID++;
/*第32句*/ orderRecords[orderID] = orderMsg;
/*第33句*/ emit OrderResult(bookPrice, _orderQuantity, unicode"下单成功");
/*第34句*/ }
/*第35句*/ function setBookPrice(uint _bookPrice) public{
/*第36句*/ bookPrice = _bookPrice;
/*第37句*/ }
/*第38句*/ function getBookPrice() public view returns(uint){
/*第39句*/ return bookPrice;
/*第40句*/ }
/*第41句*/ function increaseBalance(uint _funds) public{
/*第42句*/ balance = balance + _funds;
/*第43句*/ }
/*第44句*/ function viewBalance() public view returns(uint){
/*第45句*/ return balance;
/*第46句*/ }
/*第47句*/ function viewOrdeRecords(uint _orderID) public view returns(OrderMessage memory){
/*第48句*/ require(_orderID <= orderID, unicode"未找到orderID对应的订单信息");
/*第49句*/ return orderRecords[_orderID];
/*第50句*/ }
/*第51句*/ }
- 第01句:是指版权许可标识。
- 第02句:标识用什么版本的编译器编译此文件。
- 第03句:声明合约,用于预订书籍的合约。contract是声明合约的关键字,OrderBooks是指合约的名称。
- 第04至07句:声明状态变量。uint和mapping是指声明无符号整型状态变量和映射状态变量的数据类型。bookPrice、balance、orderID、orderRecords是指状态变量的名称,分别意为书籍价格、账户余额、订单ID、订单记录(用于记录所有订单)。
- 第08至13句:声明结构体,用于记录单个订单的信息。struct是声明结构体的关键字,OrderMessge是指结构体的名称。bookTime、bookPrice、orderQuantity、status是指结构体的元素,分别意为下单时间、书籍价格、订购书籍的数量、订单状态。
- 第14句:声明状态类型,用于定义订单都有那些状态。enum是声明状态类型的关键字,OrderStatus是指状态类型的名称。unpaid、shipped、received、evaluated是指状态类型的值,分别意为未支付、待发货、待收货、待评价。
- 第15句:声明事件,用于用户下单后,反馈给用户下单结果的信息。event是声明事件的关键字,OrderResult是事件的名称。bookPrice、orderQuantity、resultMessage是指向用户反馈什么信息,分别意为书籍价格、订购书籍的数量、下单成功或失败信息。
- 第16句:声明错误,用于提示账户余额不足。error是声明错误的关键字,NotEnouthFunds是错误的名称。amountPayable、balance、promptMessage是指当账户余额不足时,应向用户反馈什么信息,分别意为订单应付金额、账户余额、提示消息。
- 第17至23句:声明函数修改器,用于判断账户余额是否充足。modifier是声明函数修改器的关键字,isBalanceEnough是指函数修改器的名称。第18句计算订单应付金额。第19至21句判断账户余额是否小于订单应付金额,若是则执行NotEnouthFunds错误。
- 第24至34句:声明函数,用于下单。function是声明函数的关键字,order是指函数的名称。在第24句输入要购买书籍的数量。第25句账户余额减去订单应支付金额。第25至30句记录此订单相关信息。第31至32句将订单ID和此订单信息记录在orderRecords状态变量中。第33句下单成功后,向用户反馈下单成功信息。
- 第35至37句:用于修改书籍价格的函数。
- 第38至40句:用于查看书籍价格的函数。
- 第41至43句:用于给账户充值的函数。
- 第44至46句:用于查看账户余额的函数。
- 第47至50句:查询某个订单ID下的订单信息。