Solidity 基础
Solidity 30 Days - day3 - Hello,World!
Code example
pragma solidity ^0.4.25;
contract helloWorld{
function hi() public pure returns(string){
return "Hello, World!";
}
}
Code analysis
pragma solisity ^0.4.25
- varsion pragma
- ^ presents the range from 0.4.25 to < 0.5.0
contract helloWorld{}
- 宣告一个 contract
- 而一个 contract 中可以拥有多个状态变量和多个 function
function hi() returns(){}
- 宣告一个可被称呼的 function
function
( ) - returns (return value type){}
Visibility
- public, external(contract 外), internal(contract 内), private
Pure
- 完全不存取 state
- 不读取和存储链上的数据,没有和链的互动
Solidity 30 Days - day4 - Ganache & Remix
Ganache
Ganache is your personal blockchain for Ethereum development.
Remix
Solidity 30 Days - day5 - State Variables
Code example
pragma solidity ^0.4.0;
contract StateVariables{
//state variables
string name;
address owner;
constructor(){
/* Initailize default state. */
name = "unknown";
owner = msg.sender;
}
function setName(string _name) public returns(string){
/* Only owner has the Permission to modify its name.*/
if (msg.sender == owner){
name = _name;
}
else{
// revert()
revert("Permission denied.");
}
return name;
}
function getName() public returns(string){
return name;
}
}
Code analysis
string name;
address owner;
- State variables 会被存放在 Smart Contract 自有的 Storage 里
- string -> 字串
- address -> 住址(account, contract)
//构造函数
constructor(){
/* Initailize default state. */
name = "unknown";
owner = msg.sender;
}
- Contract 的构造函数
- 当 contract 建立时,对 State Variables 进行初始化
- msg.sender -> 拿到送给该 transaction 的 address
function setName(string _name) public returns(string){
/* Only owner has the Permission to modify its name.*/
if (msg.sender == owner){
name = _name;
}
else{
// revert()
revert("Permission denied.");
}
return name;
}
function getName() public returns(string){
return name;
}
revert(<string>);//revert:退回
- revert() 通常来描述程序执行到此处应该被终止,且消耗的 gas 不退回
可以用来说明之所以 revert conservation 的原因 - 类似的用法有:assert(), require(), throw 等
Solidity 30 Days - day6 - Function Modifiers
Code example
pragma solidity ^0.4.0;
contract StateVariables{
//state variables
string name;
uint public rename_counter;
address owner;
constructor() public {
/* Initailize default state. */
name = "unknown";
owner = msg.sender;
rename_counter = 0;
}
modifier onlyOwner(){
require(msg.sender == owner, "Premission dense");
rename_counter += 1;
_;
}
function setName(string _name) public onlyOwner returns(string){
name = _name;
return name;
}
function getName() public returns(string){
return name;
}
}
Code analysis
modifier name(<args>){
···
_;
}
里面可以放参数 - ··· 则是 solidity 代码
- _;表示执行完这个 modifier 之后,会往下执行原本 function 该做的事
requier(condition, <string>);
requier() 通常用来检查程序的条件:
- 检查使用者的输入、检验 state variables 是否符合预期、检查执行结果或者返回值等;
- 用来检查条件是否合理,决定要不要往下进行,因此通常会在 function 最前面使用,或者要执行某些 function 的调用或者修改 state variables 前使用
如果 condition 不满足,则执行到此处程序终止,且消耗的 gas 不退回
可以用来说明程序退出的原因
Solidity 30 Days - day7 - Assert, Require, Revert
throw;
- 已经被弃用
- 官方建议使用 revert() 替代
revert(<string>);
一个交易最终只有两种状态:commit & revert(原子性)
- commit 表示正常运作,因此交易执行后的结果被写入
- revert 表示交易在过程有问题,因此该交易的修改会被回溯
可以用来说明之所以 revert transaction 的原因 - 用来取代原来的 throw 语法
requier(condition, <string>);
requier() 通常用来检查程序的条件:
- 检查使用者的输入、检验 state variables 是否符合预期、检查执行结果或者返回值等;
- 用来检查条件是否合理,决定要不要往下进行,因此通常会在 function 最前面使用,或者要执行某些 function 的调用或者修改 state variables 前使用
如果 condition 不满足,则执行到此处程序终止,且消耗的 gas 不退回
可以用来说明程序退出的原因
assert(condition);
- assert 代表是不被允许出现的条件
- 因为该操作是已知不应该出现的,通常用来检查 overflow、underflow、检查被修改的 state 是否合法、避免不应该出现的 condition 发生等
- 算是最后防线,因此会是在执行的最后来检测行为的合法性
练习题
1. 将固定长度字节数组转化为string
类型
pragma solidity ^0.4.0;
contract bytes32tostring{
bytes10 testword=0x68656c6c6f776f726c64; //为helloworld
uint count = 0;
function bytes32tostringF() public view returns(string){
count = testword.length;
bytes memory transarr=new bytes(count);
for(uint j=0;j<count;j++){//重新对可变数组进行赋值
transarr[j]=testword[j];
}
return string(transarr);//强制转化
}
}
2 实现一个带有简单逻辑判断及多种数学运算的Solidity程序
pragma solidity ^0.4.0;
contract calculate{
uint x;
uint y;
constructor() public {
x = 100;
y = 50;
}
modifier xgreatery(){
require(x>y, "x is less than y");
_;
}
function more(uint a,uint b) public xgreatery() returns(uint){
x = a;
y = b;
return x-y;
}
function multiply(uint a, uint b) public pure returns(uint){
return a*b;
}
function divide(uint a, uint b) public pure returns(uint){
return a/b;
}
}