Task2 Solidity 基础


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;
     }
}

参考资料

Smart Contract 實戰教學 (Solidity 30 Days)全部播放

Smart Contract 實戰教學 2020全部播放

以太坊solidity学习记录(三)基础数据操作


文章作者: Terence Cai
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Terence Cai !
  目录