iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 10
0

GAS

GAS 是一個特別的機制,可以視作程式碼的複雜度計算,複雜度越高則執行費用(fee)越高。

  • fee = gas (fuel) * gasPrice
    • 合約傳送獲得以太幣 (stipend) 2300 gas
    • 帳戶傳送花費以太幣 21000 gas
  • 每個 EVM 指令有相對應的 gas
    • 程式愈複雜愈貴
    • 防止惡意攻擊及維護公開鏈的系統效能
  • Gas 不夠時會發生 Error
    • throw 會強制花光所有 gas 以防繼續執行下去

獎勵發動交易及共識機制 - PoW 的獲勝者 - miner。

  • 成功
    • fee:獎勵 fuel x gasPrice 給 miner
    • fuel :剩餘的 fuel x gasPrice 退回給 originator
  • 失敗
    • fee :miner 全拿
    • fuel :因為 gas (fuel) 不夠或被 throw

函式描述子(modifier)

  • 描述子
    function onlyOwnerCanDoThis() isOwner { ... }
    
  • 參數
    function aFunctionNeedingEther costsAtLeast(10 ether) { ... }
    
  • payable:保留字,附加傳送以太幣

變數重設

以太坊的變數設定方式較為嚴格,須經由特定指令;如使用 delete 以重新設定。

uint data;
function f() 
{
    uint x = data;
    delete x;
}

密碼函式

因資料加密需求,提供了多種加密函式,便於程式開發引用。

addmod(uint x, uint y, uint k) returns (uint)	//(x + y) % k
mulmod(uint x, uint y, uint k) returns (uint)	//(x * y) % k

//雜湊函式
sha3(...) returns (bytes32)
sha256(...) returns (bytes32)
ripemd160(...) returns (bytes20)

//利用橢圓加密復原從簽章反推出當初簽章者的 address
//hash:secp256k1.sign(msg hash, privatekey) 之產物 (Tx hash 被外部帳戶 sign)
//v:signature.復原參數 + 27 (ethereum 橢圓參數)
//r:signature[0-31],s 為 signature[32-63]
ecrecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) returns (address)

Address 函式

關於地址的相關函式。

address.send(uint wei) returns (bool)	//檢查發送過程是否成功
address.balance 						//回傳 wei
this 									//這個合約(contract)的地址(address)

msg.sender.send(10 ether);				//傳送 10 以太幣,給呼叫者
msg.sender.send(this.balance);			//傳送此合約擁有的所有錢,給呼叫者

#### 合約(Contract)函式

//此 contract 的位址
this

//合約自殺時,把合約帳戶裡的餘額退還到指定帳戶
//假如合約中沒有撰寫此方法或其他傳送以太幣的方法,合約的錢永遠拿不回來
selfdestruct(address recipient)

//匿名函式,Fallback Function
//用法類似於其他語言流程控制中的 default
//因為單純送錢的函式沒有名字,也會進入這個函式
function () {}

//加上 payable 描述子的話才能用於 .send()
//要接收其他帳戶傳送貨幣的話必須加上此描述子
//並實作 匿名函式,Fallback Function
function () payable {}

呼叫合約

使用時須注意函式以及變數的撰寫格式。

  • 介面
    function F() [modifiers...] [contant] returns(T…,) {}
    
  • 狀態變數
    T [public, external] t; 
    
//確定 address type 
//明確轉換 (Explicit Conversion)
Contract contract= Contract(address);

contract.function(arg…,);					//呼叫方法
contract.send(uint wei);					//單純送錢,gas stipend 2300
contract.function.value(uint wei)(arg…,);	//呼叫方法順便送錢
contract.function.gas(uint gas)(arg…,);		//設定 gas

上一篇
以太坊(Ethereum):Solidity
下一篇
以太坊(Ethereum):Web3.js
系列文
區塊鏈開發(Blockchain/DLT Application Development)30

尚未有邦友留言

立即登入留言