Elements Network ve Gizli İşlemler

Faruk Terzioğlu
7 min readOct 27, 2019

--

Bu yazı içerisinde Liquid Network’ün alt yapısı açık kaynaklı Elements Network ile Confidential Transaction’ı inceleyeceğim. 3 düğümlü bir blok zincir oluşturup iki kişi arasında gizli transfer işlemleri gerçekleştirip, daha sonra istekleri doğrultusunda gizli transfer işleminin detayları 3. bir kişi ile paylaşılacak.

Elements Network, Bitcoin blok zincirinin genişletilmiş bir sürümü olduğu için Bitcoin’in nasıl çalıştığına dair de baya bir fikir verebilir.

Liquid Networks

Liquid ağı borsalar, brokerlar ve piyasa yapıcılar için geliştirilmiş, yan-zincir tabanlı, borsalar arası bir blokzincirdir. Liquid ağı ile hızlı ve gizli bir şekilde bitcoin transferleri gerçekleştirebilir, fiat paraları, herhangi bir kripto para veya emtiayı tokenize edilebilirsiniz.

Başlıca özellikleri;

  • Yan zincir kullanımı sayesinde hızlı ve gizli transferler. Her 1 dk’da yeni blok üretilmektedir.
  • Gerçek varlıkların tokenize edilmesi ve ağ üzerinden gönderilip alınabilmesi, bunlara fiat paralar ve kripto paralar da dahil.
  • Tüm varlıklar Liquid ağı üzerinden transfer edilmekte, bu sayede farklı entegrasyonlar veya birden çok blockchain istemcileri gerekmemekte.
  • Açık kaynaklı Elements projesi ile geliştirilmiştir.
  • Bitcoin için bir yan zincirdir. Kullanıcılar Liquid ağı ile Bitcoin ağı arasında iki yönlü olarak bitcoin taşıyabilmekte.
  • Liquid ağındaki bitcoinlere LBtc denilmekte. Karşılığı olan bitcoinler Liquid ağının üyeleri tarafından tutulmakta. Bu bitcoinler ağ üzerinden her an doğrulanabilir.

Liquid Network üyeleri;

Altonomy, Bitbank, Bitfinex, Bitmax, BitMEX, Bitso, Blue Fire Capital, BTCBOX, BTCTrader/BtcTurk, BTSE, Cobo, Coinone, Coinut, Crypto Garage, DGroup, DMM Japan, FRNT Financial, Gate.io, GOPAX, Huobi, L2B Global, OKCoin, OpenNode, Poolin, Prycto, Sideshift AI, The Rock Trading, SIX Digital Exchange, TaoTao, Tilde, Unocoin, Xapo, XBTO, and Zaif.

Gizli İşlemler

Liquid Ağının en temel kullanımı alanı “Gizli İşlemler” dir. Bitcoin ağında olduğu gibi, Liquid ağında da transferler ağdaki herkes tarafından görüntülenebilmekte.

Fakat Liquid ağındaki işlemlerde miktarlar ve varlık tipleri 3. partilerden gizlenmiştir.

Bu bilgiler sadece transfer işlemine dahil olan taraflar ve yetki verilmiş kişiler tarafından görülebilir. Buna rağmen harcanan koinlerin geçerliliği kriptografik olarak doğrulanabilir. Liquid transferlerinde gizlenilmiş adresler kullanılır ve sadece alıcı gönderilen miktarı görebilir. Alıcı sahip olduğu çözücü anahtarı 3. partiler ile paylaşarak işlem miktarlarının ve varlık tiplerinin görülmesini sağlayabilir.

Kurulum

İlk olarak Elements Network’ün binary dosyalarını indirmeliyiz. Buradaki linkden güncel sürümün linkini kopyalayabilirsiniz.

Güncel sürümün (şu an 0.18.1.1) kendi işletim sisteminize (OSX gibi) uygun olanını indirilelim (wget ile). Daha sonrasında da SHA256 özetlerini indirip dosyaları doğrulayalım.

$ mkdir download && cd download
$ wget https://github.com/ElementsProject/elements/releases/download/elements-0.18.1.1/elements-0.18.1.1-osx64.tar.gz
$ wget SHA256SUMS.asc
$ sha256sum --check --ignore-missing SHA256SUM.asc

İndirilen dosyaları arşivden çıkarıp çalıştırmak üzere /usr/local/bin/ klasörü altına taşıyalım;

