Solidity:源文件结构
SPDX License Identifier
如果源代码可用,则可以更好地建立对智能合约的信任。由于提供源代码总是涉及版权方面的法律问题,Solidity编译器鼓励使用机器可读的SPDX License Identifier。每个源文件都应以一条注释开头,说明其许可证:
// SPDX-License-Identifier: MIT
编译器不会验证该许可证是否属于SPDX允许的列表的一部分,但它会在:ref:bytecode metadata<metadata>
。
如果您不想指定许可证,或者源代码不是开源的,请使用特殊值UNLICENSED。
当然,提供此评论并不能免除您与许可相关的其他义务,比如必须在每个源文件或原始版权所有者中提及特定的许可头。
编译器可以在文件级别的文件中的任何位置识别注释,但建议将其放在文件的顶部。
Pragmas
关键字pragma
版本标识指令,用来启用编译器检查,版本标识指令通常只对本文件有效,所以我们需要把这个版本标识添加到项目中所有的源文件中。如果使用import导入其他的文件,标识并不会从被导入的文件,加入到导入的文件中
版本标注
pragma solidity ^0.5.0;
源文件将既不允许低于0.5.0,也不允许高于(包含)0.6.0版本(由于^这个符号),这样可以保证在0.6.0版本之前不会有重大变更
使用版本标准不会改变编译器的版本。它仅仅是告知编译器去检查版本是否匹配,如果不匹配,编译器就会提示一个错误
导入其他源文件
import "file";
将”file“中导入所有的全局符号到当前全局作用域中
这种形式已经不建议使用,因为可能会污染当前命名空间。
import * as xdpCs from "file";
更简洁写法
import “file” as xdpCs;
创建一个全新的全局符号xdpCs,他的成员均来自“file”中的全局符号
import {xdp as xdpCs,Cs} from “file”;
如果存在命名冲突,则可以在导入时重命名符号。创建全新的全局符号xdpCs和Cs,分别从“file”中xdp,Cs中引用
通常使用相对引用import “./file.sol”;
并且避免使用..
,后面这种方式可以使用全局路径并设置映射
路径
/
作为目录分割符、.
表示当前目录、..
表示父目录,但是只有.
、..
后面是/
时,它们才被作为当前目录或者父目录。只有路径以.
或 ..
开头时,才能被视为相对路径
用import “./file” as xdpCs;
语句导入当前源文件同目录下的文件file
。如果用import “file” as xdpCs;
代替,可能会引入不同的文件
注释
单行注释//
:单行注释由任何unicod行终止符终止。在注释之后终止符代码仍然是源代码的一部分。如果它不是ascii符号,他会导致解析器错误
多行注释/*...*/
// 单行注释
/*
多行注释
*/
/** */
通过标签文档化函数、标注形式校验通过的条件,和提供一个当用户试图调用一个函数时显示给用户的确定性文字
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "hardhat/console.sol";
/** @title token */
contract Token {
string public name = "My hardhat Token";
string public symbol = "MBT";
uint256 public totalSupply = 1000000;
address public owner;
mapping(address => uint256)balances;
constructor(){
balances[msg.sender] = totalSupply;
owner = msg.sender;
}
/**
* @param to 买方地址
* @param amount 金额
*/
function transfer(address to, uint256 amount) external {
console.log("Sender balance is %s tokens", balances[msg.sender]);
console.log("Trying to send %s tokens to %s", amount, to);
require(balances[msg.sender] >= amount, "Not enough tokens");
balances[msg.sender] -= amount;
balances[to] += amount;
}
function balanceOf(address account) external view returns (uint256){
return balances[account];
}
}