# ethereum初探

## 簡介:

以太坊（英語：Ethereum）是一個開源且具有智慧合約區塊鏈平台，設計上是為了解決比特幣擴展性不足的問題，以太坊區塊鏈上的代幣稱為以太幣（Ether），代碼為ETH

合約:

> 合約是一個活在以太坊系統內的自動代理人，他有一個自己的乙太幣地址，當用戶向合約的地址發送一筆交易後，該合約就被激活，然後根據交易中的額外信息，合約會運行自身的代碼，最後返回一個結果，這個結果可能是從合約的地址發出另外一筆交易

查看交易資訊:\
<https://etherchain.org/>

## 產生乙太幣地址

<https://ethereum.stackexchange.com/questions/3542/how-are-ethereum-addresses-generated>

```javascript
const crypto = require("crypto");
const ecdh = crypto.createECDH("secp256k1");
const sha3 = require("js-sha3");

var hash2 = crypto.randomBytes(32).toString("hex");
console.log("--------");
console.log("私鑰");
console.log(hash2.toString("hex")); //私鑰，64位十六進制數 //使用hash2.toString('hex')即可看到16進位字串
console.log("--------");

// ECDH和ECDSA產生公私鑰的方式都相同
var publickey = ecdh.setPrivateKey(hash2, "hex").getPublicKey("hex");
console.log("公鑰");
console.log(publickey); //公鑰(通過橢圓曲線算法可以從私鑰計算得到公鑰)
console.log("--------");

var sha3_256Key = sha3.keccak256(Buffer.from(publickey, "hex").slice(1)); // pubkey 轉為 buffer 後移除第一位

var address = sha3_256Key.substring(24, sha3_256Key.length); // 取後40字

var address = "0x" + address; //
console.log(address);
```

之後到<https://etherscan.io/> 右上輸入剛產生的地址確認是正確的格式

## 常見名詞:

Dapp:

> A Dapp (‘decentralized app’) consists of two parts: a frontend, written in HTML, and a backend (think of it as the ‘database’ for your frontend).\
> 以太坊社區把基於智能合約的應用稱為去中心化的應用程序(Decentralized App)。DApp的目標是(或者應該是)讓你的智能合約有一個友好的界面

geth:

> geth is the the command line interface for running a full ethereum node implemented in Go.

JSON-PRC:\
<https://github.com/ethereum/wiki/wiki/JSON-RPC>

> 簡單說即為一個會回應json格式的server

<https://github.com/ethereum/wiki/wiki/JSON-RPC>

IPC:

> 為系統中兩個兩個執行緒互相傳遞資料的方法

