Solidity知識點集———Address, Mapping, msg.sender, require, Inheritance

谷歌玩家發表於2020-10-07

Address(地址)

以太坊區塊鏈由 account (賬戶)組成,你可以把它想象成銀行賬戶。一個帳戶的餘額是 以太幣 eth
每個帳戶都有一個“地址”,你可以把它想象成銀行賬號。這是賬戶唯一的識別符號。地址屬於特定使用者(或智慧合約)的。

對映(Mapping)

msg.sender

在 Solidity 中,有一些全域性變數可以被所有函式呼叫。 其中一個就是 msg.sender。它指的是當前呼叫者(或智慧合約)的 address。
注 意 : 在 S o l i d i t y 中 , 功 能 執 行 始 終 需 要 從 外 部 調 用 者 開 始 。 一 個 合 約 只 會 在 區 塊 鏈 上 什 麼 也 不 做 , 除 非 有 人 調 用 其 中 的 函 數 。 所 以 m s g . s e n d e r 總 是 存 在 的 注意:在 Solidity 中,功能執行始終需要從外部呼叫者開始。 一個合約只會在區塊鏈上什麼也不做,除非有人呼叫其中的函式。所以 msg.sender總是存在的 Solidity調調msg.sender

mapping (address => uint) favoriteNumber;

function setMyNumber(uint _myNumber) public {
  // 更新我們的 `favoriteNumber` 對映來將 `_myNumber`儲存在 `msg.sender`名下
  favoriteNumber[msg.sender] = _myNumber;
  // 儲存資料至對映的方法和將資料儲存在陣列相似
}

function whatIsMyNumber() public view returns (uint) {
  // 拿到儲存在呼叫者地址名下的值
  // 若呼叫者還沒呼叫 setMyNumber, 則值為 `0`
  return favoriteNumber[msg.sender];
}

Require

require使得函式在執行過程中,當不滿足某些條件時丟擲錯誤,並停止執行。

function sayHiToVitalik(string _name) public returns (string) {
  // 比較 _name 是否等於 "Vitalik". 如果不成立,丟擲異常並終止程式
  // (敲黑板: Solidity 並不支援原生的字串比較, 我們只能通過比較
  // 兩字串的 keccak256 雜湊值來進行判斷)
  require(keccak256(_name) == keccak256("Vitalik"));
  // 如果返回 true, 執行如下語句
  return "Hi!";
}

繼承(Inheritance)

當程式碼過於冗長的時候,最好將程式碼和邏輯分拆到多個不同的合約中,以便於管理。合約繼承用is關鍵字。

contract Doge {
  function catchphrase() public returns (string) {
    return "So Wow CryptoDoge";
  }
}

contract BabyDoge is Doge {
  function anotherCatchphrase() public returns (string) {
    return "Such Moon BabyDoge";
  }
}