Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
---
title: "智慧型合約安全列清單"
description: "一推薦程序來編輯安全智慧型合約"
author: "Trailofbits"
tags: [ "smart contracts", "security", "solidity" ]
skill: intermediate
lang: zh-tw
published: 2020-09-07
source: Building secure contracts
sourceUrl: https://github.com/crytic/building-secure-contracts/blob/master/development-guidelines/workflow.md
---

## 智能合約開發檢查清單 {#smart-contract-development-checklist}

此為一推薦之高階程序來遵照當你編輯你的智慧型合約.

確認已知安全問題:

- 使用 [Slither](https://github.com/crytic/slither) 檢閱您的合約。 此具一40 內建偵查器來檢查常見程式漏洞. 運行其於各新程式之檢查點並確保此具有一清晰回報(或利用一分流模式來靜音某些問題).
- 使用 [Crytic](https://crytic.io/) 檢閱您的合約。 此確認Slither不包含之50額外問題. Crytic能幫助你的團隊來處於開發優勢, 藉由簡單來顯示安全物提於GitHub提取請求.

為你的合約考慮特殊規範:

- 你的合約是否可被升級? 使用 [`slither-check-upgradeability`](https://github.com/crytic/slither/wiki/Upgradeability-Checks) 或 [Crytic](https://blog.trailofbits.com/2020/06/12/upgradeable-contracts-made-safer-with-crytic/) 檢查可升級性程式碼中的瑕疵。 我們已記錄17種可能導致失敗之升級方式.
- 你的合約是否聲稱符合ERCs標準? 使用 [`slither-check-erc`](https://github.com/crytic/slither/wiki/ERC-Conformance) 檢查。 此工具立即表示6項常見檢測指標觀點.
- 你是否與一第三方代幣互動? 在信賴外部合約前,請先檢閱我們的[代幣整合檢查清單](/developers/tutorials/token-integration-checklist/)。

可視重要安全特徵於你的合約程式:

- 檢閱 Slither 的 [inheritance-graph](https://github.com/trailofbits/slither/wiki/Printer-documentation#inheritance-graph) 輸出器。 避免不經意之影覆蓋及C3線性化問題.
- 檢閱 Slither 的 [function-summary](https://github.com/trailofbits/slither/wiki/Printer-documentation#function-summary) 輸出器。 此回報功能函數可視性及其訪問控制.
- 檢閱 Slither 的 [vars-and-auth](https://github.com/trailofbits/slither/wiki/Printer-documentation#variables-written-and-authorization) 輸出器。 此回報訪問控制及狀態變量.

紀錄重要安全特性並使用自動化測試生成者來判斷其:

- 學習如何[為您的程式碼記錄安全屬性](/developers/tutorials/guide-to-smart-contract-security-tools/)。 此剛開始極為困難, 但其為一最重要之活動來達成一良好安全結果. 此也為一基本要求來為任何先進技術於此教程.
- 在 Solidity 中定義安全屬性,以便與 [Echidna](https://github.com/crytic/echidna) 和 [Manticore](https://manticore.readthedocs.io/en/latest/verifier.html) 一起使用。 專注於你的狀態機器, 訪問控制, 算數操作, 外部互動, 及基本一致性.
- 使用 [Slither 的 Python 應用程式介面 (API)](/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/) 定義安全屬性。 專注於繼承, 變量依據, 訪問控制, 及其他架構問題.
- 在每次提交時,使用 [Crytic](https://crytic.io) 執行您的屬性測試。 Crytic能消化及價值安全特性測試所以任何參與者於你開發團隊能簡單來查看其是否正確通過於GitHub. 失敗測試可能阻擋提議.

最終, 請留心自動工具無法簡單發現之問題:

- 隱私缺乏性: 所有參與者將能查看你的交易當其排隊於池內.
- 偷跑運行交易
- 加密操作
- 高風險互動與外部Defi部件

## 尋求協助 {#ask-for-help}

[以太坊辦公時間](https://calendly.com/dan-trailofbits/office-hours) 於每週二下午舉行。 此1小時, 1-對-1對應為一極佳機會來讓任何人來詢問關於安全, 道具使用憂慮, 並取得專家回報關於你的目前選擇方案. 我們將幫助你於此對應機會.

加入我們的 Slack:[Empire Hacking](https://join.slack.com/t/empirehacking/shared_invite/zt-h97bbrj8-1jwuiU33nnzg67JcvIciUw)。 我們永遠於#crytic 及 #ethereum通道如你有任何問題.
Original file line number Diff line number Diff line change
@@ -0,0 +1,210 @@
---
title: "使用 ethers.js 傳送代幣"
description: "使用 ethers.js 傳送代幣的初學者指南。"
author: Kim YongJun
tags: [ "ETHERS.JS", "ERC-20", "TOKENS" ]
skill: beginner
lang: zh-tw
published: 2021-04-06
---

## 使用 ethers.js (5.0) 傳送代幣 {#send-token}

### 在本教學中,您將學習如何 {#you-learn-about}

- 匯入 ethers.js
- 傳送代幣
- 根據網路流量情況設定 gas 價格

### 開始使用 {#to-get-started}

開始之前,我們必須先將 ethers.js 函式庫匯入 javascript 程式碼中
包含 ethers.js (5.0)

### 安裝 {#install-ethersjs}

```shell
/home/ricmoo> npm install --save ethers
```

瀏覽器中的 ES6

```html
<script type="module">
import { ethers } from "https://cdn.ethers.io/lib/ethers-5.0.esm.min.js"
// 您的程式碼...
</script>
```

瀏覽器中的 ES3 (UMD)

```html
<script
src="https://cdn.ethers.io/lib/ethers-5.0.umd.min.js"
type="application/javascript"
></script>
```

### 參數 {#param}

1. **`contract_address`**:代幣合約地址(當您要傳送的代幣不是 ether 時,需要合約地址)
2. **`send_token_amount`**:您想傳送給接收者的代幣數量
3. **`to_address`**:接收者的地址
4. **`send_account`**:傳送者的地址
5. **`private_key`**:傳送者的私密金鑰,用以簽署交易並實際傳送代幣

## 注意事項 {#notice}

`signTransaction(tx)` 已被移除,因為 `sendTransaction()` 會在內部處理。

## 傳送程序 {#procedure}

### 1. 連線至網路 (測試網) {#connect-to-network}

#### 設定提供者 (Infura) {#set-provider}

連線至 Ropsten 測試網

```javascript
window.ethersProvider = new ethers.providers.InfuraProvider("ropsten")
```

### 2. 建立錢包 {#create-wallet}

```javascript
let wallet = new ethers.Wallet(private_key)
```

### 3 將錢包連線至網路 {#connect-wallet-to-net}

```javascript
let walletSigner = wallet.connect(window.ethersProvider)
```

### 4 取得目前的 gas 價格 {#get-gas}

```javascript
window.ethersProvider.getGasPrice() // gas 價格
```

### 5 定義交易 {#define-transaction}

下方定義的變數相依於 `send_token()`。

### 交易參數 {#transaction-params}

1. **`send_account`**:代幣傳送者的地址
2. **`to_address`**:代幣接收者的地址
3. **`send_token_amount`**:要傳送的代幣數量
4. **`gas_limit`**:gas 上限
5. **`gas_price`**:gas 價格

[關於如何使用,請參閱下方](#how-to-use)

```javascript
const tx = {
from: send_account,
to: to_address,
value: ethers.utils.parseEther(send_token_amount),
nonce: window.ethersProvider.getTransactionCount(send_account, "latest"),
gasLimit: ethers.utils.hexlify(gas_limit), // 100000
gasPrice: gas_price,
}
```

### 6. 傳送 {#transfer}

```javascript
walletSigner.sendTransaction(tx).then((transaction) => {
console.dir(transaction)
alert("傳送完成!")
})
```

## 如何使用 {#how-to-use}

```javascript
let private_key =
"41559d28e936dc92104ff30691519693fc753ffbee6251a611b9aa1878f12a4d"
let send_token_amount = "1"
let to_address = "0x4c10D2734Fb76D3236E522509181CC3Ba8DE0e80"
let send_address = "0xda27a282B5B6c5229699891CfA6b900A716539E6"
let gas_limit = "0x100000"
let wallet = new ethers.Wallet(private_key)
let walletSigner = wallet.connect(window.ethersProvider)
let contract_address = ""
window.ethersProvider = new ethers.providers.InfuraProvider("ropsten")

send_token(
contract_address,
send_token_amount,
to_address,
send_address,
private_key
)
```

### 成功! {#success}

![交易成功完成的圖片](./successful-transaction.png)

## send_token() {#send-token-method}

```javascript
function send_token(
contract_address,
send_token_amount,
to_address,
send_account,
private_key
) {
let wallet = new ethers.Wallet(private_key)
let walletSigner = wallet.connect(window.ethersProvider)

window.ethersProvider.getGasPrice().then((currentGasPrice) => {
let gas_price = ethers.utils.hexlify(parseInt(currentGasPrice))
console.log(`gas_price: ${gas_price}`)

if (contract_address) {
// 一般代幣傳送
let contract = new ethers.Contract(
contract_address,
send_abi,
walletSigner
)

// 多少代幣?
let numberOfTokens = ethers.utils.parseUnits(send_token_amount, 18)
console.log(`numberOfTokens: ${numberOfTokens}`)

// 傳送代幣
contract.transfer(to_address, numberOfTokens).then((transferResult) => {
console.dir(transferResult)
alert("已傳送代幣")
})
} // ether 傳送
else {
const tx = {
from: send_account,
to: to_address,
value: ethers.utils.parseEther(send_token_amount),
nonce: window.ethersProvider.getTransactionCount(
send_account,
"latest"
),
gasLimit: ethers.utils.hexlify(gas_limit), // 100000
gasPrice: gas_price,
}
console.dir(tx)
try {
walletSigner.sendTransaction(tx).then((transaction) => {
console.dir(transaction)
alert("傳送完成!")
})
} catch (error) {
alert("傳送失敗!!")
}
}
})
}
```
Loading