Bu makale makine çevirisi ayna makalesidir, orijinal makaleye geçmek için lütfen buraya tıklayın.

Görünüm: 13646|Yanıt: 2

Blockchain Uygulama Geliştirme Rehberi

[Bağlantıyı kopyala]
Yayınlandı 3.05.2018 15:55:28 | | |
Açıklama: Aşağıda Xunlei Company tarafından yazılmış "Xunlei Global Blockchain Uygulama Rekabeti Geliştirme Rehberi" belgesi yer almaktadır; neden Xunlei Company tarafından yazılmış belge blokzincir geliştirme rehberi olarak kullanılıyor?

Thunder aslında Ethereum akıllı sözleşmeleriyle kurulmuş özel bir zincirdir, teknoloji çok olgunlaşmıştır ve blokzincir teknolojisi üzerine derinlemesine araştırmalar yapmaktadır; bu da blokzincir gelişimimiz için rehber bir öneme sahiptir.

"Bir örnekten çıkarım çıkarmak" dediği gibi, Xunlei sayesinde Xunlei tarafından yazılmış blokzincir geliştirme rehberi belgesini okuyarak başka blok zinciri uygulamaları geliştirebiliriz.

Belgede şöyle yer alıyor:

1/16
Thunder Global Blockchain Uygulama Yarışması Geliştirme Rehberi
Hat önerisine sözleşme geliştirme
1. Akıllı sözleşme yazmadan önce, blokzincir temelleri hakkında belirli bir anlayışa sahip olmanız gerekir (ek: Ethereum Genel Bakışı).
2. Solidity dilini (solidity API) öğrenin.
3. Trüf çerçevesini sağlamlık öğrenimiyle birlikte kullanmayı öğrenin. Trüf kullanımı yerel olarak
Bir blokzincir ortamında sözleşmeler yürütün.
4. Zeppelin-solidty'yi (güvenliğe adanmış standart bir sözleşme çerçevesi) öğrenin ve kullanın, entegrasyon tasarlayın
Sözleşme modu, ayrı veri ve mantıksal sözleşmeler, izin güvenliğini kontrol etmek ve yükseltme mantığını göz önünde bulundurmak.
5. Sözleşmelerle web3.js kullanarak etkileşime girmeyi öğrenin. Metamask eklentisini ve web servisini blokzincir ile kullanın
Etkileşim.
6. Forum Soru-Cevap: http://wanke.xunlei.com/forum.php?
mod=forumdisplay&fid=53 (Karşılaştığınız herhangi bir sorun bu forumda geri alınabilir.)
3 iş günü içinde size cevap vereceğiz)
Temel kavramlar
Blokzincir
Blockchain, merkezi olmayan dağıtık hesaplama sistemidir ve bunun ana özelliği verilerin kalıcı olarak değişmezliğidir.
Oluşturulamaz ve yüksek düzeyde açıklık, şeffaflık ve güven içerir. Temel teknolojiler arasında Bizans Hata Toleransı Uzlaşması Algoritması (PBFT) yer alır.
şifreleme teknolojisi, P2P teknolojisi vb.
İşlem
Blockchain, küresel paylaşılan bir işlem veritabanı sistemi olarak anlaşılabilir. İzni olan herhangi bir yazılım bunu okuyabilir
Blokzincir ağından veri alın. Blok ağındaki veri değiştirilmesi gerektiğinde bir örtü başlatılmalıdır
Blok düğümler tarafından kabul edilen talepler vardır ve bunlar sistemde toplu olarak işlem olarak adlandırılır.
İşlemler işlemlidir ve blokzincire gönderilir, ya hepsi değil ya da tamamı gerçekleştirilir. Bir ticaret yöneticisi
Satır tamamlandıktan sonra, kalıcı olarak blokzincire kaydedilir ve değiştirilemez veya tekrar çalıştırılamaz.
İşlemler sistemdeki hesap tarafından başlatılır ve imzalanır; kriptografi yoluyla işlemler yalnızca özel anahtarla tutulabilir
2/16
Birisi başlatır, diğerleri değiştirip dövmez. Bu, işlemin özgünlüğünü ve güvenliğini garanti eder.
Hesap
Blokzincir sisteminde iki tür hesap vardır; biri dış, diğeri ise sözleşme hesabıdır. Dış hesaba sahip
Kendi benzersiz halka açık ve özel anahtarlarınız ve hesabınız bu anahtar çifti tarafından kontrol ediliyor. Vadeli hesapların kendi kodu vardır ve hesap
Kendi kod kontrolü.
Hesap bir adresle tanımlanır, adres uzunluğu aynıdır ve iki hesap türü arasında fark yoktur. Dış hesabın adresi şu şekilde sağlanmıştır
Açık anahtar oluşturulur ve sözleşme adresi, sözleşme hesabının oluşturulduğu adresi ve sözleşme hesabını oluşturan işlem sayısını kullanır
(nonce) üretilir. Sözleşmeler resmi adres tarafından dağıtılır ve sıradan hesaplar doğrudan sözleşmeleri yayımlayamaz. Kullanıcının kombinasyonu
Resmi olarak incelenip Xunlei tarafından yayımlanmalıdır.
Sistem içinde iki hesap türü arasında hiçbir fark yoktur. Her hesabın sistem içinde 256 bit var
256 bite kadar anahtar-değer depolama yapısına depolama denir. Her hesabın bir bakiyesi vardır
Wei'de bakiye, sayısal değere sahip bir işlemin hesaba gönderilmesiyle değiştirilebilir.
Sözleşme
Sözleşme, kodu depolayan bir blokzincir hesabıdır ve sözleşme çağrısı, işlemlerin bu hesaba gönderilmesiyle yapılır. Ne zaman
Daha önce daha popüler olan sözleşmeli programlama dili Solidity idi. Şu anda yarışma sadece Solidity dilinde sözleşme başvurularını desteklemektedir.
Sözleşme iki bölüme ayrılır: veri depolama ve fonksiyon, veri sözleşmenin durumunu saklar, fonksiyon ise sözleşmedir
Harici arayüz, fonksiyonları çağırarak veri sorgusu ve durum değişikliğini gerçekleştirir.
Bir programlama dili üzerinden bir sözleşme yaz ve derlemeden sonra EVM bayt kodunu al. Bir işlemi sözleşme hesabına göndererek, gerçek
Mevcut sözleşme görüşmesi.
Gaz
Gaz, blokzincirin ödeme birimidir ve bir işlem oluşturulduğunda belirli bir gaz miktarı belirlenir. Lord
İşlemdeki hesaplama miktarını kısıtlamak ve işlemin yürütülmesi için bir ücret ödemek ise. İşlemin yürütülmesi sırasında, Gas
EVM tarafından belirlenen bir kural tarafından tüketilecek.
Gaz fiyatı, işlem oluşturucu tarafından belirlenen bir değer ve işlemi gerçekleştirmek için gereken ücret sayısıdır
Miktar Gas_Price*Gaz. İşlem Bitiyor Eğer bir gaz kalmışsa, kalan kısım yaratıcı öneriye geri verilir
kullanıcılar. Gaz yetersizse, işlem yürütülmesi başarısız olur ve işlem sistem güvenliği için sel saldırılarını önlemez
Taşıma ücreti iade edilmez. En küçük benzin fiyat birimi wei'dir, 10^18 wei = 1 zincir gram.
Katlık
3/16
Solidity, akıllı sözleşmeler için tasarlanmış yüksek seviyeli bir programlama dilidir ve EVM (Ethereum) üzerinde çalışır.
Virtual Machine)。 Dil tasarım uygulaması C++/Python/JavaScript'ten etkilenmiştir.
Solidity, kalıtım, polimorfizm, arayüzler, soyutlama, kütüphaneler, özel veri tipleri ve daha fazlasını destekleyen güçlü tipli bir dildir
Seks. Solidity, assembly komut programlamasını destekler ve kod bayt koduna derlenir ve EVM üzerinde çalışır. Katlık
En popüler akıllı sözleşme geliştirme dili, Thunder Sözleşme Platformu tarafından önerilen ve desteklenen dildir.
Notlar:
1. Ethereum Sanal Makinesi, akıllı sözleşmeler için çalışma zamanı ortamı sağlayan Ethereum üzerinde bir sanal ortamdır
Simüle edilmiş bir makine. Yarışma platformu EVM ile uyumludur, ancak resmi platformun kullanım kısıtlamalarına uymalıdır.
2. Hesap türleri harici hesaplar (sıradan ticaret hesap adresleri) ve vadeli işlemler hesaplarına ayrılır. Bir sözleşme oluşturun
Bu, bir işlemin hedef hesap adresi 0'a gönderilme sürecidir.
3. Yarışma, akıllıca kombinasyonlar geliştirmek için trüf (trüf v4.1.5 katlık v0.4.21) kullanımını belirtir
Platform, katılımcı tarafından sunulan belgenin kaynak koduna göre bayt kodu doğrulayacaktır. ,
Trüf ile sözleşmeler geliştirin
Akıllı sözleşme sağlamlığı geliştirme çerçevesi truffle. Tam bir geliştirme, hata ayıklama ve düzenleme seti sunar
Yerel ortamların çevrilisi, dağıtımı ve testi. Bazı şablonlara göre şablon komutunu hızlıca açabilirsiniz
Karşılık gelen sözleşme yapısını oluşturun.
Trüf Kuru
NPM i -G trüf
[root@opennode sandai]# trüf versiyonu
Truffle v4.1.5 (çekirdek: 4.1.5)
Solidity v0.4.21 (solc-js)
Başla
1. Sözleşme projesini trüf ile başlatın
4/16
mkdir simple-storage
CD basit depolama
trüf girişi
2. Yeni bir sözleşme dosyası oluşturun: Trüf kullanarak sözleşme oluşturabilirsiniz
Ayrıca doğrudan SimpleStorage komut satırından yeni bir dosya oluşturabilirsiniz
contract/SimpleStorage.sol
SimpleStorage.sol
pragma katlığı ^0.4.21;
contract SimpleStorage {
uint myVariable;
function set(uint x) public {
myVariable = x;
}
fonksiyon get() sabit kamu getirileri
(uint) {
myVariable'i geri döndür;
}
}
3. Göç betikleri ekleyin: Truffle oluşturma göçünü kullanabilirsiniz
2_deploy_contract Komut satırı yöntemi eklenir ve doğrudan yeni bir dosya oluşturabilirsiniz
Göçler/2_deploy_contract.js
2_deploy_contract.js; trüf göçünün uygulanması
Satır sırası dosya adıyla ilgilidir, bu yüzden birden fazla dağıtım betikinin sırayla adlandırılması gerekir
var SimpleStorage =
artifacts.require("SimpleStorage");
module.exports = function(deployer) {
deployer.deploy (SimpleStorage);
5/16
};
4. Trüf derleme sözleşmesini çalıştırın, derlenen sözleşme derleme klasöründe bulunuyor. sözleşme başına
Dağıtım için gerekli bayt kodu, abiCode vb. içeren karşılık gelen bir json dosyası vardır
5. Trüf dağıtım sözleşmesini ve blokzincirle etkileşim için RPC bağlantısını kurmak truffle.js düzenleyin.
[root@localhost opennode]# vi truffle.js
module.exports = {
networks: {
development: {
host: "127.0.0.1",
port: 8545,
network_id: "*"
}
}
};
6. Konsolda Truffle'ın varsayılan blokzincir ortamını açın.
Trüf gelişimi
Trüf Gelişimi başladı
http://127.0.0.1:9545/
Accounts:
(0) 0x627306090abab3a6e1400e9345bc60c78a8bef57
(1) 0xf17f52151ebef6c7334fad080c5704d77216b732
(2) 0xc5fdf4076b8f3a5357c5e395ab970b5b54098fef
(3) 0x821aea9a577a9b44299b9c15c88cf3087f3b5544
(4) 0x0d1d4e623d10f9fba5db95830f7d3839406c6af2
(5) 0x2932b7a2355d6fecc4b5c0b6bd44cc31df247a2e
(6) 0x2191ef87e392377ec08e7c08eb105ef5448eced5
(7) 0x0f4f2ac550a1b4e2280d04c21cea7ebd822934b5
(8) 0x6330a553fc93768f612722bb8c2ec78ac90b3bbc
(9) 0x5aeda56215b167893e80b4fe645ba6d5bab767de
6/16
Özel Anahtarlar:
(0)
c87509a1c067bbde78beb793e6fa76530b6382a4c0241e5e
4a9ec0a0f44dc0d3
(1)
ae6ae8e5ccbfb04590405997ee2d52d2b330726137b87505
3c36d94e974d162f
(2)
0dbbe8e4ae425a6d2687f1a7e3ba17bc98c673636790f1b8
ad91193c05875ef1
(3)
c88b703fb08cbea894b6aeff5a544fb92e78a18e19814cd8
5da83b71f772aa6c
(4)
388c684f0ba1ef5017716adb5d21a053ea8e90277d086833
7519f97bede61418
(5)
659cbb0e2411a44db63778987b1e22153c086a95eb6b18bd
f89de078917abc63
(6)
82d052c865f5763aad42add438569276c00d3d88a2d062d3
6b2bae914d58b8c8
(7)
aa3680d5d48a8283413f7a108367c7299ca73f553735860a
87b08f39395618b7
(8)
0f62d96d6675f32685bbdb8ac13cda7c23436f63efbb9d07
700d8669ff12b7c4
(9)
8d5366123cb560bb606379f90a0bfd4769eecc0557f1b362
dcae9012b548b1e5
Mnemonic: candy maple cake sugar pudding cream
bal zengin, yumuşak kırıntı tatlı ikram
⚠ Önemli ⚠ : Bu hatırlama için oluşturuldu
Truffle tarafından. Güvenli değil.
Üretimde kullanmadığınızdan emin olun
7/16
blokzincirler, aksi takdirde fon kaybetme riski taşır.
trüf (geliştirme)>
Bu, Truffle'ın sözleşmeleri yürütmesi için yerel bir blok zinciri ortamı sağlar ve varsayılan olarak 10 hesap oluşturulur ve her biri oluşturulur
Başlangıç hesap bakiyesi 100 ether. Ayrıca Ganache tarafından sağlanan grafik arayüzü de kullanabilirsiniz
, yapılandırmanın bağlandığı portu değiştirmeniz gerekiyor.
7. Trüf taşıma portu dağıtım sözleşmesini yeni bir konsolda (veya truffle'da) yürütün
Konsolu dönüştürerek göç etmesini gerçekleştirin).
8. Trüf geliştirme ile sözleşme kodunu test edin.
SimpleStorage.deployed().then(function(instance
){return
instance.get.call(); }).then(function(value)
{return value.toNumber()})
// 0
SimpleStorage.deployed().then(function(instance
){return instance.set(100); });
Çıkış işlem bilgisi
SimpleStorage.deployed().then(function(instance
){return
instance.get.call(); }).then(function(value)
{return value.toNumber()});
// 100
9. Sözleşmeyi trüf testi ile test edin, yeni bir veya
Doğrudan yeni bir dosya testi/SimpleStorage.test.js oluşturun.
const SimpleStorage =
artfacts.require('SimpleStorage');
contract('SimpleStorage', function(accounts) {
8/16
it("doğruyu iddia etmeli", fonksiyon(yapıldı)
{
var simpleStorage =
SimpleStorage.deployed();
var örneği;
simpleStorage.then(res => {
instance = çözünürlük;
return instance.get()
}).then(value => {
assert.equal('0',
value.toNumber(), 'eşit 0' değildir)
}).then(() => {
instance.set(100)
}).then(() => {
return instance.get()
}).then(value => {
assert.equal('100',
value.toNumber(), '100'e eşit değil')
})
done();
});
});
Yeni konsolda, trüf testi ./test/SimpleStorage.test.js girin.
10. Remix ile test sözleşmeleri Trüf kullanılarak hazırlanmış put sözleşmeleri hızlı şekilde değiştirilebilir
Önerilen sözleşmenin dağıtımı ve yürürlüğe koyulması. Remix, sözleşmeler için bir derleme çalışma ortamı sağlar ve sözleşme tarafından kontrol edilebilir
Tablo, sözleşmenin her işleminin giriş ve çıkış parametreleri, imzalanmış yöntem verileri gibi ayrıntılı bilgilerini görebilir,
İşlem hash ve diğer bilgiler. Hata ayıklama desteği.
1. Sözleşme derleme detaylarını görmek için derleme detaylarını kullanın. Bayt kodu, abi dahil.
ve Drip Ah yönteminin hızlı web3.js kullanımını kullandı.
9/16
2. Bir sözleşme oluşturmak için run kullanın ve konsol sözleşmeyi oluşturan işlemi görebilir.
Etkileşimli sözleşme uygulamaları oluşturmak için Truffle Unbox'u kullanın
Yukarıdaki adımlar, temel truffle init kullanılarak derlenebilen, dağıtılabilen ve hata ayıklanabilen bir sözleşme ortamı oluşturur. Aşağıda
Truffle Unbox ile yeni bir proje oluşturun, bu da bize bir trüf projesi şablonu sunuyor, içeride
Bazı sözleşme uygulama etkileşim ortamı bağımlılıkları. Trüf Kutuları'ndaki resmi teklifleri inceleyebilirsiniz
Şablon kutular. Aşağıda react şablonu yer almaktadır.
1. Yeni proje truf-react
mkdir truf-react
10/16
CD truf-react
Trüf kutusu React
Açılma süreci, çıkarma şablonunu indirir ve npm kurulumu gibi işlemleri gerçekleştirir.
2. Projenin truffle.js yapılandırın
module.exports = {
Bkz.
<http://truffleframework.com/docs/advanced/confi
Guration>
Trüf Yemeğinizi Özelleştirmek
Konfigürasyon!
networks: {
development: {
host: '127.0.0.1',
port: '9545',
network_id: '*' // Maç
herhangi bir ağ kimliği
}
}
};
3. Trüf geliştirmeye başlayın
4. SRC/App.js Değişikliği
React, { Component } 'react' üzerinden import edin
SimpleStorageContract'ı şu adresten aktarabilirsiniz
'.. /inşa/sözleşmeler/SimpleStorage.json'
getWeb3'ü './utils/getWeb3' adresinden import et
'./css/oswald.css'
'./css/open-sans.css'
'./css/pure-min.css'
11/16
'./App.css'
const kontrat = vaadi ('trüf sözleşmesi')
const simpleStorage =
sözleşme (SimpleStorageContract)
class App, Bileşeni genişletir {
constructor(props) {
süper(aksesuarlar)
this.state = {
storageValue: 0,
web3: null,
inputValue: 0,
address: null
}
this.changeValueHandle =
this.changeValueHandle.bind(this)
this.setHandle =
this.setHandle.bind(this)
}
componentWillMount() {
Ağ sağlayıcı ve web3 alın
örneğin.
Daha fazla bilgi için utils/getWeb3'e bakınız
Bilgi.
getWeb3
.then(results => {
this.setState({
web3:
results.web3
})
Sözleşme başlatma
Web3 sunulduğunda.
12/16
this.instantiateContract()
})
.catch(() => {
console.log('Hata
Web3'ü bulmak.')
})
}
instantiateContract() {
/*
* AKILLI SÖZLEŞME ÖRNEĞI
*
* Normalde bu fonksiyonlar
bir bağlamda çağrılacak
* Devlet yönetim kütüphanesi, ancak
kolaylık için buraya yerleştirdim.
*/
this.simpleStorageSet(5)
}
changeValueHandle(event) {
this.setState({
inputValue:
Number(event.target.value)
})
}
setHandle() {
this.simpleStorageSet(this.state.inputValue)
}
simpleStorageSet(x) {
simpleStorage.setProvider(this.state.web3.curren
tProvider)
Bunu sonra için ilan ediyorum, bu yüzden
13/16
SimpleStorage üzerinde fonksiyonları zincirleyebiliriz.
var simpleStorageInstance
Hesap edin.
this.state.web3.eth.getAccounts((hata,
hesaplar) => {
simpleStorage.deployed().then((instance) => {
simpleStorageInstance = örnek
this.setState({
address: instance.address })
Mağazalar
verilen değer, varsayılan olarak 5.
Dönüş
simpleStorageInstance.set(x, {from:
hesaplar[0]})
}).then((result) => {
Değeri alın
Sözleşmeden işe yaradığını kanıtlamak için.
Dönüş
simpleStorageInstance.get.call(accounts[0])
}).then((result) => {
Güncelleme durumu
sonuç olarak.
Dönüş
this.setState({ storageValue: result.c[0] })
})
})
}
render() {
return (
<div className="App">
<nav
className="navbar saf-menü saf-menü yatay sayılır">
14/16
<a href="#" className="saf-menü-başlığı puremenu-link">Trüf
Kutu</a>
</nav>
<main
className="container">
<div
className="pure-g">
<div className="pure-u-1-1">
<h1>Hazır!</h1>
<p>Trüf Kutusu kuruldu ve hazır.</p>
<h2>Akıllı Sözleşme Örneği</h2>
<p>Sözleşmelerin derlenip taşındı
aşağıda başarıyla, depolanmış bir değer gösterilecektir.
5 (varsayılan olarak).</p>
<p>Çevrimiçi depolanan değeri değiştirmeyi deneyin <strong>
59</strong> App.js.</p>
<p>Depolanan değer şudur:
{this.state.storageValue}</p>
<p>Konuşlandırılan sözleşme adresi:
{this.state.address}</p>
</div>
<div>
<input type="number" onChange=
{this.changeValueHandle}/>
<button onClick={this.setHandle}>set</button>
15/16
</div>
</div>
</main>
</div>
);
}
}
Varsayılan Uygulamayı dışa aktar
Sözleşme seti yönteminin çağrısı eklendi. Ve sözleşmenin adresini göster.
5. Yeni bir konsol açın ve npm çalıştırın başlat
6. Sözleşmenin sonuçlarını görmek için http://lcoalhost:3000 tarayıcınızda açın.
7. Sözleşme depolanan verilerin değerini set ve giriş kutuları aracılığıyla ayarlayın.
8. Trufle Development'a girin
//将xxx替换为address
SimpleStorage.at('xxxx').then(res => {return
res.get()})
BigNUmber türünün dönüş değeri elde edilir ve c dizisindeki değer ayarlanır
depo edilmiş Data.
Blokzincirle etkileşim kurmak için tarayıcı eklentisi Metamask kullanın
Referans http://truffleframework.com/tutorials/pet-shop
Katılımcılar belgeleri sunar
Yarışma, akıllı sözleşmeler geliştirmek için Truffle kullanımını belirtir; Truffle sürümü v4.1.5 solcjs sürümüne karşılık gelir
v0.4.21. Geliştiricilerin Truffle proje zip paketini ve ilgili proje tanıtım belgelerini göndermeleri gerekiyor; bunlar en azından şunları içerir
Aşağıdakiler:
16/16
1. Truffle Project Temel Dosya Yapısı: Sözleşme Girişi Testi
package.json truffle.js truffle-config.js README.md // Mühendislik dokümantasyonunun tanımı
Zorunlu node_modules gerek yok
2. Tüm proje ürününün PPT veya PDF açıklamasını sağlamalı; ürün arka planı tanıtımı, ürün önemi dahil,
Uygulama indirme adresi (isteğe bağlı), ürün kullanım süreci girişi.
Sonraki üçüncü taraf geliştiriciler, yaklaşan ThunderChain rehber belgesine göre sözleşme uygulamaları ve Chain cepleri uygulayabilirler
Etkileşim.
Dokümantasyon ve Araçlar
katlık API'si
Trüf dokümantasyonu
Ganache, yerel blokzincir ortamı için grafiksel bir arayüz sağlar
Zeppelin-Solidty, güvenli ve standartlaştırılmış bir sözleşme çerçevesine bağlı
MetaMask, RPC bağlantıları aracılığıyla blokzincir ortamına sahip tarayıcılar için tarayıcı eklentileri sağlar
web3.js blokzincirle etkileşim için Ethereum kapsüllü JS
Son olarak, pdf belgesi indirilebilir:

Dev_Guide_zh.pdf (373.55 KB, İndirme sayısı: 6)
 Ev sahibi| Yayınlandı 3.05.2018 16:01:58 |
Yayınlandı 8.05.2018 14:25:10 |
Öğrendim, teşekkürler
Feragatname:
Code Farmer Network tarafından yayımlanan tüm yazılım, programlama materyalleri veya makaleler yalnızca öğrenme ve araştırma amaçları içindir; Yukarıdaki içerik ticari veya yasa dışı amaçlarla kullanılamaz, aksi takdirde kullanıcılar tüm sonuçları ödemelidir. Bu sitedeki bilgiler internetten alınmakta olup, telif hakkı anlaşmazlıklarının bu siteyle hiçbir ilgisi yoktur. Yukarıdaki içeriği indirmeden sonraki 24 saat içinde bilgisayarınızdan tamamen silmelisiniz. Programı beğendiyseniz, lütfen orijinal yazılımı destekleyin, kayıt satın alın ve daha iyi orijinal hizmetler alın. Herhangi bir ihlal olursa, lütfen bizimle e-posta yoluyla iletişime geçin.

Mail To:help@itsvse.com