$ tar -xvf elements-0.18.1.1-x86_64-linux-gnu.tar.gz
$ sudo mv -v elements-0.18.1.1/bin/* /usr/local/bin/

Kurulumun çalıştığını doğrulamak üzere “elements” uygulamasının versiyonunu doğrulayalım.

$ elementsd --version

elements uygulamasının ayarlarını yazmak üzere elements.conf dosyasını oluşturalım;

$ mkdir ~/.elements
$ cd ~/.elements
$ sudo nano elements.conf

Dosyanın içeri aşağıdaki gibi. Node uygulaması (elementsd) arka planda çalışmasını istediğimiz için: ‘daemon=1’
Simülasyon ağı olarak çalıştırmak üzere: ‘chain=elementsregtest’
Bitcoin ağı ile iki yönlü bitcoin taşımayacağımız için ‘validatepegin=0’
Örnek bitcoinler (10 BTC) tanımlayalım: ‘initialfreecoins=1000000000’
Diğer node’lar ile p2p bağlantı için: ‘port=18886’

daemon=1
chain=elementsregtest
validatepegin=0
initialfreecoins=1000000000
[elementsregtest]
rpcport=18884
port=18886

Bu ayarlar ile ( — datadir) elementsd uygulamasını çalıştıralım;

$ elementsd --datadir=$HOME/.elements
Liquid server starting

Oluşan dosyaları incelemek için;

$ cd elementsregtest && ls -l

elementsd uygulamasının yazdığı logları incelemek için;

$ tail -f debug.log
CTRL+C

elementsd’ye rpc istekleri göndererek bilgi almak ve komutlar göndermek üzere ‘elements-cli’ uygulamasını kullanacağız. elementsd uygulamasını birden fazla çalıştırabiliyoruz (farklı dosya dizinleri vererek). İsteği hangi elementsd’ye göndereceğimizi bildirmek üzere yukarıda olduğu gibi ‘ — datadir’ parametresini ekliyoruz;

$ elements-cli --datadir=$HOME/.elements getblockchaininfo

‘getblockchaininfo’ komutu ile o an çalışan blockchain ile ilgili bilgileri sorgulayabiliriz;

Cüzdan bilgilerini (bakiye gibi) çekmek üzere;

$ elements-cli getwalletinfo

2. elementsd uygulaması için gerekli olan dizini oluşturalım;

$ mkdir ~/.elements2 && cd ~/.elements2

1. elementsd uygulamasının config dosyasını kopyalayalım;

$ cp ~/.elements/elements.conf ..

Kopyaladığımız dosyanın içeriğini 2. node için değiştirmek üzere;

$ sudo nano elements.conf

Sadece rpc portunu ve p2p portunu güncellememiz yeterli;

rpcport=18894
port=18896

2. elementsd uygulamasını çalıştıralım ve logları inceleyelim;

$ elementsd --datadir=$HOME/.elements2
$ tail -f elementsregtest/debug.log
$ elements-cli --datadir=$HOME/.elements2 getblockchaininfo

Her iki dizinde çalışan uygulamalar için de sık sık cli komutları göndereceğimiz için, kısaltma olarak ‘alias’lar oluşturalım;

$ alias e1-cli="elements-cli --datadir=$HOME/.elements"
$ e1-cli getblockchaininfo

Yukarıda görüldüğü üzere, 1. node’a cli komutu göndermek için ‘e1-cli’ yeterli olacaktır. İkinci node için de;

$ alias e2-cli="elements-cli --datadir=$HOME/.elements2"
$ e2-cli getblockchaininfo

Her iki node’u da durduralım. Yeni ayarlar ile tekrar çalıştıracağız.

Şimdi her iki node’u birbirine bağlayarak iki node’lu bir blockchain yapmak üzere gerekli değişiklikleri yapalım;

$ cd $HOME/.elements2/
$ sudo nano elements

Aşağıdaki ayarları ekleyelim.

2. node’dan birinci node’a bağlanmak için ‘connect’ değerini giriyoruz ve 1. node’un p2p portunu (18886) belirtiyoruz. Dışarıdan bağlantı isteklerini kabul ettiğimizi belirtmek için ‘listen=1’ olarak ayarlıyor ve node üzerinden transaction bilgilerini alacağımız için tüm transaction’ları indexlemek üzere ‘txindex=1’ olarak ayarlıyoruz.

[elementsregtest]
...
connect=localhost:18886
listen=1
txindex=1

Benzer ayarları 1. node için de yapalım;

$ cd $HOME/.elements/
$ sudo nano elements.conf

Değişiklikler;

[elementsregtest]
...
connect=localhost:18896
listen=1
txindex=1

Her iki node’u da çalıştıralım;

$ elementsd --datadir=$HOME/.elements
$ elementsd --datadir=$HOME/.elements2

Node’ların logunu incelediğimizde bağlantı kurulduğunu belirten ‘New outbound peer connected’ mesajını görebiliriz;

İki node arasında bilgi alışverişini doğrulamak için bir örnek yapalım. 2. node üzerinden bir blok üreteceğiz ve 1. node üzerinden blockchain bilgisini çekeceğiz;

Yukarıda görüldüğü üzere, 1. node mevcut blok sayısını 1 olarak belirtmekte (bloğu 2. node’dan üretmemize rağmen). Node’lar arası iletişim kurulmuş.

1. node’dan bir adres üretelim ve 2. node’dan bu adrese bir transfer yapalım;

Oluşan transaction hash’i (fbc7***) her iki node’dan da sorgulayalım.

$ e2-cli gettransaction fbc71c14e03d9******dc1256438e92a3a3a72 true
$ e1-cli gettransaction fbc71c14e03d9******dc1256438e92a3a3a72 true

Detayları incelediğimiz de 1. ve 2. nodeda da transaction’ın detaylarını görebilmekte. Çünkü biri alıcı biri gönderici ve tüm detaylar her iki taraf ile de paylaşılıyor.

Bu transaction’ın bilgilerinin sadece alıcı ve gönderici tarafından görülebildiğini doğrulamak için 3. node oluşturup mevcut blockchain’e bağlayalım. 3. node’un dizini;

$ cd $HOME
$ mkdir .elements3

Node dizinlerinin son hali;

Aynen 2. node’da yaptığımız gibi config dosyasını kopyalayalım;

$ cd .elements3
$ cp ~/.elements/elements.conf .
$ sudo nano elements.conf

Güncelleyeceğimiz değerler aşağıdaki gibi. Çalışan her iki node’un p2p portunu da ekliyoruz;

[elementsregtest]
rpcport=18874
port=18876
connect=localhost:18896
connect=localhost:18886

3. node’u çalıştıralım ve loglarını inceleyelim;

$ elementsd --datadir=$HOME/.elements3
$ tail -f elementsregtest/debug.log

Aşağıda gördüğümüz üzere her iki node’a da bağlandı (peer) ve her iki node’da da blok uzunluğunun 2 olduğunu görebiliyoruz. 3. node da kendini bu node’lara göre güncelleyip (UpdateTip) blok uzunluğunu (2) ayarladı.

3. node üzerinden son blok bilgisini almak için;

$ alias e3-cli="elements-cli --datadir=$HOME/.elements3"
$ e3-cli getblockchaininfo

3. node üzerinden bu bilgileri sorgulayalım. Son blok bilgisi (bestblockhash) için;

$ e3-cli getblock da47****a25632a8f

Blok içerisinde iki transaction var; birincisi blok ödülü, ikincisi bizim yukarıda gönderdiğimiz transaction. Gizli olarak gönderilen ve bilgileri sadece gönderen ve alıcı tarafından bilinen işlem. Bu işlemin detayını 3. node üzerinden sorgulayalım;

$ e3-cli getrawtransaction fbc71c146eddc1256b****a4b4438e92a3a3a72 1

Aşağıda görüldüğü üzere sadece transaction fee (0.00036520) bilgisi açık, diğer bilgiler için ise miktar aralıkları belli;

Yazının başında belirttiğim üzere, alıcı veya gönderici, işlemlerin miktar bilgisini 3. kişiler ile paylaşabilir. Bunun için 3. kişi ile ‘blinding key’ bilgisi paylaşılır.

Gönderdiğimiz transaction’ın adres sahibi 1. node idi. Onun için 1. node’dan blinding key bilgisini alalım;

$ ADD=AzpwvxSTKumarTa3JTmEVRNua*******4TBa1yL7bA2RRnNsFdFkn7eSCrMzqC
$ e1-cli dumpblindingkey $ADD

Adresi ve blinding key’i 3. node’a ekleyelim;

$ e3-cli importaddress $ADD
$ e3-cli importblindingkey $ADD dab073cf990d5464*******b7363b26412b

Bu bilgileri ekledikten sonra aynı transaction’ı 3. node’dan tekrar sorgulayalım;

$ e3-cli gettransaction fbc71c14e03d923bf****9a4b4438e92a3a3a72 true

Aşağıda gördüğümüz üzere transactrion’ın miktar bilgisi (1 BTC) artık 3. node tarafındanda bilinmekte.

3. node’dan daha önce yapılan sorguda bu bilgi gizli bir şekildeydi;

--

--