Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!
Sort Order:  

data.jpg

Loading...

ether wei finney szabo
1 ether = 1018 wei
1 ether = 1000 finney
1 ether = 1000000 szabo
1 Gwei = 10
9 wei
gas prise = 2 wei

在全局命名空间中已经存在了(预设了)一些特殊的变量和函数,他们主要用来提供关于区块链的信息或一些通用的工具函数。可以把这些变量和函数理解为Solidity语言层面的(原生)API 。

blockhash(uint) :指定区块的区块哈希——仅可用于最新的 256 个区块且不包括当前区块
block.coinbase ( address ): 挖出当前区块的矿工地址
block.difficulty ( uint ): 当前区块难度
block.gaslimit ( uint ): 当前区块 gas 限额
block.number ( uint ): 当前区块号
block.timestamp ( uint): 自 unix epoch 起始当前区块以秒计的时间戳
gasleft() returns (uint256) :剩余的 gas
msg.data ( bytes ): 完整的 calldata
msg.sender ( address ): 消息发送者(当前调用)
msg.sig ( bytes4 ): calldata 的前 4 字节(也就是函数标识符)
msg.value ( uint ): 随消息发送的 wei 的数量
now (uint): 目前区块时间戳( block.timestamp 的别名 )
tx.gasprice (uint): 交易的 gas 价格
tx.origin (address payable): 交易发起者(完全的调用链)

public private external internal
可以访问,可以继承的是public external
只能内部访问,不可继承的是private internal

payable view pure
payable 可以接受以太币
view 只看不修改(状态变量)
pure 纯函数,不读也不写

memory storage
memory 存储在EVM内存中,主要有局部变量,函数参数
storage 存储在区块链中,主要有状态变量,复杂变量,数组

pragma solidity >0.4.23 <0.7.0;

contract MyStorage{
    int[] arr;
    string tt;
    function fun1(uint m, string memory s) public returns(string memory) {
        uint n = m;
        string memory str = s;
        tt = s;
        
        string memory s1 = 'abc';
        string memory s2 = s1;
        
        int[] storage abc = arr;
        return tt;
    }
}

1 == 1 seconds
1 minutes == 60 seconds
1 hours == 60 minutes
1 days == 24 hours
1 weeks == 7 days

类型.jpg

值类型
值类型传值时,会临时拷贝一份内容出来,而不是拷贝指针,当你修改新的变量时,不会影响原来的变量的值。
  布尔(Booleans)
  整型(Integer)
  地址(Address)
  定长字节数组(fixed byte arrays)
  有理数和整型(Rational and Integer Literals,String literals)
  枚举类型(Enums)
  函数(Function Types


引用类型(Reference Types)
引用即地址传递,复杂类型,占用空间较大。在拷贝时占用空间较大,所以考虑通过引用传递。
  不定长字节数组(bytes)
  字符串(string)
  数组(Array)
  结构体(Struts)

两者区别:
如果是值传递,修改新变量时,不会影响原来的变量值,如果是引用传递,那么当你修改新变量时,原来变量的值会跟着变化,这是因为新变量同时指向同一个地址的原因。
Loading...

一经创建,每笔交易都收取一定数量的 gas ,目的是限制执行交易所需要的工作量和为交易支付手续费。EVM 执行交易时,gas 将按特定规则逐渐耗尽。

gas price 是交易发送者设置的一个值,发送者账户需要预付的手续费= gas_price * gas 。如果交易执行后还有剩余, gas 会原路返还。

使用修饰器modifier可以轻松改变函数的行为。 例如,它们可以在执行函数之前自动检查某个条件。

contract owned {
  address owner;
  
  //修饰器所修饰的函数体会被插入到特殊符号 _; 的位置。
  modifier onlyOwner {
      require(
          msg.sender == owner,
          "Only owner can call this function."
      );
      _;
  }

  //只有合约的创建者才能销毁合约
  function destroy() public onlyOwner {
        selfdestruct(owner);
 }
}

import * as symbolName from "filename";
import "filename" as symbolName;
然后所有全局符号都以symbolName.symbol格式提供。

Assert, Require, Revert
assert 函数只能用于测试内部错误,并检查非变量。
require 函数用于确认条件有效性,例如输入变量,或合约状态变量是否满足条件,或验证外部合约调用返回的值。
revert 可以用来标记错误并回退当前的调用。 revert 调用中还可以包含有关错误信息的参数,这个信息会被返回给调用者。

require(msg.value % 2 == 0, "Even value required.");
assert(this.balance == balanceBeforeTransfer - msg.value / 2);

if (amount > msg.value / 2 ether){
  revert("Not enough Ether provided.");
}

receive接收以太函数, 无名称,无参数,无返回值
一个合约最多有一个 receive 函数, 声明函数为:
receive() external payable {}

Fallback 回退函数,无名称,无参数,无返回值
合约可以最多有一个回退函数。函数声明为:
fallback () external [payable] {}

合约代码从区块链上移除的唯一方式是合约在合约地址上的执行自毁操作 selfdestruct 。合约账户上剩余的以太币会发送给指定的目标,然后其存储和代码从状态中被移除。移除一个合约听上去不错,但其实有潜在的危险,如果有人发送以太币到移除的合约,这些以太币将永远丢失。

尽管一个合约的代码中没有显式地调用 selfdestruct ,它仍然有可能通过 delegatecall 或 callcode 执行自毁操作。

function destroy() public onlyOwner {
   selfdestruct(owner);
}
Loading...
  1. 版本申明
  2. 引用
  3. 合约主体
  4. 注释
pragma solidity >=0.4.22 <0.7.0;  //申明版本
/*
* 这是注释段落
*
*/
import "./first_interface.sol"; //引用文件

contract SimpleStorage {
    //合约主体
    uint storedData;

    function set(uint x) public {
        storedData = x;
    }
    
    function get() public view returns (uint) {
        return storedData;
    }
}
pragma solidity >=0.4.22 <0.7.0;

contract SimpleToken{
    mapping(address => uint256) public balanceOf;
    uint id;
    constructor() public{
        balanceOf[msg.sender] = 1000000;
    }

    function transfer(address _to, uint256 _value) public{
        require(balanceOf[msg.sender] >= _value);
        require(balanceOf[_to] + _value >= balanceOf[_to]);
        balanceOf[msg.sender] -= _value;
        balanceOf[_to] += _value;
    }
}
Loading...

参考
OpenZeppelin

npm install @openzeppelin/contracts

pragma solidity >=0.4.22 <0.7.0;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/token/ERC20/ERC20Detailed.sol";

contract TutorialToken is ERC20, ERC20Detailed {
    constructor() ERC20Detailed("Lemool", "LEM", 0) public {
        _mint(msg.sender, 10000000);
    }
}