# 專題
## 0422會議
### 學習筆記
#### 私鏈架設
同一台機器底下的節點的port應不同
不同機器的port可以相同,但要在同一台wifi底下的lan連線
- 錢包就是帳戶
- 以帳戶的身分將智能合約部署在鏈上
- remix will call the account of metamask to deploy the smart contract to the test net or the main net.
### 目前要務
完成同一台機器底下私有鏈的架設
#### genesis
[來源](https://geth.ethereum.org/docs/interface/peer-to-peer)
```
{
"config": {
"chainId": 15,
"homesteadBlock": 0,
"eip150Block": 0,
"eip155Block": 0,
"eip158Block": 0,
"byzantiumBlock": 0,
"constantinopleBlock": 0,
"petersburgBlock": 0,
"ethash": {}
},
"difficulty": "1",
"gasLimit": "8000000",
"alloc": {
}
}
```
#### accounts
**node A**
- nodea
- 0x0e1b83c3FDfa7558b132D531Fa9F4496350cb011
**node B**
- nodeb
- 0xe100ADDfCaFB3e778f26bEf6C36145d04c3947eC
#### start node
**node A**
- `geth --networkid="15" --port 30304 --nodiscover --datadir="/home/pi/project/private-chain-A" --verbosity 4 --rpcapi="db,eth,net,web3,personal,web3" --netrestrict="127.0.0.1/20" console`
- 得知enode為:`enode://82b379c7449af69199cca66f932d714ac41ee053cfbed7ed112615efbf28bf39f6400a063560d4362c389582d9be63f5650228f0baec382afc20001bd0dcf1b4@140.116.179.57:30304`
- 對nodeA增加節點:`admin.addTrustedPeer("enode://e894e2c3261140fc2279b91bfefca3a08f96c2f0cfaac4bed8d848ef58dc49d3e73ab2d80cba1acca78c72e273621daf2c8fadbd02859d66606f0e886f61e26d@140.116.179.57:30305")`
**node B**
- `geth --networkid="15" --port 30305 --nodiscover --datadir="/home/pi/project/private-chain-B" --verbosity 4 --rpcapi="db,eth,net,web3,personal,web3" --netrestrict="127.0.0.1/20" console`
- 得知enode為:`enode://e894e2c3261140fc2279b91bfefca3a08f96c2f0cfaac4bed8d848ef58dc49d3e73ab2d80cba1acca78c72e273621daf2c8fadbd02859d66606f0e886f61e26d@140.116.179.57:30305`
#### errors
`etherbase must be explicitly specified`
sol:在~/project下執行console指令
`Ethereum handshake failed id=0b7fc03b70853f9f conn=inbound err="Network ID mismatch - 64917 (!= 15)"`
sol:目前先以netstrict作為暫定解方
`Rejected inbound connnection addr=54.237.248.51:40242 err="not whitelisted in NetRestrict"`
sol:尚無解方
## 0506會議
### 學習筆記
要找樹莓派的WLAN0的介面卡IP
如果要架在別台機器上時,就在那台電腦上TRUFFLE的IP就要填那個電腦的IP
TRUFFLE只是一個與節點溝通的工具,TRUFFLE所在地可以與節點分開,若自己電腦要與自己電腦溝通,就用127.0.0.1,若要與別台機器溝通,就用WIFI,像是10.0.0.1之類的(WLAN)
要先用SSH確認電腦間可以溝通,在想著去架鏈
用TRUFFLE ATTACH去與區塊鏈溝通。
[reference](https://github.com/iknowright/etherem-private-chain)
### 任務
在自己實驗室的電腦上完成私鏈以及truffle設定。
#### 進度
由於實驗室電腦使用wifi連接,無法建立ssh連線,推斷應暫時無法進行我的筆電與實驗室桌機之私鏈
因此先嘗試以實驗室電腦連接樹莓派ssh。
RASP with camera:192.168.0.100
#### problem
- 無法連上ssh
解方:由於實驗室電腦連上wifi進行上網,有可能因此電腦的IP為internal address,因而無法上網。
一般而言,IP分為internal IP address與external IP address。前者以192.168...或10.0...開頭,後者則以140.116...開頭,external可與外部網路連接,但internal只能與同為internal的內網裝置連接。如下圖:

## 0520會議
### 學習筆記
--http與--http.addr.用來讓網路上的其他人可以找到你這個資料夾,像是Infura就是你可以透過網際網路去連線到其他電腦裡面的資料夾(區塊鏈)。
自己電腦與自己電腦溝通可以透過localhost(10.0.0.1或127.0.0.1:3000)
主鏈是對外的,所以每一台電腦都能連,但如果只是架在你自己電腦的localhost那別人就連不進去。
如果要讓自己電腦的私鏈可以讓外部連到,那就必須要讓自己的ip expose出來(就是利用--http addr 0.0.0.0的指令)
假設樹莓派一localhost為127.0.0.1:3000,內網為192.168.0.100:3000,那在自己電腦上的瀏覽器可以透過Localhost(127.0.0.1:3000)訪問,如果我想要讓另外一台樹莓派二(192.168.0.102)連過來,那就要透過內網(192.168.0.100:3000)才能訪問。

內網ip由路由器分配(192.168.1.1分配你到底要102還是100)
假設有一台內網之外的電腦想要連樹莓派一的網頁。那就需要一個public的ip,以我們實驗室為例,就是140.116.xxx.xxx,先訪問到這個內網(LAN)的外網iP,但如果你真正想要讓所有人訪問你樹莓派一的網頁,那還需要一些設定,例如PORT Forwarding才能去抓那個樹莓派一的網頁。
當然最理想的狀態就是你那台樹莓派一就有一個自己的PUBLIC IP,直接連進去就好了。但PUBLIC IP非常難拿到。
INFURA是一個服務,他提供對外開放的ip,然後他再提供一整個設定的服務去連線到你那台電腦的節點,這樣你就不需要再做一整套後續的設定才能去抓你那個內網的裝置的網頁。

但我們現在先專注在內網(LAN)即可。
### 任務
在自己電腦上架個網頁,嘗試用自己的LOCALHOST連上,再嘗試用同一個內網的裝置連上你那個網頁。不用急著架節點也無所謂。
#### 進度
使用`npm install http-server -g`建立localhost網址
[參考網址](https://stackoverflow.com/questions/38497334/how-to-run-html-file-on-localhost)
可透過localhost:8080訪問該資料夾內容