1. 全局变量名 具体描述
msg.sender 返回当前调用函数的调用者的地址
msg.value 当前消息所附带的以太币,单位为wei
2.变量的用法 默认存储位置修饰符
函数的返回值 memory
函数内部的局部变量 memory
函数的参数 memory
全局变量/状态变量 storage
外部函数的参数 calldata
3.Solidity中的状态变量存储在storage中,其值会被永久记录在区块链上,并消耗Gas
4.在Solidity中,如果你希望一个变量只能被当前合约内部以及继承该合约的子合约访问,应该使用internal可见性修饰符
5.基本数据类型:字符串。
如 string s 定义一个字符串型s
bytes(s).length将字符串数据转换为字节数组bytes类型,然后再通过length属性获取其长度
6.字符串比较:先比较字符串的长度,再比较字符串的哈希值。减少Gas的消耗
7.字符串的拼接:string 类型内置了concat方法,如string.concat(_a,_b);
8.有符号整数分为int8,int6,int32...int256
无符号整数分为uint8,uint16,uint32...uint256
9.算术操作符中**乘法,例如4**2的结果是16
10.地址类型的Solidity语言特有的数据类型,用于表示一个以太坊账户的地址,地址类型数据的长度为20个字节
11.特殊地址类型:
智能合约地址:this
调用者的账号地址:msg.sender
12.举例代码:
contract Demo {address owner; //合约的拥有者
//声明了一个类型为address的变量_owner,用于存储合约的拥有者的地址。constructor() public{_owner = msg.sender;
//_owner被赋值为msg.sender,即部署合约的账户地址。}function GetOwner() public view returns(address){return owner;}
}
13.复合数据类型:映射
mapping(<键>=><值>)<变量名>;
14.举例代码
contract movieVote {mapping (uint => uint) public VoteCount; // 存储每个电影ID对应的投票数mapping (address => uint) public voteRecord; // 存储每个地址对应的已投票电影IDfunction vote(uint _movieId) public returns(string memory) {if (voteRecord[msg.sender] == 0) { // 如果该地址尚未投票voteRecord[msg.sender] = _movieId; // 记录该地址已投票的电影IDVoteCount[_movieId] = VoteCount[_movieId] + 1; // 增加对应电影ID的投票数return "投票成功"; // 返回投票成功的消息}}
}
contract SimpleBank {mapping(address => uint256) public balances; // 存储每个地址对应的余额function deposit() public payable {balances[msg.sender] += msg.value; // 将发送者的以太币金额添加到其余额中}
}
function getBalance() public view returns (uint256) {return balances[msg.sender]; // 通过映射获取余额
}
function withdraw(uint256 amount) public {// 安全检查:余额是否足够require(balances[msg.sender] >= amount, "Insufficient funds"); // 转账操作:向用户发送ETH(单位:wei)payable(msg.sender).transfer(amount); // 更新状态:扣减链上记录余额balances[msg.sender] -= amount;
}
15.复合数据类型:数组
数组分为定长数组和变长数组
例如:uint[5] arr; uint[] arr; uint[5] arr=[0,1,2,3,4];
变长数组而言,可以通过push()函数和pop()函数追加和弹出元素。
push()函数在数组的尾部追加一个元素
pop()函数在数组的尾部删除一个元素
16.在以太坊智能合约的执行过程中,Gas主要用于计算和存储的资源消耗费用