###### tags: `程式紀錄`
# iota Chronicle deploy note , iota Chronicle 實作
有任何問題請發信至qsda82@smail.nchu.edu.tw
### 1. Chronicle
參考:https://github.com/iotaledger/chronicle.rs
#### 必要條件:
* A Linux LTS operating system such as Ubuntu
* 4 GB RAM
* At least 32 GB of disk space
* 64-bit processor
* Preferred a 10 Gbps network connection
* At least 2 CPU cores (recommended)
* Rust
* At least one Scylla node (version 4 or greater) running on a different device in the same private network as Chronicle.
#### 步驟:
#### 1.安裝build-essentials packages
```
sudo apt-get install build-essential gcc make cmake cmake-gui cmake-curses-gui pkg-config openssl libssl-dev
```
#### 2.安裝Rust
```
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source "$HOME/.cargo/env"
rustup update stable
```
#### 3.設定config檔
```
(
version: 3,
config: (
websocket_address: "127.0.0.1:8081",
storage_config: (
keyspaces: [
(
name: "chronicle",#scylla設定的keyspaces名稱
data_centers: {
"datacenter1": (
replication_factor: 1,
),
},
),
],
listen_address: "127.0.0.1:8080",
thread_count: CoreMultiple(1),
reporter_count: 1,
local_datacenter: "datacenter1",
nodes: [
"192.168.1.212:9042",#scylla的ip port
],
partition_config: (
partition_count: 1000,
milestone_chunk_size: 8640,
),
),
api_config: (),
broker_config: (
websocket_address: "127.0.0.1:9000",
mqtt_brokers: {
MessagesReferenced: [
"tcp://192.168.1.210:1883", #hornet的ip port
],
Messages: [
"tcp://192.168.1.210:1883", #hornet的ip port
],
},
mqtt_stream_capacity: 10000,
api_endpoints: [
"https://chrysalis-chronicle.iota.org/api/mainnet/",#主鏈網址
],
retries_per_endpoint: 5,
retries_per_query: 100,
collector_count: 10,
requester_count: 10,
request_timeout_secs: 5,
parallelism: 25,
sync_range: Some((
from: 1,
to: 2147483647,
)),
complete_gaps_interval_secs: 3600,
logs_dir: Some("/home/chronicle/chronicle.rs/log"),
max_log_size: Some(4294967296),
),
historical_config_path: "./historical_config",
alert_config: (
requests: [],
),
),
)
```
#### 4.clone chronicle
```
git clone https://github.com/iotaledger/chronicle.rs
cd chronicle.rs/
cargo build --release
#執行chronicle之前要先設定與scylla&hornet的連線
cd target/release/
cargo run --release
```
#### 5.Chronicle API
詳細資料:
https://legacy.docs.iota.works/docs/chronicle/1.1/tutorials/run-a-permanode
https://legacy.docs.iota.works/docs/chronicle/1.1/references/chronicle-api-reference
在hashes欄位輸入交易的hash
```
curl http://localhost:4000/api \
-X POST \
-H 'Content-Type: application/json' \
-H 'X-IOTA-API-Version: 1' \
-d '{
"command": "getTrytes",
"hashes": [""]
}'
```
回傳內容:
```
{
"trytes":["BCDDPCADADXCBDVCEAKDXCHDWCEARBYBACXBOBCCEAHDXCDDGDTC9DTCRCHDQAEAHDWCPCBDZCEAMDCDIDEAUCCDFDEAIDGDXCBDVCEARBYBACXBOBCCEADD9DPCMDQCCDCDZCJ9MBCDIDBDHDDBEAVABBCBZAXACBJ9CCXCADTCGDHDPCADDDDBEAWAUAWAUARAUA9BRAWAZACCUACBDBZAXADBWAUAICJ9VCCCCCKBEAHDCDCDZCEAVASACBVA9BGDEAMASCTCDDHDWCGBVANA99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999HORNET99INTEGRATED99SPAMMER9999999999999999999999999999999999999999999999999RAJIV999999999999999999999999999HORNET99SPAM99RAJIV9999IPZZNHURACD99999999999999999999WPEHMEK9QNNRXVTKQQUUZLREUYNIMUNFQXNIQBX9AGPPSCR99GACMAGXLPXVJXPIGBUFRTRXNLYOYBW9XNJLWELEHNVTWUKIGCJ9YWDNNABOJJPCZTYP9GRGGCJB9ZCJ9NPMWVETCIMTAKWAOK9LJSWVKJBEI99999NJLWELEHNVTWUKIGCJ9YWDNNABOJJPCZTYP9GRGGCJB9ZCJ9NPMWVETCIMTAKWAOK9LJSWVKJBEI99999HORNET99SPAM99RAJIV9999IPZZGHCVK9HQF999999999K99999999CI99999999LCWB9999999999999"],"milestones":[null]
}
```
### 2. Scylla
參考:
https://www.scylladb.com/download/?platform=ubuntu-20.04&version=scylla-5.0#open-source
https://ithelp.ithome.com.tw/articles/10234001
#### 步驟:
#### 1.安裝scylla
```
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys d0a112e067426ab2
sudo curl -L --output /etc/apt/sources.list.d/scylla.list http://downloads.scylladb.com/deb/ubuntu/scylla-5.0.list
sudo apt-get update
sudo apt-get install -y scylla
sudo apt-get update
sudo apt-get install -y openjdk-8-jre-headless
sudo update-java-alternatives --jre-headless -s java-1.8.0-openjdk-amd64
#設定scylla一路按yes,除了中間一個步驟是專為RAID0,如果本身機器沒有做可以跳過。
sudo scylla_setup
sudo systemctl start scylla-server
#測試是否安裝成功,以下有錯誤訊息即為安裝失敗
nodetool status
cqlsh
sudo service scylla-server status
```
#### 2.設定config檔
/etc/scylla/scylla.yaml
#### 要修改的內容:
改完記得sudo service scylla-server restart
並在chronicle機器上啟動chronicle
```
cluster_name: '你要的名字'
listen_address: 0.0.0.0
broadcast_address: 0.0.0.0
rpc_address: 0.0.0.0
broadcast_rpc_address: 0.0.0.0
```
可能會出現改完config檔後,chronicle在連線時出錯的問題,解決方式是一次改一個,ex:先將listen_address改成0.0.0.0其餘維持原樣,再去開chornicle看會不會出錯,沒問題就改下一個broadcast_address改成0.0.0.0,改完一樣去開chornicle看會不會出錯,以此類推,一個一個去找問題點。
#### 3.建立資料庫
參考:https://ithelp.ithome.com.tw/articles/10235825
照理說設定完後連線chronicle會自動建立scylla資料庫,若沒有建立就要自己建
```
descirbe KEYSPACE;
create keyspace 你要的名稱 WITH replication={'class':'SimpleStrategy','replication_factor':3};
descirbe KEYSPACE;
use 上方設定的名稱 ;
descirbe KEYSPACE
```
#### 建立完後到chronicle config檔設定KEYSPACE名稱(name)

### 3.Hornet
#### 步驟:
#### 1.安裝hornet
```
sudo sh -c 'echo "deb http://ppa.hornet.zone stable main" >> /etc/apt/sources.list.d/hornet.list'
sudo apt install gnupg
sudo apt update
wget -qO - https://ppa.hornet.zone/pubkey.txt | sudo apt-key add -
sudo apt update
cd /etc/apt/sources.list.d
#更改hornet.list內容
sudo nano hornet.list
"""
deb [arch=amd64] http://ppa.hornet.zone stable main #加入這行
deb http://ppa.hornet.zone stable main
"""
sudo apt update
sudo apt install hornet
sudo service hornet restart
sudo service hornet status #查看hornet狀況
```
### 4. 架構圖
#### chronicle會透過MQTT去監聽Hornet的節點資料,再將這些資料動態存到Scylla