[https://zh.wikipedia.org/wiki/行程間通訊](https://zh.wikipedia.org/wiki/%E8%A1%8C%E7%A8%8B%E9%96%93%E9%80%9A%E8%A8%8A)

<http://albert-oma.blogspot.tw/2013/06/linux-ipc.html>

Ethash:

> 以太幣(ether)的挖礦算法叫做Ethash, 又名Dashimoto (Dagger-Hashimoto)，是Hashimoto算法結合Dagger之後產成的一個變種

Dag:

> <https://github.com/ethereum/wiki/blob/master/Dagger-Hashimoto.md>
>
> <https://github.com/ethereum/wiki/wiki/Ethash-DAG>

EVM:

> 以太坊虛擬機，輕量級虛擬機環境，是以太坊中智能合約的運行環境

Gas:

> 燃料，每執行一條合約指令會消耗一定的燃料，當某個交易還未執行結束，而燃料消耗完時，合約執行終止並回滾(rollback)狀態，可與ether進行換算，但不可交易。
>
> Gas Price: 每單位Gas多少錢( 會變動 )
>
> Gas Limit: 多少單位個Gas( 通常不會變動 )
>
> 交易手續費 **Tx Fees = Gas Limit \* Gas Price**

Ether單位

> 可參考: <http://ethdocs.org/en/latest/ether.html>

## 相關實用網站

1、以太坊官方網站：<https://ethereum.org/>

2、以太坊原始碼（官方）：<https://github.com/ethereum/>

3、以太坊說明文件（官方）：<http://www.ethdocs.org/en/latest/index.html>

4、以太坊網路狀態（官方）：[https://ethstats.Net](https://ethstats.net) /

5、以太坊相關工具與資源網站（官方）：<http://ether.fund/>

6、Solidity說明文件（官方）：<http://solidity.readthedocs.io/en/latest/>

7、以太坊網路掃描（官方）：<http://etherscan.io/>

8、以太坊官方部落格：<https://blog.ethereum.org/>

9、以太坊wiki百科：<https://github.com/ethereum/wiki/wiki>

10、以太坊中文愛好者網站：[http://ethfa​​ns.org/](http://ethfans.org/)

11、以太坊的gitter的實時交流網站：<https://gitter.im/orgs/ethereum/rooms>

12、以太坊的官方論壇：<https://forum.ethereum.org/>

13、以太坊第三方強大的IDE（Solidity IDE）：<https://live.ether.camp/>

14、以太坊開發框架Truffle說明書：<http://truffle.readthedocs.io/en/latest/>

15、以太坊開發框架dapple說明書：<http://dapple.readthedocs.io/en/master/>

16、以太坊官方推薦開發框架Meteor說明書：<https://github.com/ethereum/wiki/wiki/Dapp-using-Meteor>

## Testnet

取得免費的ether\
<https://ropsten.ether.camp/transactions>\
<http://faucet.ropsten.be:3001/>\
查看區塊情況 <https://testnet.etherscan.io/>

Aave testnet: <https://staging.aave.com/#/markets>

## METAMASK

<https://metamask.io/>

chrome的plugin，可以操作ethereum

## API Provider

<https://infura.io/#how-to>

## 線上錢包(類似線上版的MIST)

<https://wallet.ethereum.org/>

安裝metamask後可以打開此網站，之後即可讀取本地錢包資料

並且使用metamask切換network

## 共識機制介紹

POW（Proof of Work，工作證明）是指獲得多少貨幣，取決於你挖礦貢獻的工作量，即為一般的礦機或顯卡挖礦

POS（Proof of Stake，股權證明）根據你持有貨幣的量和時間進行利息分配的制度，在POS模式下，挖礦收益正比於你的幣齡，而與電腦的計算性能無關，幣齡即為持有乙太幣的時間

PoA ( Proof of Authority)\
有別於PoW (Proof-of-Work)需要解數學難題來產生block，PoA是依靠預設好的Authority nodes，負責產生block。\
可設定Authority node數量。可指定產生block的時間等

## Block difficulty

礦工挖礦的難度，當礦工增加時難度會根據算法而增加。

{% embed url="<https://2miners.com/eth-network-difficulty>" %}

## **Ethereum** Gas 計算

簡單來說：

> Gas used \*  gas price \* (gwei to eth)

`117159 * 52 * 0.000000001 =`0.006092268

> 上面的 52 可以從下圖去查看 med gas price

![](https://3415061728-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-M0u4DA5jITnh37VYXmj%2Fuploads%2FUjMxs68qt33cGuRxkKWd%2F%E6%88%AA%E5%9C%96%202022-03-24%20%E4%B8%8A%E5%8D%8810.43.58.png?alt=media\&token=c9859888-9953-4eeb-9eba-b847b8d00cc9)

gas 為以太坊上交易的手續費，會轉換成 eth 計算費用。

分為 **Transaction costs 與 Execution costs**

**Transaction costs** 總共有以下四種情況需要支付：

1. (一般交易) the base cost of a transaction (21000 gas)
2. (合約部署) the cost of a contract deployment (32000 gas)
3. the cost for every **zero byte** of data or code for a transaction.
4. the cost of every non-zero byte of data or code for a transaction.

**Execution costs 則為執行合約時運算所需要消耗的資源而定，可參考下表**

![](https://3415061728-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-M0u4DA5jITnh37VYXmj%2Fuploads%2FeTgysPNBJiat0OVTlVu0%2FEthereum-Yellow-Paper.png?alt=media\&token=60449aef-cac0-43fb-8fd4-281e5046751e)

以上表來說 value 指的是 gas unit 或 gas limit（多少單位的 gas），所以以太坊交易手續費計算方式則類似如下： 21000 (Gas Limit) x 50 Gwei (Gas Price)= 1050000 Gwei

gas price 一般用 Gwei 為單位，所以計算後交易手續費為（TX Fee) = 1050000 \*0.000000001 ETH = 0.0010500 ETH

(小提醒：每天不同時段的 Gas price 會不同，依照網路上交易擁堵程度而定，通常白天時段的下午費用會比較低)

> 當前網路上之 Gas price 可到此查詢
>
> <https://ethgasstation.info/>

## 獲取地址在特定時間的 Token 餘額

<https://etherscan.io/tokencheck-tool>
