

AWS 區塊鏈範本已於 2019 年 4 月 30 日終止。不會進一步更新此服務或此支援文件。為了獲得最佳的受管區塊鏈體驗 AWS，我們建議您使用 [ Amazon Managed Blockchain (AMB)](https://aws.amazon.com/managed-blockchain/)。若要進一步了解 Amazon Managed Blockchain 入門，請參閱 [ Hyperledger Fabric 上的研討會](https://catalog.us-east-1.prod.workshops.aws/workshops/008da2cb-8454-42d0-877b-bc290bff7fcf/en-US)，或[有關部署 Ethereum 節點的部落格](https://aws.amazon.com/blogs/database/deploy-an-ethereum-node-on-amazon-managed-blockchain/)。如果您對 AMB 有任何疑問或需要進一步支援，[請聯絡 支援](https://console.aws.amazon.com/support/home#/case/create?issueType=technical) 或您的 AWS 客戶團隊。

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用 Ethereum 的 AWS 區塊鏈範本
<a name="blockchain-templates-ethereum"></a>

Ethereum 是區塊鏈架構，可使用 Solidity (這是一種 Ethereum 專屬語言) 來執行智慧型合約。Homestead 是 Ethereum 的最新版本。如需詳細資訊，請參閱 [Ethereum Homestead 文件](http://www.ethdocs.org/en/latest/)和[實體](https://solidity.readthedocs.io/en/v0.4.21/#)文件。

## 啟動連結
<a name="blockchain-ethereum-launch"></a>

如需使用 Ethereum [範本在特定區域中啟動的連結，請參閱 AWS 區塊鏈範本入門](https://aws.amazon.com/blockchain/templates/getting-started/)。 CloudFormation 

## Ethereum 選項
<a name="blockchain-ethereum-options"></a>

使用範本設定 Ethereum 網路時，您所做的選擇將決定後續要求：
+ [選擇容器平台](#blockchain-ethereum-platform)
+ [選擇私有或公有 Ethereum 網路](#blockchain-private-public)
+ [變更預設帳戶和助憶鍵片語](#blockchain-ethereum-mnemonic)

### 選擇容器平台
<a name="blockchain-ethereum-platform"></a>

AWS Blockchain 範本使用存放在 Amazon ECR 中的 Docker 容器來部署區塊鏈軟體。適用於 Ethereum 的 AWS 區塊鏈範本為**容器平台 **提供兩種選擇：
+ **ecs**—指定 Ethereum 在 Amazon EC2 執行個體的 Amazon ECS 叢集上執行。
+ **docker-local** - 指定 Ethereum 在單一 EC2 執行個體上執行。

#### 使用 Amazon ECS 容器平台
<a name="blockchain-ethereum-ecs"></a>

使用 Amazon ECS，您可以在由多個 EC2 執行個體組成的 ECS 叢集上建立 Ethereum 網路，其中包含 Application Load Balancer 和相關資源。如需使用 Amazon ECS 組態的詳細資訊，請參閱 [AWS 區塊鏈範本入門](blockchain-templates-getting-started.md)教學課程。

下圖說明使用範本搭配 ECS 容器平台選項建立的 Ethereum 網路：

![\[AWS diagram showing VPC with public and private subnets, load balancers, and Ethereum nodes in ECS containers.\]](http://docs.aws.amazon.com/zh_tw/blockchain-templates/latest/developerguide/images/ethereum-ecs-arch.png)


#### 使用 Docker-Local 平台
<a name="blockchain-ethereum-docker-local"></a>

或者，您可以在單一 Amazon EC2 執行個體中啟動 Ethereum 容器。所有容器都在單一 EC2 執行個體上執行。這是一個簡化設定。

下圖說明使用範本搭配 docker-local 容器平台選項建立的 Ethereum 網路：

![\[Diagram of Ethereum network on AWS with VPC, EC2 instance, containers, and ECR registry.\]](http://docs.aws.amazon.com/zh_tw/blockchain-templates/latest/developerguide/images/ethereum-docker-local-arch.png)


### 選擇私有或公有 Ethereum 網路
<a name="blockchain-private-public"></a>

選擇 1-4 以外的 **Ethereum Network ID** (Ethereum 網路 ID) 值，可建立在您定義的網路內執行的私有 Ethereum 節點，並使用您指定的私有網路參數。

當您從 1–4 選擇 **Ethereum Network ID** 時，您建立的 Ethereum 節點會加入公有 Ethereum 網路。您可以忽略私有網路設定及其預設值。如果您選擇將 Ethereum 節點加入公有 Ethereum 網路，請確保您網路中的適當服務可以透過網際網路存取。

### 變更預設帳戶和助憶鍵片語
<a name="blockchain-ethereum-mnemonic"></a>

助憶鍵片語是一組隨機的字詞，您可用於為任何網路上的相關帳戶產生 Ethereum 錢包 (也就是私有/公有金鑰對)。助憶鍵片語可用於存取相關帳戶的 Ether。我們建立與 Ethereum 範本使用的預設帳戶相關聯的預設助憶鍵。

**警告**  
預設帳戶和相關聯的助憶鍵片語僅供測試之用。不要使用預設的一組帳戶傳送發送真實的 Ether，因為可存取助憶鍵片語的任何人都能存取或 Ether 或從帳戶竊取 Ether。相反地，為了生產目的才指定自訂帳戶。與預設帳戶相關聯的助憶鍵片語是 `outdoor father modify clever trophy abandon vital feel portion grit evolve twist`。

## 先決條件
<a name="blockchain-ethereum-prereq"></a>

當您使用適用於 Ethereum 的 AWS 區塊鏈範本設定 Ethereum 網路時，必須符合下列最低要求。範本需要下列每個類別列出的 AWS 元件：

**Topics**
+ [存取 Ethereum 資源的先決條件](#blockchain-ethereum-prereq-access)
+ [IAM 先決條件](#blockchain-ethereum-prereq-iam)
+ [安全群組必要條件](#blockchain-ethereum-prereq-sec)
+ [VPC 先決條件](#blockchain-ethereum-prereq-vpc)
+ [EC2 執行個體描述檔和 ECS 角色的 IAM 許可範例](#blockchain-ethereum-iam-examples)

### 存取 Ethereum 資源的先決條件
<a name="blockchain-ethereum-prereq-access"></a>


| 先決條件 | 對於 ECS 平台 | 對於 Docker-Local | 
| --- | --- | --- | 
|  可用來存取 Amazon EC2 EC2 金鑰對。金鑰必須與 ECS 叢集及其他資源位於相同的區域。  |  ✔  |  ✔  | 
|  網際網路對應元件 (例如堡壘主機或網際網路對應的負載平衡器) 具有內部地址，允許該地址中的流量進入 Application Load Balancer。ECS 平台需要此元件，因為基於安全原因，範本會建立內部負載平衡器。當 EC2 執行個體位於私有子網路時，docker-local 平台需要此元件 (建議做法)。如需設定堡壘主機的相關資訊，請參閱 [建立堡壘主機](blockchain-template-getting-started-prerequisites.md#blockchain-templates-bastion-host)。  |  ✔  |  ✔ (使用私有子網路)  | 

### IAM 先決條件
<a name="blockchain-ethereum-prereq-iam"></a>


| 先決條件 | 對於 ECS 平台 | 對於 Docker-Local | 
| --- | --- | --- | 
|  有權使用所有相關服務的 IAM 主體 （使用者或群組）。  |  ✔  |  ✔  | 
|  Amazon EC2 執行個體描述檔，具有 EC2 執行個體與其他 服務互動的適當許可。如需詳細資訊，請參閱[To create an EC2 instance profile](blockchain-template-getting-started-prerequisites.md#create-ec2-role)。  |  ✔  |  ✔  | 
|  具有 Amazon ECS 與其他 服務互動許可的 IAM 角色。如需詳細資訊，請參閱[建立 ECS 角色和許可](#blockchain-ethereum-ecs-role)。  |  ✔  |    | 

### 安全群組必要條件
<a name="blockchain-ethereum-prereq-sec"></a>


| 先決條件 | 對於 ECS 平台 | 對於 Docker-Local | 
| --- | --- | --- | 
| 適用於 EC2 執行個體的安全群組，具備以下要求： | ✔ |  ✔  | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/blockchain-templates/latest/developerguide/blockchain-templates-ethereum.html)  | ✔ |  ✔  | 
|  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/blockchain-templates/latest/developerguide/blockchain-templates-ethereum.html)  | ✔ |  ✔  | 
| [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/blockchain-templates/latest/developerguide/blockchain-templates-ethereum.html) | ✔ |  | 
| [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/blockchain-templates/latest/developerguide/blockchain-templates-ethereum.html) |  | ✔ | 
|  Application Load Balancer 的安全群組，具備以下要求： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/blockchain-templates/latest/developerguide/blockchain-templates-ethereum.html)  |  ✔  |    | 

### VPC 先決條件
<a name="blockchain-ethereum-prereq-vpc"></a>


| 先決條件 | 對於 ECS 平台 | 對於 Docker-Local | 
| --- | --- | --- | 
|  彈性 IP 地址，用於存取 Ethereum 服務。  |  ✔  |  ✔  | 
|  執行 EC2 執行個體的子網路。強烈建議使用私有子網路。  |  ✔  |  ✔  | 
|  兩個可公開存取的子網路。每個子網路必須位於彼此不同的可用區域中，其中一個子網路與 EC2 執行個體的子網路位於相同的可用區域中。  |  ✔  |    | 

### EC2 執行個體描述檔和 ECS 角色的 IAM 許可範例
<a name="blockchain-ethereum-iam-examples"></a>

您可以指定 EC2 執行個體描述檔 ARN 做為使用範本時的其中一個參數。如果您使用 ECS 容器平台，您也要指定 ECS 角色 ARN。連接到這些角色的許可政策，能讓叢集中的 AWS 資源和執行個體與其他 AWS 資源互動。如需詳細資訊，請參閱《IAM 使用者指南》**中的 [IAM 角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html)。使用下列政策陳述式和程序做為起點，來建立許可。

#### EC2 執行個體描述檔的範例許可政策
<a name="blockchain-ethereum-ec2-instance"></a>

下列許可政策示範當您選擇 ECS 容器平台時，EC2 執行個體描述檔可以執行的動作。相同的政策陳述式可以用在 docker-local 容器平台中，其中移除 `ecs` 內容金鑰以限制存取。

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ecs:CreateCluster",
                "ecs:DeregisterContainerInstance",
                "ecs:DiscoverPollEndpoint",
                "ecs:Poll",
                "ecs:RegisterContainerInstance",
                "ecs:StartTelemetrySession",
                "ecs:Submit*",
                "ecr:GetAuthorizationToken",
                "ecr:BatchCheckLayerAvailability",
                "ecr:GetDownloadUrlForLayer",
                "ecr:BatchGetImage",
                "logs:CreateLogStream",
                "logs:PutLogEvents",
                "dynamodb:BatchGetItem",
                "dynamodb:BatchWriteItem",
                "dynamodb:PutItem",
                "dynamodb:DeleteItem",
                "dynamodb:GetItem",
                "dynamodb:Scan",
                "dynamodb:Query",
                "dynamodb:UpdateItem"
            ],
            "Resource": "*"
        }
    ]
}
```

#### 建立 ECS 角色和許可
<a name="blockchain-ethereum-ecs-role"></a>

對於連接到 ECS 角色的許可，我們建議您從 **AmazonEC2ContainerServiceRole** 許可政策開始。請使用下列步驟來建立角色，並連接將此許可政策。使用 IAM 主控台檢視此政策中up-to-date許可。

**建立 Amazon ECS 的 IAM 角色**

1. 前往網址 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 開啟 IAM 主控台。

1. 在導覽窗格中，選擇**角色** 、**建立角色**。

1. 在 **Select type of trusted entity (選擇信任的實體類型)** 下，選擇 **AWS service (AWS 服務)**。

1. 針對 **Choose the service that will use this role (選擇將使用此角色的服務)**，請選擇 **Elastic Container Service**。

1. 在 **Select your use case (選擇您的使用案例)** 下方選擇 **Elastic Container Service**、**Next:Permissions (下一步：許可)**。  
![\[AWS console interface for creating a role, with Elastic Container Service selected as the use case.\]](http://docs.aws.amazon.com/zh_tw/blockchain-templates/latest/developerguide/images/ecs-role.png)

1. 維持選取 **Permissions policy (許可政策)** 中的預設政策 (**AmazonEC2ContainerServiceRole**)，然後選擇 **Next:Review (下一步：檢閱)**。

1. 在 **Role name (角色名稱)** 中輸入可協助您識別此角色的值，例如 *ECSRoleForEthereum*。在 **Role Description (角色描述)** 中輸入簡短摘要。請記下稍後的角色名稱。

1. 選擇建**立角色**。

1. 從清單中選擇您剛剛建立的角色。如果您的帳戶有許多角色，您可以搜尋角色名稱。  
![\[AWSIAM console showing a role named "ECSRoleForEtherum" with its description.\]](http://docs.aws.amazon.com/zh_tw/blockchain-templates/latest/developerguide/images/ecs-role-list.png)

1. 複製 **Role ARN (角色 ARN)** 值並加以儲存，讓您稍後可以再次複製。建立 Ethereum 網路時會需要此 ARN。  
![\[AWSIAM role summary page showing role ARN, description, and attached policies.\]](http://docs.aws.amazon.com/zh_tw/blockchain-templates/latest/developerguide/images/ecs-role-arn.png)

## 連線至 Ethereum 資源
<a name="blockchain-ethereum-connecting"></a>

在您使用 範本建立的根堆疊顯示 **CREATE\$1COMPLETE** 之後，您可以使用 CloudFormation 主控台連線到 Ethereum 資源。您的連線方式取決於您選擇的容器平台，ECS 或 docker-local：
+ **ECS** - 根堆疊的**輸出**索引標籤提供在 Application Load Balancer 上執行之服務的連結。基於安全理由，無法直接存取這些 URL。若要連線，您可以設定和使用*堡壘主機*來代理連線。如需詳細資訊，請參閱下面的[使用堡壘主機的代理連線](#ethereum-create-bastion-host)。
+ **docker-local** - 您可以使用託管 Ethereum 服務的 EC2 執行個體 IP 地址進行連線，如下所示。使用 EC2 主控台找到範本建立之執行個體的 *ec2-IP-address*。
  + **EthStats** - 使用 http：//*ec2-IP-address*
  + **EthExplorer** - 使用 http：//*ec2-IP-address*：8080
  + **EthJsonRpc** - 使用 http：//*ec2-IP-address*：8545

  如果您為 **Ethereum Network Subnet ID (Ethereum 網路子網路 ID)** (範本中的 **List of VPC Subnets to use (要使用的 VPC 子網路清單)**) 指定公有子網路，您可以直接連線。您的用戶端對於 SSH (連接埠 22) 以及所列出的連接埠，必須是傳入流量的信任來源。這取決於您使用 Ethereum 的 AWS Blockchain 範本指定的 **EC2 安全群組**。

  如果已指定私有子網路，您可以設定並使用*堡壘主機*以代理連線至這些地址。如需詳細資訊，請參閱下面的[使用堡壘主機的代理連線](#ethereum-create-bastion-host)。

### 使用堡壘主機的代理連線
<a name="ethereum-create-bastion-host"></a>

在某些組態中，Ethereum 服務可能無法公開使用。在這些情況下，您可以透過*堡壘主機*連線到 Ethereum 資源。如需堡壘主機的詳細資訊，請參閱 [Linux 堡壘主機快速入門指南中的 Linux 堡壘主機架構](https://docs.aws.amazon.com/quickstart/latest/linux-bastion/architecture.html)。 **

堡壘主機是 EC2 執行個體。請確定符合下列要求：
+ 堡壘主機的 EC2 執行個體位於已啟用自動指派公有 IP 且具有網際網路閘道的公有子網路內。
+ 堡壘主機具有允許 SSH 連線的金鑰對。
+ 堡壘主機與安全群組相關聯，該安全群組允許來自連線用戶端的傳入 SSH 流量。
+ 指派給 Ethereum 主機的安全群組 （例如，如果 ECS 是容器平台，則為 Application Load Balancer，如果 docker-local 是容器平台，則為主機 EC2 執行個體） 允許來自 VPC 內來源的所有連接埠上的傳入流量。

設定堡壘主機後，請確定連線的用戶端使用堡壘主機做為代理。下列範例示範使用 Mac OS 設定代理連線。以堡壘主機 EC2 執行個體的 IP 地址取代 *BastionIP*，並以您複製至堡壘主機的金鑰對檔案取代 *MySshKey.pem*。

在命令列上，輸入下列內容：

```
ssh -i mySshKey.pem  ec2-user@BastionIP -D 9001
```

這會為本機電腦上的連接埠 9001 設定連接埠轉送至堡壘主機。

接著，將您的瀏覽器或系統設定為使用 的 SOCKS 代理`localhost:9001`。例如，使用 Mac OS，選取 **System Preferences (系統偏好設定)**、**Network (網路)**、**Advanced (進階)**，選取 **SOCKS proxy (SOCKS 代理)**，然後輸入 **localhost:9001**。

在 Chrome 上使用 FoxyProxy Standard，請選取 **More Tools (更多工具)**、**Extensions (擴充功能)**。在 **FoxyProxy Standard** 下方選取 **Details (詳細資訊)**、**Extension options (擴充功能選項)**、**Add New Proxy (新增代理)**。選取 **Manual Proxy Configuration (手動代理組態)**。在 **Host or IP Address (主機或 IP 地址)** 中輸入 **localhost**，在 **Port (連接埠)** 中輸入 **9001**。選取 **SOCKS Proxy? (SOCKS 代理？)**、**Save (儲存)**。

您現在應該能夠連線到範本輸出中列出的 Ethereum 主機地址。