Tämä artikkeli on konekäännöksen peiliartikkeli, klikkaa tästä siirtyäksesi alkuperäiseen artikkeliin.

Näkymä: 13646|Vastaus: 2

Lohkoketjusovellusten kehitysopas

[Kopioi linkki]
Julkaistu 3.5.2018 15.55.28 | | |
Lausunto: Seuraava on Xunlei Companyn kirjoittama "Xunlei Global Blockchain Application Competition Development Guide" -dokumentti, miksi käyttää Xunlei Companyn laatimaa dokumenttia lohkoketjukehityksen oppaana?

Thunder on itse asiassa yksityinen ketju, joka on rakennettu Ethereum-älysopimuksilla, teknologia on ollut hyvin kypsää, ja sillä on syvällistä tutkimusta lohkoketjuteknologiasta, jolla on ohjaava merkitys lohkoketjun kehityksessämme.

Kuten sanonta kuuluu, "tee johtopäätöksiä yhdestä esimerkistä", voimme kehittää muita lohkoketjusovelluksia lukemalla Xunlein kirjoittaman lohkoketjukehitysoppaan, kiitos Xunlein.

Asiakirjassa todetaan:

1/16
Thunder Global Blockchain -sovelluskilpailun kehitysopas
Sopimuksen kehittäminen linjasuositukseksi
1. Ennen älysopimusten kirjoittamista sinun täytyy ymmärtää tietty ymmärrys lohkoketjun perusteista (liitteenä: Ethereum-yleiskatsaus).
2. Opettele solidity-kieli (solidity API).
3. Opettele käyttämään tryffelikehystä yhdistettynä solidity-oppimiseen. Käytä tryffelikehitystä paikallisesti
Aja sopimuksia lohkoketjuympäristössä.
4. Opi ja käytä zeppelin-solidtyä (standardoitu sopimuskehys, joka on omistettu turvallisuudelle) ja suunnittele integraatio
Sopimustila, erilliset data- ja loogiset sopimukset, käyttöoikeuksien hallinta ja päivityslogiikan huomioiminen.
5. Opettele olemaan vuorovaikutuksessa sopimusten kanssa web3.js avulla. Käytä Metamask-lisäosaa ja verkkopalvelua lohkoketjun kanssa
Vuorovaikutus.
6. Foorumin kysymys-vastaus: http://wanke.xunlei.com/forum.php?
mod=forumdisplay&fid=53 (Kaikki kohtaamasi ongelmat voi palauttaa tällä foorumilla.)
Vastaamme sinulle kolmen arkipäivän kuluessa)
Peruskäsitteet
Lohkoketju
Lohkoketju on hajautettu hajautettu laskentajärjestelmä, jonka pääominaisuus on datan pysyvä muuttumattomuus,
Sitä ei voi muovata, ja siinä on korkea avoimuus, läpinäkyvyys ja luottamus. Ydinteknologioihin kuuluvat Byzantine Fault Tolerant Consensus Algorithm (PBFT),
salausteknologia, P2P-teknologia jne.
Kauppa
Lohkoketju voidaan ymmärtää maailmanlaajuisesti jaettuna transaktiotietokantajärjestelmänä. Mikä tahansa ohjelmisto, jolla on lupa, voi lukea sen
Ota dataa lohkoketjuverkosta. Kun lohkoverkossa on tarpeen muuttaa dataa, on aloitettava peite
Lohkosolmut hyväksyvät pyynnöt, joita järjestelmässä kutsutaan yhteisesti transaktioiksi.
Tapahtumat ovat transaktionaalisia ja toimitetaan lohkoketjuun, joko ei kaikki tai kaikki suoritetaan. Kauppajohtaja
Kun rivi on valmis, se tallennetaan pysyvästi lohkoketjuun eikä sitä voi muokata tai suorittaa uudelleen.
Tapahtumat käynnistetään ja allekirjoitetaan järjestelmän tilin toimesta, ja kryptografian kautta tapahtumat voidaan säilyttää vain yksityisellä avaimella
2/16
Joku aloittaa sen, toiset eivät voi muokata tai takoa. Tämä takaa kaupan aitouden ja turvallisuuden.
Tilin
Lohkoketjujärjestelmässä on kahta tyyppiä tilejä: toinen ulkoinen ja toinen sopimustili. Ulkoisen tilin omistama
Sinulla on omat ainutlaatuiset julkiset ja yksityiset avaimet, ja tilisi on tämän avainparin hallinnassa. Futuuritileillä on oma koodinsa, ja tili on luotu
Oma koodinhallinta.
Tili tunnistetaan osoitteella, osoitteen pituus on sama, eikä tilityypin välillä ole eroa. Ulkoisen tilin osoite annetaan seuraavasti
Julkinen avain luodaan, ja sopimusosoite käyttää osoitetta, josta sopimustili on luotu, sekä sopimustilin luoneiden tapahtumien määrää
(nonce) tuotetaan. Sopimukset sijoitetaan virallisen osoitteen kautta, eikä tavalliset tilit voi suoraan julkaista sopimuksia. Käyttäjän yhdistelmä
Se täytyy virallisesti tarkistaa ja julkaista Xunlein toimesta.
Järjestelmässä ei ole eroa näiden kahden tilityypin välillä. Jokaisessa tilissä on järjestelmässä 256-bittisiä
Avain-arvo-tallennusrakennetta enintään 256 bittiä kutsutaan tallennukseksi. Jokaisella tilillä on saldo nimeltä
WEI:n saldoa voidaan muuttaa lähettämällä tilille numeerisen arvon omaava tapahtuma.
Sopimus
Sopimus on lohkoketjutili, joka tallentaa koodin, ja sopimuskutsu tehdään lähettämällä tapahtumat tälle tilille. Milloin
Aiempi suositumpi sopimusohjelmointikieli oli Solidity. Tällä hetkellä kilpailu tukee vain sopimusten jättämistä Solidity-kielellä.
Sopimus on jaettu kahteen osaan: datan tallennus ja funktio, data tallentaa sopimuksen tilan ja funktio on sopimus
Ulkoinen rajapinta toteuttaa datakyselyn ja tilan muokkauksen kutsumalla funktioita.
Kirjoita sopimus ohjelmointikielellä ja hanki EVM-tavukoodi kääntämisen jälkeen. Lähettämällä tapahtuman sopimustilille, todellinen
Nykyinen sopimuspuhelu.
Kaasu
Kaasu on lohkoketjun maksuyksikkö, ja kun transaktio luodaan, määritellään tietty kaasumäärä. Herra
Jos tarkoituksena on rajoittaa tapahtuman laskentamäärää ja maksaa maksu tapahtuman suorittamisesta. Kaupan toteuttamisen aikana Gas
Se kulutetaan EVM:n asettaman säännön mukaan.
Kaasun hinta on arvo, jonka transaktion tekijä määrittelee ja kuinka monta maksua tapahtuman toteuttamiseen vaaditaan
Määrä on Gas_Price*Kaasu. Tapahtuma päättyy Jos kaasua jää yli, jäljelle jäävä osa palautetaan tekijän ehdotukselle
käyttäjiä. Jos kaasu on riittämätön, transaktion suoritus epäonnistuu, eikä tapahtuma onnistu estämään tulvahyökkäyksiä järjestelmän turvallisuuden vuoksi
Käsittelymaksua ei palauteta. Kaasun hinnan pienin yksikkö on wei, 10^18 wei = 1 ketjugramma.
Kiinteyys
3/16
Solidity on korkean tason ohjelmointikieli, joka on suunniteltu älysopimuksille ja toimii EVM:llä (Ethereum).
Virtual Machine)。 Kielisuunnittelun toteutukseen vaikuttavat C++/Python/JavaScript.
Solidity on vahvasti tyypitetty kieli, joka tukee periytymistä, polymorfismia, rajapintoja, abstraktiota, kirjastoja, mukautettuja tietotyyppejä ja paljon muuta
Seksi. Solidity tukee assemble-käskyjen ohjelmointia, ja koodi käännetään tavukoodiksi ja toimii EVM:llä. Kiinteyys on
Suosituin älysopimuskehityskieli on myös Thunder Contract Platformin suosittelema ja tukema kieli.
Huomautuksia:
1. Ethereum Virtual Machine on virtuaaliympäristö Ethereumissa, joka tarjoaa ajonaikaisen ympäristön älysopimuksille
Simuloitu kone. Kilpailualusta on yhteensopiva EVM:n kanssa, mutta sen on noudatettava virallisen alustan käyttörajoituksia.
2. Tilityypit jaetaan ulkoisiin tileihin (tavalliset kaupankäyntitilien osoitteet) ja futuuritileihin. Luo sopimus
Se on prosessi, jossa transaktio lähetetään kohdetilin osoitteeseen 0.
3. Kilpailussa määritellään tryffelin (tryffeli v4.1.5 solidity v0.4.21) käyttö älykkäiden yhdistelmien kehittämiseksi
Alusta varmistaa tavukoodin osallistujan toimittaman asiakirjan lähdekoodin mukaisesti. ,
Laadi sopimuksia tryffelin kanssa
Älysopimusten kiinteyttävyyskehys Tryffle. Se tarjoaa täydellisen kehitys-, virheenkorjaus- ja muokkaussarjan
Paikallisten ympäristöjen kääntäminen, käyttöönotto ja testaus. Voit käyttää mallikomentoa unbox nopeasti joidenkin mallipohjien perusteella
Luo vastaava sopimusrakenne.
Asenna tryffeli
NPM i -G tryffeli
[root@opennode sandai]# tryffeliversio
Tryffle v4.1.5 (ydin: 4.1.5)
Solidity v0.4.21 (solc-js)
Aloita
1. Käynnistä sopimusprojekti tryffellä
4/16
mkdir simple-storage
CD-yksinkertainen tallennus
tryffeli init
2. Luo uusi sopimustiedosto: Voit käyttää tryffeliä sopimuksen luomiseen
Voit myös luoda uuden tiedoston suoraan SimpleStorage-komentoriviltä
contract/SimpleStorage.sol
SimpleStorage.sol
pragman kiinteyys ^0.4.21;
contract SimpleStorage {
uint myVariable;
Funktiojoukko(UINT X) julkinen {
myVariable = x;
}
funktio get() vakio julkiset tuotot
(uint) {
return myVariable;
}
}
3. Lisää siirtoskriptit: Voit käyttää tryffle create migrationia
2_deploy_contract Komentorivimetodi lisätään, ja voit myös luoda uuden tiedoston suoraan
Muuttoliikkeet/2_deploy_contract.js
2_deploy_contract.js; tryffelivaeltajan toteutus
Rivijärjestys liittyy tiedoston nimeen, joten useita käyttöönottoskriptejä täytyy nimetä järjestyksessä
var SimpleStorage =
artifacts.require("SimpleStorage");
module.exports = function(deployer) {
deployer.deploy (SimpleStorage);
5/16
};
4. Suorita tryffelikäännössopimus, ja käännetty sopimus löytyy build-kansiosta. Sopimuksen mukaan
Vastaava json-tiedosto sisältää tavukoodin, abiCoden jne. käyttöönottoon
5. Muokkaa truffle.js asettaaksesi tryffelien käyttöönottosopimuksen ja RPC-yhteyden toimiaksesi lohkoketjun kanssa.
[root@localhost opennode]# vi truffle.js
module.exports = {
networks: {
development: {
host: "127.0.0.1",
port: 8545,
network_id: "*"
}
}
};
6. Käynnistä Trufflen oletuslohkoketjuympäristö konsolilla.
Tryffelikehitys
Tryffle Development alkoi
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
Yksityiset avaimet:
(0)
c87509a1c067bbde78beb793e6fa76530b6382a4c0241e5e
4a9ec0a0f44dc0d3
(1)
ae6ae8e5ccbfb04590405997ee2d52d2b330726137b87505
3c36d94e974d162f
(2)
0dbbe8e4ae425a6d2687f1a7e3ba17bc98c6736790f1b8
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
hunajainen sileä muru makea herkku
⚠ Tärkeää ⚠: Tämä muistisääntö on luotu
sinä Trufflen kautta. Se ei ole turvallista.
Varmista, ettet käytä sitä tuotannossa
7/16
lohkoketjut, muuten riskeeraat varojen menettämisen.
Tryffeli (kehitys)>
Tämä tarjoaa Trufflelle natiivin lohkoketjuympäristön sopimusten suorittamiseen, jolloin oletuksena syntyy 10 tiliä, joista jokainen luodaan
Alkuperäinen tilin saldo on 100 eetteriä. Voit myös käyttää Ganachen tarjoamaa graafista käyttöliittymää
, sinun täytyy muokata porttia, johon konfiguraatio on liitetty.
7. Suorita tryffelisiirtoportin käyttöönottosopimus uudessa konsolissa (tai tryfflessa)
kehitä konsoli suorittamaan migraation).
8. Testaa sopimuskoodi tryffelikehityksellä.
SimpleStorage.deployed().then(function(instance
){return
instance.get.call(); }).then(funktio(arvo)
{return value.toNumber()})
// 0
SimpleStorage.deployed().then(function(instance
){return instance.set(100); });
Tulostustransaktiotiedot
SimpleStorage.deployed().then(function(instance
){return
instance.get.call(); }).then(funktio(arvo)
{return value.toNumber()});
// 100
9. Testaa sopimus tryffelitestillä Käytä tryffeliluo testiä SimpleStorage luodaksesi uuden tai
Luo uusi tiedostotesti/SimpleStorage.test.js suoraan.
const SimpleStorage =
artifacts.require('SimpleStorage');
contract('SimpleStorage', function(accounts) {
8/16
it("pitäisi väittää tode", funktio(tehty)
{
var simpleStorage =
SimpleStorage.deployed();
VAR-instanssi;
simpleStorage.then(res => {
instance = res;
return instance.get()
}).then(value => {
assert.equal('0',
value.toNumber(), 'ei ole yhtä suuri kuin 0')
}).then(() => {
instance.set(100)
}).then(() => {
return instance.get()
}).then(value => {
assert.equal('100',
value.toNumber(), 'ei ole yhtä suuri kuin 100')
})
done();
});
});
Uudessa konsolissa syötä tryffelitesti ./test/SimpleStorage.test.js.
10. Testaussopimukset remixillä Put sopimukset on kehitetty tryffelin avulla remixissä nopeaan muokkaamiseen
Ehdotetun sopimuksen käyttöönotto ja käyttöönotto. Remix tarjoaa kokoamisaikaisen ajonaikaisen ympäristön sopimuksille ja sitä voidaan hallita sopimuksella
Taulukko voi nähdä yksityiskohtaiset tiedot jokaisesta sopimuksen transaktiosta, kuten syöte- ja tulostusparametrit, allekirjoitetut menetelmätiedot,
transaktion tiiviste ja muuta tietoa. Tue debuggausta.
1. Käytä kokoamistietoja nähdäksesi sopimuksen kokoamistiedot. Sisältää tavukoodit, abi
sekä web3.js Drip Ah -menetelmän nopean käyttöönoton avulla.
9/16
2. Käytä juoksua sopimuksen luomiseen, ja konsoli voi nähdä transaktion, joka loi sopimuksen.
Käytä Truffle Unboxia luodaksesi interaktiivisia sopimussovelluksia
Edellä mainitut vaiheet luovat sopimusympäristön, joka voidaan kääntää, ottaa käyttöön ja debuggata perus-truffle-initillä. Alla
Luo uusi projekti Truffle Unboxilla, joka tarjoaa meille tryffeliprojektipohjan sisällä
Jotkut sopimussovellusten vuorovaikutusympäristön riippuvuuksista. Voit tutustua viralliseen tarjontaan Tryffle Boxissa
Mallilaatikot. Seuraava on react-malli.
1. Uusi projekti truf-react
mkdir truf-react
10/16
CD truf-react
tryffeli unbox React
Unbox-prosessi lataa poimintapohjan ja suorittaa toimintoja, kuten npm-asennuksen.
2. Määritä projektin truffle.js
module.exports = {
Katso
<http://truffleframework.com/docs/advanced/confi
Guration>
voit räätälöidä tryffelisi
Kokoonpano!
networks: {
development: {
host: '127.0.0.1',
port: '9545',
network_id: '*' // Ottelu
Mikä tahansa verkkotunnus
}
}
};
3. Aloita tryffelin kehittäminen
4. SRC/App.js muutos
tuo React, { Komponentti } pois 'react'
tuo SimpleStorageContract
'.. /rakenna/sopimukset/SimpleStorage.json'
tuo getWeb3 osoitteesta './utils/getWeb3'
Tuo './css/oswald.css'
Tuo './css/open-sans.css'
Tuo './css/pure-min.css'
11/16
Tuo './App.css'
const contract = vaatia ('tryffelisopimus')
const simpleStorage =
sopimus (SimpleStorageContract)
class App laajentaa Komponentti {
constructor(props) {
super(rekvisiitta)
this.state = {
storageValue: 0,
web3: null,
inputValue: 0,
address: null
}
this.changeValueHandle =
this.changeValueHandle.bind(this)
this.setHandle =
this.setHandle.bind(this)
}
componentWillMount() {
Hanki verkkopalveluntarjoaja ja web3
Instanssi.
Katso lisätietoja osoitteista utils/getWeb3
tietoa.
getWeb3
.then(results => {
this.setState({
web3:
results.web3
})
Instantsiate-sopimus
Kun web3 tarjottiin.
12/16
this.instantiateContract()
})
.catch(() => {
console.log('Virhe
Web3:n löytäminen.')
})
}
instantiateContract() {
/*
* ÄLYSOPIMUSESIMERKKI
*
* Normaalisti nämä funktiot olisivat
kutsuttaisiin kontekstissa
* osavaltion hallintokirjasto, mutta
Mukavuuden vuoksi olen sijoittanut ne tänne.
*/
this.simpleStorageSet(5)
}
changeValueHandle(event) {
this.setState({
inputValue:
Numero(event.target.value)
})
}
setHandle() {
this.simpleStorageSet(this.state.inputValue)
}
simpleStorageSet(x) {
simpleStorage.setProvider(this.state.web3.curren
tProvider)
Ilmoitan tämän myöhemmäksi, joten
13/16
voimme ketjuttaa funktioita SimpleStoragessa.
var simpleStorageInstance
Hanki tilejä.
this.state.web3.eth.getAccounts((virhe,
accounts) => {
simpleStorage.deployed().then((instance) => {
simpleStorageInstance = instanssi
this.setState({
address: instance.address })
Varastot a
annettu arvo, oletuksena 5.
Paluu
simpleStorageInstance.set(x, {from:
tilit[0]})
}).then((result) => {
Saat arvon
sopimuksesta todistaakseen, että se toimi.
Paluu
simpleStorageInstance.get.call(accounts[0])
}).then((result) => {
Päivitystila
tuloksena.
Paluu
this.setState({ storageValue: result.c[0] })
})
})
}
render() {
Return (
<div className="App">
<nav
className="navbar puhdas-menu puhdas-menu">
14/16
<a href="#" className="pure-menu-heading puremenu-link">Tryffel
Laatikko</a>
</nav>
<pää
className="container">
<div
className="pure-g">
<div className="pure-u-1-1">
<h1>Valmiina!</h1>
<p>Tryffelilaatikkosi on asennettu ja valmis.</p>
<h2>Älysopimusesimerkki</h2>
<p>Jos sopimuksesi on käännetty ja siirretty
Onnistuneesti alla näkyy tallennettu arvo
5 (oletuksena).</p>
<p>Kokeile muuttaa verkkoon tallennettua arvoa <strong>
59</strong>/App.js.</p>
<p>Tallennettu arvo on:
{this.state.storageValue}</p>
<p>Lähetetty sopimusosoite:
{this.state.address}</p>
</div>
<div>
<input type="number" onChange=
{this.changeValueHandle}/>
<button onClick={this.setHandle}>set</button>
15/16
</div>
</div>
</main>
</div>
);
}
}
vientioletussovellus
Lisäsin sopimussetin menetelmän kutsun. Ja näytä sopimuksen osoite.
5. Avaa uusi konsoli ja käynnistä npm, käynnistä
6. Avaa http://lcoalhost:3000 selaimessasi nähdäksesi sopimuksen tulokset.
7. Aseta sopimuksen tallennetun datan arvo set- ja syöttölaatikoiden kautta.
8. Osallistu trufle developmentiin
//将xxx替换为address
SimpleStorage.at('xxxx').then(res => {return
res.get()})
BigNUmber-tyypin palautusarvo saadaan, ja c-taulukon arvo asetetaan
stored Data.
Käytä selainlisäosaa Metamask vuorovaikutukseen lohkoketjun kanssa
Viite http://truffleframework.com/tutorials/pet-shop
Osallistujat lähettävät asiakirjoja
Kilpailu määrittelee Trufflen käytön älysopimusten kehittämiseen, ja Truffle-versio v4.1.5 vastaa solcjs-versiota
v0.4.21. Kehittäjien tulee toimittaa Truffle-projektin zip-paketti ja siihen liittyvät projektin johdantodokumentit, jotka sisältävät vähintään
Seuraavat:
16/16
1. Truffle Project Basic File Structure: Build Contracts Migrations Test
package.json truffle.js truffle-config.js README.md // Insinööridokumentaation kuvaus
Ei vaadita node_modules
2. Tarve toimittaa PPT- tai PDF-selitys koko projektin tuotteesta, mukaan lukien tuotteen taustaesittely, tuotteen merkitys,
Sovelluksen latausosoite (valinnainen), tuotteen käyttöprosessin esittely.
Seuraavat kolmannen osapuolen kehittäjät voivat toteuttaa sopimussovelluksia ja ketjutaskuja tulevan ThunderChain-ohjeistuksen mukaisesti
Vuorovaikutus.
Dokumentaatio ja työkalut
kiinteyys-API
Tryffelidokumentaatio
Ganache tarjoaa graafisen käyttöliittymän natiivilohkoketjuympäristölle
Zeppelin-Solidty on sitoutunut turvalliseen ja standardoituun sopimuskehykseen
MetaMask tarjoaa selainlaajennuksia selaimille, joilla on lohkoketjuympäristö RPC-yhteyksien kautta
web3.js Ethereum-kapseloitu JS lohkoketjun kanssa vuorovaikutukseen
Lopuksi pdf-dokumentin lataus:

Dev_Guide_zh.pdf (373.55 KB, Latausten määrä: 6)
 Vuokraisäntä| Julkaistu 3.5.2018 16.01.58 |
Julkaistu 8.5.2018 14.25.10 |
Oppinut, kiitos
Vastuuvapauslauseke:
Kaikki Code Farmer Networkin julkaisemat ohjelmistot, ohjelmamateriaalit tai artikkelit ovat tarkoitettu vain oppimis- ja tutkimustarkoituksiin; Yllä mainittua sisältöä ei saa käyttää kaupallisiin tai laittomiin tarkoituksiin, muuten käyttäjät joutuvat kantamaan kaikki seuraukset. Tämän sivuston tiedot ovat peräisin internetistä, eikä tekijänoikeuskiistat liity tähän sivustoon. Sinun tulee poistaa yllä oleva sisältö kokonaan tietokoneeltasi 24 tunnin kuluessa lataamisesta. Jos pidät ohjelmasta, tue aitoa ohjelmistoa, osta rekisteröityminen ja hanki parempia aitoja palveluita. Jos rikkomuksia ilmenee, ota meihin yhteyttä sähköpostitse.

Mail To:help@itsvse.com