Bu döküman, sunucunuzda halihazırda çalışan ve altyapı standartlarımıza göre kurulu olan 0gchaind ve geth servislerini koruyarak yürütme katmanını Reth katmanına taşır.
Node'u durdurmadan önce, bizim yerel RPC portumuz üzerinden (Profilinizdeki $OG_PORT değişkenini kullanarak) geth'in işlediği en son blok numarasını canlı olarak çekiyoruz ve ekrana yazdırıyoruz:
Ekrana basılan hex tabanlı blok numarasını decimal'e (normal sayıya) çevirip not edin (Örn: 39048765)
export CHAIN_HEAD=$(curl -s -X POST http://localhost:${OG_PORT}545 \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' \
| jq -r '.result' | xargs printf "%d\n")
echo "Yakalanan Son Blok Yüksekliği (CHAIN_HEAD): $CHAIN_HEAD"
Blok numarasını aldıktan sonra, veri tutarlılığı için servisleri durduruyoruz ve sadece Consensus (CL) verilerimizi yedekliyoruz:
sudo systemctl stop 0gchaind geth
BACKUP_DIR="$HOME/.0gchaind/backup-$(date +%Y%m%d-%H%M%S)"
mkdir -p $BACKUP_DIR
cp -r $HOME/.0gchaind/0g-home/0gchaind-home $BACKUP_DIR/0gchaind-home
Yeni sürüm dosyalarını çekip, altyapımızın kullandığı klasör isimlerine göre yerleştiriyoruz:
cd $HOME
wget -O aristotle.tar.gz https://github.com/0gfoundation/0gchain-Aristotle/releases/download/v1.0.6/aristotle-v1.0.6.tar.gz
tar -xzvf aristotle.tar.gz -C $HOME
rm -rf aristotle.tar.gz
mv $HOME/Aristotle-v1.0.6 $HOME/aristotle-used
sudo chmod 777 $HOME/aristotle-used/bin/*
cp $HOME/aristotle-used/bin/reth $HOME/go/bin/reth
cp $HOME/aristotle-used/bin/0gchaind $HOME/go/bin/0gchaind
mkdir -p $HOME/.0gchaind/0g-home/reth-home
cp $HOME/aristotle-used/jwt.hex $HOME/.0gchaind/0g-home/
cp $HOME/aristotle-used/kzg-trusted-setup.json $HOME/.0gchaind/0g-home/
Eski geth dizinindeki verileri dışarı aktarıyoruz. <chain_head> yazan yere 1. Adımda not ettiğiniz canlı blok numarasını yazın:
$HOME/go/bin/geth export \
--datadir $HOME/.0gchaind/0g-home/geth-home \
$HOME/.0gchaind/0g-home/chain-export.rlp \
1 $CHAIN_HEAD
Reth mimarisini genesis dosyası ile ilklendirip, ihraç edilen veri bloğundaki çakışma yaratacak 0. (genesis) bloğu ayıklıyoruz:
reth init \
--chain $HOME/aristotle-used/geth-genesis.json \
--datadir $HOME/.0gchaind/0g-home/reth-home
sudo tee $HOME/.0gchaind/0g-home/trim_export.py > /dev/null <<EOF
import sys
input_file = "$HOME/.0gchaind/0g-home/chain-export.rlp"
output_file = "$HOME/.0gchaind/0g-home/chain-export-from-{start}.rlp"
start_block = int(sys.argv[1]) if len(sys.argv) > 1 else 1
output_file = output_file.format(start=start_block)
print(f"Trimming blocks before {start_block}, output: {output_file}")
def read_rlp_length(f):
first = f.read(1)
if not first:
return None, 0
b = first[0]
if b < 0xc0:
return None, 0
elif b <= 0xf7:
return first, b - 0xc0
else:
len_bytes_count = b - 0xf7
len_bytes = f.read(len_bytes_count)
return first + len_bytes, int.from_bytes(len_bytes, 'big')
def get_block_number(block_data):
offset = 0
b = block_data[offset]
offset += 1 if b <= 0xf7 else 1 + (b - 0xf7)
b = block_data[offset]
offset += 1 if b <= 0xf7 else 1 + (b - 0xf7)
for _ in range(8):
b = block_data[offset]
if b <= 0x80:
offset += 1
elif b <= 0xb7:
offset += 1 + (b - 0x80)
elif b <= 0xbf:
n = b - 0xb7
offset += 1 + n + int.from_bytes(block_data[offset+1:offset+1+n], 'big')
elif b <= 0xf7:
offset += 1 + (b - 0xc0)
else:
n = b - 0xf7
offset += 1 + n + int.from_bytes(block_data[offset+1:offset+1+n], 'big')
b = block_data[offset]
if b == 0x80: return 0
if b < 0x80: return b
length = b - 0x80
return int.from_bytes(block_data[offset+1:offset+1+length], 'big')
block_count = 0
skipped = 0
with open(input_file, "rb") as fin, open(output_file, "wb") as fout:
while True:
header_bytes, length = read_rlp_length(fin)
if header_bytes is None:
break
block_body = fin.read(length)
if len(block_body) < length:
break
full_block = header_bytes + block_body
try:
block_number = get_block_number(full_block)
except Exception as e:
print(f"Warning: could not parse block at index {block_count + skipped}, writing anyway: {e}")
fout.write(full_block)
block_count += 1
continue
if block_number < start_block:
skipped += 1
if skipped % 100000 == 0:
print(f"Skipped {skipped} blocks (current: {block_number})...")
else:
fout.write(full_block)
block_count += 1
if block_count % 100000 == 0:
print(f"Written {block_count} blocks (current: {block_number})...")
print(f"Done. Skipped {skipped}, wrote {block_count} blocks to {output_file}")
EOF
python3 $HOME/.0gchaind/0g-home/trim_export.py 1
Temizlenen RLP dosyasını arka planda Reth üzerine yazdırıyoruz:
nohup $HOME/go/bin/reth import \
--chain $HOME/aristotle-used/geth-genesis.json \
--datadir $HOME/.0gchaind/0g-home/reth-home \
$HOME/.0gchaind/0g-home/chain-export-from-1.rlp \
>> $HOME/.0gchaind/0g-home/reth-import.log 2>&1 &
tail -f $HOME/.0gchaind/0g-home/reth-import.log
Mevcut app.toml üzerindeki engine bağlantısını yeni port yapımıza göre güncelliyoruz:
sed -i "s|^rpc-dial-url *=.*|rpc-dial-url = \"http://localhost:${OG_PORT}551\"|" $HOME/.0gchaind/0g-home/0gchaind-home/config/app.toml
Eski servisleri temizleyip, Corenode standartlarına göre yeni reth.service ve güncellenmiş 0gchaind.service dosyalarını yazıyoruz:
sudo tee /etc/systemd/system/reth.service > /dev/null <<EOF
[Unit]
Description=0G Labs Reth Execution Client
After=network.target
[Service]
User=$USER
Type=simple
WorkingDirectory=$HOME/aristotle-used
ExecStart=$HOME/go/bin/reth node \\
--chain $HOME/aristotle-used/geth-genesis.json \\
--http \\
--http.addr 0.0.0.0 \\
--http.port ${OG_PORT}545 \\
--http.api eth,net,admin \\
--authrpc.addr 0.0.0.0 \\
--authrpc.port ${OG_PORT}551 \\
--authrpc.jwtsecret $HOME/.0gchaind/0g-home/jwt.hex \\
--datadir $HOME/.0gchaind/0g-home/reth-home \\
--ipcpath $HOME/.0gchaind/0g-home/reth-home/eth-engine.ipc \\
--engine.persistence-threshold 0 \\
--engine.memory-block-buffer-target 0 \\
--bootnodes="enode://2bf74c837a98c94ad0fa8f5c58a428237d2040f9269fe622c3dbe4fef68141c28e2097d7af6ebaa041194257543dc112514238361a6498f9a38f70fd56493f96@8.221.140.134:30303" \\
--port ${OG_PORT}303 \\
--nat extip:\$(curl -s http://ipv4.icanhazip.com)
Restart=always
RestartSec=3
LimitNOFILE=65535
[Install]
WantedBy=multi-user.target
EOF
Bash
sudo tee /etc/systemd/system/0gchaind.service > /dev/null <<EOF
[Unit]
Description=0GChainD Service
After=network.target
[Service]
User=$USER
WorkingDirectory=$HOME/aristotle-used
ExecStart=$HOME/go/bin/0gchaind start \\
--rpc.laddr tcp://0.0.0.0:${OG_PORT}657 \\
--chaincfg.chain-spec mainnet \\
--chaincfg.kzg.trusted-setup-path=$HOME/.0gchaind/0g-home/kzg-trusted-setup.json \\
--chaincfg.engine.jwt-secret-path=$HOME/.0gchaind/0g-home/jwt.hex \\
--chaincfg.block-store-service.enabled \\
--chaincfg.node-api.enabled \\
--chaincfg.node-api.address 0.0.0.0:${OG_PORT}500 \\
--chaincfg.engine.rpc-dial-url=http://localhost:${OG_PORT}551 \\
--pruning=nothing \\
--chaincfg.restaking.enabled \\
--chaincfg.restaking.symbiotic-rpc-dial-url $ETH_RPC_URL \\
--chaincfg.restaking.symbiotic-get-logs-block-range 1 \\
--home=$HOME/.0gchaind/0g-home/0gchaind-home \\
--p2p.external_address=\$(curl -s http://ipv4.icanhazip.com):${OG_PORT}656
Restart=always
RestartSec=5
LimitNOFILE=65535
[Install]
WantedBy=multi-user.target
EOF
Import işlemi sorunsuzca bittiyse yeni mimariyi çalıştırıyoruz:
sudo systemctl daemon-reload
sudo systemctl enable reth 0gchaind
sudo systemctl start reth
ss -tlnp | grep ${OG_PORT}551
sudo systemctl start 0gchaind
📊 Canlı Logların Takibi Yeni sistemin servis loglarını şu komutlarla temizce izleyebilirsiniz:
sudo journalctl -u reth -f -o cat
sudo journalctl -u 0gchaind -f -o cat
Script zaten gerekli paketleri (screen vb.) kendi içinde kuruyor ancak sunucuda curl yüklü değilse scripti GitHub'dan çekebilmek için önce curl paketini sağlama alıyoruz:
sudo apt update && sudo apt install curl -y
Hazırladığın ham (raw) linki kullanarak scripti doğrudan $HOME dizinine indiriyor ve Linux üzerinde çalıştırılabilir (executable) hale getiriyoruz:
curl -o $HOME/migrate.sh https://raw.githubusercontent.com/Core-Node-Team/0G-Mainnet/refs/heads/main/migrate.sh
chmod +x $HOME/migrate.sh
Sistem değişkenlerinin ($OG_PORT, $ETH_RPC_URL) doğru okunabilmesi için profili tazeleyip scripti tetikliyoruz:
source $HOME/.bash_profile
$HOME/migrate.sh
⚙️ Script Çalışırken Dikkat Edilmesi Gerekenler:
-
Canlı Blok Kontrolü: Script ilk başladığında yerel RPC portun üzerinden güncel bloğu otomatik yakalayıp ekrana basacaktır.
-
İthalat Aşaması (Adım 6): Script, Corenode_Reth_Import adında yeni bir Screen oturumu açıp ithalatı orada başlatacak ve işlem bitene kadar ana ekranda bekleyecektir.
-
Canlı İthalat Loglarını İzleme: Eğer arka tarafta Reth'in blokları nasıl ithal ettiğini (import sürecini) canlı izlemek istersen, yeni bir terminal sekmesi açarak şu komutla screen oturumuna bağlanabilirsin:
screen -r Corenode_Reth_Import
-
(Screen ekranından ana akışı bozmadan çıkmak için klavyeden sırasıyla Ctrl + A ve ardından D tuşlarına basman yeterlidir).
-
İthalat bittiğinde script otomatik olarak uyanacak, konfigürasyonları sed ile güncelleyecek, servis dosyalarını sudo tee ile basıp süreci başarıyla tamamlayacaktır!