Tämä artikkeli ei käsittele kryptovaluuttaa tai hajautettua rahoitusta. Sen sijaan tutkimme julkisia EVM-lohkoketjuja ja sitä, miten niitä voidaan käyttää seuraavassa projektissasi erityistarpeidesi ja tavoitteidesi mukaan. Sukellaan etuihin, haittoihin ja käytännön esimerkkeihin käyttämällä 0xweb -kirjastoa, jonka parissa olen työstänyt.
Se on jo käynnissä. Yksinkertaisesti määritä tietomallisi sopimukseksi ja ota se käyttöön.
Kun tietosi on ladattu, ne ovat käytettävissä niin kauan kuin lohkoketju toimii. Voin olettaa, että se on paljon pidempi kuin muu hosting-tilauksesi.
Luku- ja kirjoitusprosessien erottaminen lohkoketjussa takaa 100 %:n käytettävyyden lukutoiminnoille, erityisesti kun käytetään useita RPC-tarjoajia redundanssiin.
Lohkoketjut tarjoavat luonnostaan korkeamman suojaustason kuin perinteiset isännöintiratkaisut. Tietojen hyväksikäyttö on mahdollista vain, jos tietomallisi logiikassa on haavoittuvuuksia.
Ellei niitä ole salattu, tietosi pysyvät avoimina, kaikkien saatavilla ja tarkistettavissa, mikä edistää läpinäkyvyyttä.
Verkkotunnusten nimet ovat tarpeettomia tämän tyyppisissä taustajärjestelmissä. Sen sijaan voidaan käyttää luetteloa hajautetuista solmutoimittajista, jolloin asiakaskirjastot voivat valita tehokkaimman vaihtoehdon loppukäyttäjille.
Yllä olevien ominaisuuksien ansiosta lohkoketjupohjaiset taustajärjestelmät luovat luonnostaan käyttäjien luottamusta varmistamalla tietoturvan ja 24/7 saatavuuden, vaikka projektin ylläpito ja kehitys pysähtyvät.
Voit integroida muita lohkoketjuun tallennettuja tietomalleja, tai muut projektit voivat perustua tietomalliisi.
Käyttäjät voivat hyödyntää lukuisia kolmannen osapuolen projekteja toimintojen valvontaan tai automatisointiin, mikä laajentaa merkittävästi tietomallisi mahdollisuuksia.
Tietoihin pääsee käsiksi mistä tahansa menneisyydestä.
Lataa historiallisia mukautettuja tapahtumia tai käytä WebSocketsia kuunnellaksesi reaaliaikaisia saapuvia tapahtumia, mikä mahdollistaa dynaamisten sovellusten vastaukset.
"Lompakko"-konseptin avulla käyttäjät voivat todentaa itsensä allekirjoittamalla viestit, mikä mahdollistaa saumattoman ja hajautetun käyttäjän tunnistamisen.
Käyttäjät voivat muokata tai laajentaa tallennustilasi tietoja määrittämiesi käyttöoikeuksien perusteella. Tärkeää on, että käyttäjät vastaavat näiden muutosten kustannuksista itse. Valitsemalla edullisen lohkoketjun, nämä maksut voivat jäädä vähäisiksi, usein vain muutamaan senttiin tapahtumaa kohden.
Vaikka se noudattaa todellista pay-as-you-go -mallia, maksat vain tallentamistasi SLOTeista. Jokaisessa SLOTissa on 32 tavua, uusien tietojen kirjoittaminen maksaa 20 000 GASia tai tietojen päivittäminen 5 000 GASia. Otetaan esimerkkinä Polygon, jossa on 30 Gwei GAS-hinta ja 0,60 dollarin POL-hinta.
20000GAS × 30gwei = 0,008 POL × 0,60 $ = 0,00032 dollaria
Tämä on paljon, joten "Floppy Disk" -emoji edustaa tallennusmäärää parhaalla tavalla, mikä tarkoittaa, että se soveltuu parhaiten pienemmille tietojoukoille, jos maksat itse. Ainutlaatuisena etuna on kuitenkin se, että käyttäjät voivat vastata omien varastointiensa ja toimintojensa kustannuksista, mitä ei muissa teknologioissa ole. Vaikka tämä lähestymistapa saattaa estää sovelluksesi massiivisen käyttöönoton, se on laajalti hyväksytty blockchain-yhteisössä.
Blockchain-tietomallit tukevat toimintoja vuorovaikutuksessa tietojen kanssa, mutta niiden laskentaominaisuuksilla on rajoituksia. Nämä rajoitukset riippuvat lukutoimintoihin käyttämistäsi RPC-solmuista ja kirjoitustoiminnoille (tapahtumille) määrätyistä tiukoista GAS-rajoituksista. Vaikka perustoiminnot, silmukat ja syvemmät puhelupinot ovat tyypillisesti hallittavissa, lohkoketju ei sovellu raskaaseen laskennalliseen työmäärään.
Kun otetaan huomioon tyypillisesti käytetyt suhteellisen pienet tietokoot, nykyiset rajat ovat yleensä riittävät useimpiin käyttötapauksiin.
Jos olet uusi blockchain-kehityksessä, olet ehkä kuullut, että se on monimutkaista ja vaikea aloittaa. Tämä ei kuitenkaan ole totta. Blockchain-kehityksessä käytetään tuttuja käsitteitä, semantiikkaa ja syntaksia, mikä tekee oppimisesta helpompaa kuin miltä se saattaa näyttää.
https://github.com/0xweb-org/examples-backend
Luodaan tätä artikkelia varten sovellusversion hallintasopimus. Kuvittele, että sinulla on työpöytäsovellus, joka vaatii taustaohjelman uusien versioiden tarkistamiseen ja latauslinkin hakemiseen aina, kun uusi versio julkaistaan. Alla on lopullinen sopimus, joka osoittaa useimmat keskeiset käsitteet:
import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; struct Package { uint version; uint timestamp; string url; bytes32 sha256; } contract AppVersionManager is Ownable { // Events that are emitted on data updates event NewApplicationInfo(); event NewPackage(uint version, uint timestamp); // Custom error, when title for the application is empty error TitleIsEmpty(); // Some application information string public title; // @TODO: add further application related properties if required // Latest package Package public package; // Track all versions and their packages mapping (uint => Package) public packages; // List of all previous versions uint[] public versions; constructor () Ownable(msg.sender) { } function updateInfo(string calldata newTitle) external onlyOwner { if (bytes(newTitle).length == 0) { revert TitleIsEmpty(); } title = newTitle; emit NewApplicationInfo(); } function updatePackage(Package calldata newPackage) external onlyOwner { require(newPackage.version > package.version, "Newer package already published"); packages[package.version] = package; package = newPackage; versions.push(package.version); emit NewPackage(package.version, block.timestamp); } function findPackageAtTimestamp (uint timestamp) external view returns (Package memory) { if (package.timestamp <= timestamp) { return package; } // the countdown loop to find the latest package for the timestamp int i = int(versions.length); while (--i > -1) { Package memory pkg = packages[versions[uint(i)]]; if (pkg.timestamp <= timestamp) { return pkg; } } revert("No package found"); } function getPackage (uint version) external view returns (Package memory) { if (version == package.version) { return package; } return packages[version]; } }
Jokainen kehittäjä voi lukea ja ymmärtää tämän koodin vähällä vaivalla. Jos tunnet TypeScriptin, useimmat tässä esitetyt käsitteet ovat jo järkeviä. Jotta se olisi vielä selkeämpi, olen luonut vastaavan TypeScript-esimerkin: AppVersionManager.ts 🔗 .
Yksinkertaisesti sanottuna Solidityn sopimusta voidaan pitää tilallisena luokkaesiintymänä . Ominaisuuksien, menetelmien, tyyppien ja periytymisen käsitteet ovat jo hyvin tunnettuja olioohjelmoinnissa. Tässä selittävä pääkonsepti on onlyOwner
muokkaaja (samanlainen kuin TypeScriptin koristelu).
Jokainen blockchain-tili on pohjimmiltaan yksityisen ja julkisen avaimen pari. Tilin tunnus, joka tunnetaan nimellä osoite , on johdettu julkisesta avaimesta. Kun tapahtuma suoritetaan, lähettäjän osoite välitetään muodossa msg.sender
. Tätä käyttämällä voimme tallentaa osoitteesi rakentajaan (sopimuksen käyttöönoton aikana). Myöhemmin onlyOwner
-muokkaus varmistaa, että vain sinä sopimuksen omistajana voit suorittaa updateInfo
ja updatePackage
-toiminnot. Jos joku muu yrittää näitä toimia, tapahtuma peruutetaan. onlyOwner
-muuttaja on Ownable
-sopimus, joka on osa laajalti käytettyä OpenZeppelin- kirjastoa. Tämä kirjasto sisältää monia muita hyödyllisiä sopimuksia lohkoketjun kehittämisen tehostamiseksi.
Toinen tärkeä keskustelunaihe on välityspalvelinkonsepti , joka jakaa tallennuksen ja toteutuksen kahdeksi erilliseksi sopimukseksi. Solidityn sopimustoteutukset ovat muuttumattomia, eli et voi lisätä uusia toimintoja tai ominaisuuksia käyttöönoton jälkeen. Voit kiertää tämän ottamalla käyttöön välityspalvelinsopimuksen. Välityspalvelin käsittelee tallennustilaa ja sisältää vain yhden fallback
, joka delegoi kutsut toteutussopimukselle säilyttäen samalla välityspalvelimen tallennuskontekstin.
Tämä käsite saattaa kuulostaa monimutkaiselta, mutta se on samanlainen kuin se, miten this
toimii JavaScriptissä. Tässä on nopea analogia selventämään:
const foo = new Proxy({ bar: 'Lorem' }, { get (obj, prop) { return fooImplementation[prop].bind(obj) }, }); const fooImplementation = { logValue () { console.log('Bar value:', this.bar) } } foo.logValue();
Valtakirjasopimuksessa on viittaus toteutussopimukseen. Jos haluat lisätä uusia toimintoja, ota vain käyttöön uusi toteutussopimus ja päivitä välityspalvelin viittaamaan tähän uuteen sopimukseen, joka välittää toimintokutsut päivitettyyn esiintymään. Se on suoraviivainen prosessi, mutta siinä on harkittava reunatapaus: rakentajat.
Toteutussopimusta ottaessaan käyttöön sen rakentaja toimii itse toteutussopimuksen tallennustilassa. Tämä tarkoittaa, että asettajat, kuten title = "Hello World"
eivät muuta välityspalvelimen tallennustilaa. Tämän ratkaisemiseksi käytämme alustusfunktion käsitettä:
initialize
.initialize
kutsumisen välityspalvelinsopimuksen yhteydessä.
Tämän seurauksena esimerkiksi title
päivittäminen päivittää sen oikein välityspalvelimen tallennustilassa.
Tässä on AppVersionManagerin päivitetty toteutusversio: AppVersionManagerUpgradeable.sol .
Välityssopimus itsessään on varsin yleinen ja toteutuksesta riippumaton. Useita tunnettuja välityspalvelinstandardeja on saatavilla OpenZeppelin-kirjastossa.
Kun tiedät nämä käsitteet ja yllä olevat esimerkit, olet valmis kehittämään älykkäitä sopimuksia liiketoimintaasi varten.
Ensin meidän on valittava lohkoketju, johon haluamme ottaa käyttöön sopimuksemme. Tätä esimerkkiä varten olen valinnut monikulmion. Se tarjoaa alhaiset transaktiokustannukset, on ollut olemassa jo pitkään ja on toiminut jatkuvasti hyvin. Sen vakaa ja tehokas infrastruktuuri yhdistettynä 0,9 miljardin dollarin kokonaisarvolukitukseen (TVL) tekee siitä luotettavan valinnan. Sopimustesi käyttöönotto julkisissa lohkoketjuissa tarkoittaa rinnakkaiseloa rahoituslaitosten kanssa. TVL-mittari heijastaa näiden laitosten luottamusta lohkoketjun luotettavuuteen.
Lisäksi, jos olosuhteet muuttuvat, voit aina siirtää sopimuksen toiseen lohkoketjuun tulevaisuudessa.
Demoprojekti toimii myös CI-testivarastona, joten kaikki komennot löytyvät täältä: https://github.com/0xweb-org/examples-backend/blob/master/deploy-cli.sh
# Install 0xweb library from NPM into the prject folder npm i 0xweb # Install required dependencies to compile/deploy *.sol files npx 0xweb init --hardhat --openzeppelin # Create or import the account. Private key will be encrypted with pin AND machine key. npx 0xweb accounts new --name foo --pin test --login # Save the private key securly and ensure the account has some POL tokens # Deploy. The foo account is selected as default. npx 0xweb deploy ./contracts/AppVersionManager.sol --chain polygon --pin test # Set title npx 0xweb c write AppVersionManager updateInfo --newTitle MySuperApp --pin test # Set latest package information npx 0xweb c write AppVersionManager updatePackage --arg0 'load(./data/package.json)' --pin test
Olet ottanut sopimuksen käyttöön ja päivittänyt tiedot muutamalla komennolla. Siinä kaikki taustajärjestelmälle – se on nyt toiminnassa "ikuisesti" ilman, että sinun tarvitsee tehdä lisätoimia. Tämän käyttöönoton kustannukset kaasun hinnalla 70 gwei ja POL-hinnalla 0,51 dollaria olisivat:
| KAASU | POL | $ |
---|---|---|---|
Ota käyttöön | 850352 | 0,059 | 0,03 |
Tallenna otsikko | 47517 | 0,0033 | 0,001 |
Tallenna pakettitiedot | 169549 | 0,0118 | 0,006 |
Kokonais | | | 0,037 |
Käytät vain 4 senttiä hajautetun , turvallisen ja pitkäkestoisen palvelun luomiseen ilman huoltoa .
Tarvitset RPC-solmupalveluntarjoajia tehdäksesi kyselyn sopimustiedoistasi. Kymmenet ilmaiset palveluntarjoajat ovat saatavilla osoitteessa https://chainlist.org . Voit valita useita palveluntarjoajia, ja hyvä Web3-kirjasto voi hyödyntää round-robin-strategiaa ajon aikana valitakseen tehokkaimman loppukäyttäjillesi. 0xwebin avulla luodut TypeScript- tai JavaScript-luokat eivät vain valitse parhaita päätepisteitä, vaan myös poistavat kaiken lohkoketjuviestinnän. Asiakkaat sisältävät korkeatasoisia tiedonhakumenetelmiä, jotka tekevät prosessista saumattoman ja tehokkaan.
# The deploy command also generates the class, but manual install is also possible npx 0xweb i 0x<address> --name AppVersionManager --chain polygon
import { AppVersionManager } from './0xc/polygon/AppVersionManager/AppVersionManager' const manager = new AppVersionManager(); console.log(`Title`, await manager.title()); console.log(`Package`, await manager.package());
Muille ohjelmointikielille on saatavilla lukuisia kirjastoja, jotka yksinkertaistavat lohkoketjun kyselyä. Käyttöönoton jälkeen sinulla on sopimusosoite ja ABI (käyttöliittymä).
Vaihtoehtoisesti voit käynnistää väliohjelmistopalvelimen sopimustietojen kyselyä varten 0xwebin avulla.
npx 0xweb server start --port 3000 curl http://localhost:3000/api/c/read/AppVersionManager/package?chain=polygon
Yksi etu on, että sinun ei tarvitse sisällyttää kirjastoja sovellukseesi – raaka HTTP-pyynnöt. Tämä lähestymistapa edellyttää kuitenkin ylimääräistä palvelinta, jota sinun on hallittava. Usein on parempi tehdä kysely lohkoketjusta suoraan käyttämällä 0xwebin luomia luokkia tai muita saatavilla olevia lohkoketjukirjastoja.
Tämä artikkeli esitteli, kuinka lohkoketjut voivat olla sekä yksinkertaisia että tehokkaita, tarjoten ainutlaatuisia etuja perinteisiin isännöintiratkaisuihin verrattuna.
Seuraavassa artikkelissa aion tutkia hajautettuja BLOB-tallennusverkkoja, kuten Greenfield ja Arweave, ja korostaa niiden ominaisuuksia ja etuja.
Jos sinulla on ehdotuksia tai ideoita lisäominaisuuksista, jotka voidaan sisällyttää 0xweb-kirjastoon, voit jakaa ne kommenteissa tai ottaa yhteyttä suoraan osoitteeseen [email protected] .