Întreaga istorie a omeniri este o eliberare continuă de lanțuri și crearea uneori a unor lanțuri și mai puternice. (Autor anonim)
Analizând numeroasele proiecte blockchain (Bitshares, Hyperledger, Exonum, Ethereum, Bitcoin etc.), îmi dau seama că, din punct de vedere tehnic, toate sunt construite pe aceleași principii. Blockchain-urile sunt asemănătoare caselor, care, în ciuda diversității de construcții, decorațiuni și utilizări, au un fundament, pereți, acoperiș, feronerie și uși, care sunt legate între ele în moduri specifice. Și dacă înțelegem principiile de bază ale proiectării clădirilor și cunoaștem proprietățile materialelor utilizate, putem determina destinația specifică a unei clădiri. În prezent, situația cu blockchain este că toată lumea a auzit de el, dar puțini înțeleg arhitectura și principiile de funcționare. De aceea, apare neînțelegerea cu privire la scopul și modul de utilizare a tehnologiilor blockchain.
În acest articol, vom analiza proprietățile și principiile comune tuturor blockchain-urilor. Apoi, vom privi la problemele pe care le putem rezolva cu ajutorul blockchain-ului și, pentru consolidarea materialului, vom construi un mic dar adevărat blockchain pe propriul nostru teren virtual!
Așadar, să ne amintim ce probleme a rezolvat inițial blockchain-ul.
Sunt sigur că mulți vor menționa baza de date distribuită, descentralizată, publică și imuabilă. Dar de ce era nevoie de toate acestea?
Prefer să încep studierea oricărei tehnologii citind standardele, deoarece pe acestea se bazează toate articolele și cărțile pe tema studiată. Dar standardele blockchain-ului sunt în prezent inexistente, în cadrul ISO au fost create doar pentru a le dezvolta. În prezent, fiecare proiect blockchain public are documentul său white paper, care, în esență, este un caiet de sarcini tehnic. Primul proiect blockchain cunoscut public este rețeaua Bitcoin. Accesăm site-ul oficial al rețelei și de unde a început totul.
Sarcina blockchain-ului
Așadar, sarcina pe care a rezolvat-o blockchain-ul în rețeaua sa pionier Bitcoin este transferul de proprietate asupra activelor digitale (assets) într-un mediu nesigur, fără intermediari. De exemplu, într-o rețea Bitcoin, activul digital este monedele digitale bitcoin. Și toate soluțiile tehnice Bitcoin și ale altor blockchain-uri se reduc la rezolvarea acestei sarcini.
Problemele pe care le rezolvă blockchain-ul
Să presupunem că o anumită organizație financiară afirmă că a construit o rețea la nivel mondial, care permite transferarea de bani oricărei persoane. Vei avea încredere în ea? Dacă această organizație este Visa sau MasterCard, probabil că vei avea încredere; însă, dacă, de exemplu, ar fi AnonymousWorldMoney, probabil că nu. De ce? Pentru că știm foarte bine cum sunt create sistemele distribuite de companii private, cu ce scopuri și la ce pot conduce. Să analizăm mai în detaliu problemele acestor sisteme și cum pot fi acestea soluționate cu ajutorul tehnologiilor blockchain.
Să presupunem că în AnonymousWorldMoney sunt servere cu baze de date, și e bine dacă există mai multe în diferite centre de date. Când un expeditor transferă bani, se înregistrează o tranzacție care este replicată pe toate serverele, iar banii ajung la destinatar.

Într-o lume ideală, acest sistem funcționează perfect; în realitate, apar următoarele probleme:
- Problema identificării participanților de o parte și necesitatea anonimității tranzacțiilor de cealaltă parte. Adică, banii trebuie să fie transferați unui anumit destinatar și astfel încât nimeni să nu știe despre această tranzacție, în afară de participanții la afacere. Băncile au numere de cont și carduri bancare, legate de o persoană fizică sau juridică specifică, iar secretul bancar protejează informațiile despre tranzacții. Dar cine garantează că AnonymousWorldMoney nu folosește datele personale și informațiile despre tranzacții în propriile scopuri?
- Cum să ne asigurăm că destinatarul a primit exact suma pe care a transferat-o? Să zicem că expeditorul a transferat $100, iar destinatarul a primit $10. Expeditorul merge la biroul AnonymousWorldMoney cu chitanța sa, iar funcționarul arată versiunea sa, unde este scris că expeditorul a transferat doar $10.
- Problema unei medii fără încredere, de exemplu, fraude, numită double-spending. Un participant necinstit poate cheltui soldul său de mai multe ori, până când plata a fost replicată pe toate serverele. , desigur, nu a fost anulată, iar consistența va fi atinsă în cele din urmă, dar cineva nu va primi banii pentru serviciile sau bunurile prestate. Prin urmare, dacă nu există o încredere completă în organizația de plăți sau în participanții la tranzacții, atunci trebuie construită o rețea bazată nu pe încredere, ci pe criptografie.
- Blockchainul AnonymousWorldMoney are un număr finit de servere, care pot deveni inaccesibile din motive neintenționate sau din rău intenție.
- AnonymousWorldMoney va percepe un comision semnificativ.
- Posibilitatea de gestionare. În timpul utilizării Bitcoin, s-a constatat că oamenii nu doresc doar să trimită monede între ei, ci și să verifice diverse condiții pentru tranzacții, să programeze scenarii de funcționare, să execute automat acțiuni în funcție de condiții etc.
Cum rezolvă blockchainul aceste probleme
- Identificarea participanților se realizează printr-o pereche de chei: privată și publică, iar algoritmul de semnătură digitală identifică în mod unic expeditorul și destinatarul, păstrându-le anonimatul.
- Tranzacțiile sunt adunate în blocuri, un hash al blocului este calculat, care este înregistrat în blocul următor. Această secvență de înregistrare a hash-urilor în blocuri este ceea ce a dat numele tehnologiei blockchain și face imposibilă modificarea sau ștergerea neobservată a blocurilor sau a tranzacțiilor individuale. Astfel, dacă o tranzacție a fost inclusă în blockchain, se poate avea încredere că datele sale vor rămâne neschimbate.
- Frauda de tip double-spending este prevenită prin atingerea consensului în rețea, asupra căror date să fie considerate corecte și care să fie respinse. În rețeaua Bitcoin, consensul se atinge prin dovada muncii PoW (Proof-of-Work).
- Reliabilitatea funcționării rețelei este asigurată prin faptul că blockchainul este public, unde fiecare participant poate rula propriul nod, obține o copie completă a blockchainului și, mai mult, poate începe singur să verifice corectitudinea tranzacțiilor. Este de remarcat că blockchainurile moderne permit construirea nu doar de blockchainuri publice (deschise), ci și de blockchainuri private (închise), precum și utilizarea de scheme combinate.
- Nu se va scăpa complet de comision în blockchain, deoarece trebuie plătit personalului care susține rețeaua, dar în blockchain necesitatea comisionului este argumentată atât de convingător, încât nu mai rămân îndoieli în privința necesității sale.
- Blockchainurile moderne au capacitatea de a implementa logica de afaceri, care în blockchain este numită Smart Contracts. Logica contractelor inteligente este implementată în diferite limbaje de programare de nivel înalt.
Să analizăm aceste soluții în detaliu.
Arhitectura blockchainului
Componentele blockchainului
Fiecare participant poate lansa propriul său nod cu o copie completă a blockchain-ului (full node). Nodurile complete, care pot înregistra tranzacții în blockchain, se numesc noduri de consens (witness) sau mineri (miner). Nodurile complete, care doar verifică corectitudinea tranzacțiilor se numesc noduri de audit (audit). Clienții ușori (light clients) nu păstrează copii complete ale blockchain-ului, ci interacționează cu rețeaua folosind noduri complete.
Majoritatea utilizatorilor pentru a efectua tranzacții folosesc anume clienți ușori sau portofele web. Toate nodurile sunt legate între ele. Cu un astfel de set de elemente, arhitectura rețelei devine mai rezistentă:

Ciclul de viață al tranzacției
Să ne uităm la ciclul de viață al unei tranzacții și să îl analizăm pe părți:

Tehnologiile blockchain
Să ne concentrăm mai mult asupra soluțiilor tehnice și relațiilor dintre ele.
Identificare
Fiecare tranzacție blockchain trebuie să fie semnată cu o semnătură digitală. Prin urmare, pentru a efectua o tranzacție, fiecare participant trebuie să aibă o pereche de chei: privată / publică. Uneori, perechea de chei se numește portofel (wallet), deoarece cheile sunt legate în mod unic de o adresă digitală unică și de soldul participantului. În realitate, cheile și adresele sunt pur și simplu șiruri de cifre în diferite sisteme de numerotare. Exemple de chei și adresă de portofel:
Cheia privată: 0a78194a8a893b8baac7c09b6a4a4b4b161b2f80a126cbb79bde231a4567420f
Cheia publică: 0579b478952214d7cddac32ac9dc522c821a4489bc10aac3a81b9d1cd7a92e57ba
Adresa: 0x3814JnJpGnt5tB2GD1qfKP709W3KbRdfb27VPentru a crea o semnătură digitală în blockchain-uri se utilizează un algoritm bazat pe curbe eliptice: Algoritmul de Semnătură Digitală cu Curve Eliptice (ECDSA). Pentru funcționarea acestuia, cheia privată (un număr de 256 biți) este, de obicei, generată aleatoriu. Numărul de variații ale cheilor este 2 la puterea 256, așadar se poate vorbi despre imposibilitatea practică de a obține aceleași valori pentru cheile private.
Mai departe, cheia publică este obținută din cea privată prin înmulțirea valorii sale cu coordonatele unui punct aflat pe curbă eliptică, rezultând coordonatele unui nou punct de pe aceeași curbă. Această acțiune garantează obținerea unei perechi de chei potrivite pentru semnăturile digitale ale tranzacțiilor. Iar în final, adresa portofelului este calculată în mod unic din cheia publică.
Există o mulțime de articole cu detalii despre criptografia folosită în blockchain, de exemplu:
Cheia privată trebuie să fie strict secretă și să fie păstrată în siguranță. Cheia publică este cunoscută de toată lumea. În cazul pierderii cheii private, accesul la activ (monede) nu poate fi recuperat și banii vor fi pierduți pentru totdeauna. De aceea, problema stocării sigure a cheilor private este extrem de importantă, deoarece aceasta nu este o bancă, unde se poate merge întotdeauna cu un act de identitate pentru a recupera contul. Există întreaga industrie dedicată producției, așa-numitelor, portofele criptografice reci, asemănătoare cu stick-urile USB:

sau se pot utiliza metode mai fiabile, cum ar fi gravarea valorii cheii private pe tokenuri:

Tranzacții
Mai multe detalii despre structura tranzacției pot fi găsite în articolul . Este important să înțelegem că fiecare tranzacție are cel puțin următoarele date:
De la: 0x48C89c341C5960Ca2Bf3732D6D8a0F4f89Cc4368 - adresa digitală a expeditorului
Către: 0x367adb7894334678b90aFe7882a5b06f7fbc783a - adresa digitală a destinatarului
Valoare: 0.0001 - suma tranzacției
Hash-ul tranzacției: 0x617ede331e8a99f46a363b32b239542bb4006e4fa9a2727a6636ffe3eb095cef - hash-ul tranzacțieiApoi, tranzacția este semnată cu cheia privată și trimisă (vezi detaliile despre funcționarea protocolului ) tuturor nodurilor din blockchain, care verifică tranzacțiile pentru validitate. Algoritmul de verificare a tranzacției nu este trivial și include .
Blocuri de tranzacții
După verificarea validității tranzacțiilor, nodurile formează din acestea blocuri. Pe lângă tranzacții, în bloc se scrie hash-ul blocului anterior, un număr (counter Nonce), iar hash-ul blocului curent se calculează folosind algoritmul SHA-256. Hash-ul trebuie să îndeplinească condiții de dificultate stabilite. De exemplu, în rețeaua Bitcoin, dificultatea hash-ului se schimbă automat la fiecare 2 săptămâni în funcție de puterea rețelei, astfel încât un bloc să fie generat aproximativ la fiecare 10 minute. Dificultatea este stabilită de următoarea condiție: hash-ul găsit trebuie să fie mai mic decât un număr prestabilit. Dacă această condiție nu este îndeplinită, atunci se adaugă 1 la Nonce și se reia procesul de calculare a hash-ului. Pentru găsirea hash-ului se folosește câmpul Nonce, deoarece acesta este singurul set de date din bloc care poate fi modificat, iar celelalte trebuie să rămână nemodificate. Hash-ul corect trebuie să aibă un anumit număr de zerouri la început, de exemplu, unul dintre hash-urile reale:
000000000000000000000bf03212e7dd1176f52f816fa395fc9b93c44bc11f91Găsirea cu succes a hash-ului este dovada muncii efectuate (Proof-of-Work, PoW) pentru rețelele Bitcoin sau Ethereum. Procesul de găsire a hash-urilor se numește mining, asemănător cu extragerea aurului. Numele definește destul de bine esența procesului, deoarece se realizează o simplă generare a variantelor, iar dacă cineva găsește un hash potrivit, atunci acesta este cu adevărat norocul. E ca și cum ai găsi o veritabilă bucată de aur în tone de rocă sterilă. Recompensa pentru un bloc este acum de 12.5 BTC, iar dacă multiplici cu cursul actual al bitcoin-ului de 3900$, obții mai mult de un kilogram de aur pur. Există un motiv întemeiat pentru a lupta pentru asta!
După găsirea cu succes a hash-ului, blocul și hash-ul găsit sunt înregistrate în blockchain în următorul bloc. Mai multe detalii despre structura blocurilor pot fi văzute în articol , iar mai jos voi prezenta un schema simplificată:

Blockchain-ul începe cu un bloc care nu are încă hash-ul blocului anterior. Acest tip de bloc în blockchain este unic și are denumirea proprie de Genesis block. Celelalte blocuri au aceeași structură și se deosebesc doar prin numărul de tranzacții. Tranzacțiile reale și blocurile care se creează în prezent în Bitcoin sau Ethereum pot fi vizualizate în .
Dimensiunea blocurilor în Bitcoin este limitată la 1 MB și, având un volum minim de informații într-o tranzacție de aproximativ 200 de octeți, în bloc pot fi maximum aproximativ 6000 de tranzacții. De aici, de altfel, provine și performanța Bitcoin, de care toată lumea râde: un bloc este generat aproximativ o dată la 10 minute * 60 sec = 600 sec, ceea ce oferă o performanță formală de aproximativ 10 TPS. Deși, în realitate, aceasta nu este o performanță, ci un algoritm de lucru realizat intenționat. În Ethereum, pentru a concura, pur și simplu au redus timpul de generație a blocului la 15 secunde, iar performanța a crescut formal. Prin urmare, în blockchain-urile care folosesc PoW ca și consens, compararea performanței este de fapt fără sens, deoarece aceasta depinde direct de dificultatea calculării cache-ului, care poate fi stabilită la orice valoare.
Forks
Ce se întâmplă dacă, de exemplu, mai multe noduri găsesc hash-uri care îndeplinesc condițiile de dificultate, dar diferă ca valoare (cu alte cuvinte, ajung la consensuri diferite) și scriu blocuri în blockchain? Să vedem cum se protejează blockchain-ul în această situație. În acest caz, se produce așa-numitul fork ('coroană') și blockchain-ul are două versiuni ale lanțului:

Ce se întâmplă apoi? Apoi, o parte a rețelei începe să lucreze la blocul N+2 dintr-unul dintre lanțuri, iar o parte din celălalt:

Unul dintre aceste blocuri va fi găsit mai devreme și trimis în blockchain, iar atunci, conform regulilor, blockchain-ul va trebui să comute pe lanțul mai lung și să anuleze toate tranzacțiile din blocul alternativ:

În acest caz, poate apărea o situație în care tranzacția unui participant se afla doar într-unul dintre blocurile fork-ului, care a fost anulat. Prin urmare, pentru a fi sigur că tranzacția dorită s-a înregistrat în blockchain, există o recomandare generală — înainte de a avea încredere în tranzacție, trebuie să aștepți până când următoarele câteva blocuri sunt adăugate în blockchain. Recomandările privind câte blocuri să aștepți pentru diferite blockchain-uri variază. De exemplu, pentru rețeaua Bitcoin, minimul este de 2 blocuri, iar maximul 6.
Aceeași situație cu fork-ul blocurilor se va observa și în cazul așa-numitei atacuri de 51% — atunci când un grup de mineri încearcă să dezvolte un lanț alternativ de blocuri, căutând să anuleze lanțul cu tranzacții frauduloase. Deși în prezent, în loc de fraudă, este mai profitabil să își folosească resursele pentru mineritul onest.
Consens
Pentru a înregistra un bloc în blockchain, rețeaua trebuie să ajungă la consens. Să ne amintim de sarcina de a atinge consensul în rețelele de calculatoare de comunicații. Problema este formulată ca problema generalilor bizantini BFT (). Trecând cu vederea descrierea pitorească a problemelor armatei bizantine, problema poate fi formulată astfel: cum pot nodurile rețelei să ajungă la un rezultat comun, dacă o parte din nodurile rețelei pot distorsiona deliberat informațiile. Algoritmii existenți care rezolvă problema BFT arată că rețeaua poate funcționa corect dacă escrocii sunt mai puțin de 1/3. De ce nu s-a aplicat consensul BFT în rețeaua Bitcoin? De ce a fost necesară utilizarea PoW? Există mai multe motive:
- BFT funcționează bine cu un set fix mic de noduri, în timp ce în blockchain-ul public, numărul de noduri este imprevizibil și, mai mult, nodurile pot fi activate și dezactivate aleatoriu.
- Este necesar să se motiveze oamenii să pornească noduri de blockchain. Pentru aceasta, oamenii trebuie să primească recompense. În BFT, nu există un temei formal pentru recompensă, dar în PoW, motivul recompensei este intuitiv: pentru electricitatea consumată de procesor în timpul găsirii hash-ului blocului.
Pe lângă PoW, există mai multe consensuri utilizate în blockchain-urile moderne, de exemplu:
- PoS (Proof-of-Stake) — în blockchain-ul
- DPoS (Delegated Proof-of-Stake) — în blockchain-ul
- Modificările BFT: SBFT (Simplified BFT) și PBFT (Practical BFT), de exemplu, în blockchain-ul
Să ne oprim puțin asupra consensului PoS, deoarece PoS și variantele sale au câștigat cea mai mare popularitate în blockchain-urile private. De ce în private? Pe de o parte, caracteristicile PoS sunt superioare comparativ cu PoW, deoarece pentru a atinge consensul sunt necesare resurse de calcul mai reduse, ceea ce înseamnă că viteza de înregistrare a datelor în blockchain crește. Dar pe de altă parte, PoS oferă mai multe oportunități pentru fraudă, astfel că toți participanții la blockchain trebuie să fie cunoscuți pentru a neutraliza acest lucru.
Consensul PoS se bazează pe alegerea unui nod care poate înregistra blocuri cu tranzacții în blockchain în funcție de suma de fonduri din cont, mai exact, nu din contul propriu, ci din garanție. Cu cât ai mai multe fonduri în garanție, cu atât mai mari sunt șansele ca rețeaua să aleagă nodul tău pentru înregistrarea blocului. Garanția nu se restituie dacă blocul se dovedește a fi invalid. Astfel, protecția împotriva fraudei este implementată. Există următoarele variații de PoS:
- Consensul Delegated PoS (DPoS) separă participanții în „votanti” și „validatori”. Deținătorii de monede (participanți votanți) își delegă dreptul de a verifica și înregistra tranzacțiile în blockchain altor participanți. Astfel, validatori efectuează toată munca de calcul și primesc o recompensă pentru aceasta, iar prezența participanților votanți garantează onestitatea validatorilor, deoarece aceștia pot fi schimbați în orice moment.
- Consensul LPoS (Leased Proof-of-Stake) permite închirierea fondurilor către alte noduri, oferindu-le mai multe șanse de a verifica blocurile. Astfel, se poate obține un comision pentru tranzacții fără a participa direct la verificarea acestora și la mineritul blocurilor.
Există și alte consense, care deocamdată nu au avut o răspândire largă; aici le voi enumera pur și simplu pentru informație, iar o revizuire a algoritmilor de consens poate fi găsită, de exemplu, în articolul: .
- PoET (Proof-of-Elapsed Time)
- PoC (Proof-of-Capacity)
- PoB (Proof-of-Burn)
- PoWeight (Proof-of-Weight)
- PoA (Proof-of-Activity) — PoW + PoS
- PoI (Proof-of-Importance)
Fiabilitate și modele de desfășurare a blockchain-urilor
Blockchain public
Durabilitate Public sau alt nume Blockchain fără permisiuni se realizează prin faptul că oricine se poate conecta și vizualiza informațiile sau chiar poate conecta propriul nod, iar încrederea se bazează pe consensul PoW.
Blockchain privat
Privat sau Blockchain privat cu permisiuni. În aceste blockchain-uri, doar un anumit grup de participanți (organizații sau persoane) are acces la informații. Aceste blockchain-uri sunt construite de organizații cu scopul de a spori beneficiile sau eficiența generală. Fiabilitatea lor este garantată de obiectivele comune ale participanților și algoritmii de consens PoS și BFT.
Consorțiu blockchain
Există Consortium sau Blockchain public cu permisiuni. Aceste blockchain-uri permit oricui să se conecteze pentru a vizualiza, dar adăugarea informațiilor sau conectarea unui nod de către un participant se poate face doar cu permisiunea altor participanți. Aceste blockchain-uri sunt construite de organizații cu scopul de a spori încrederea din partea clienților sau a consumatorilor de produse sau a societății în general. Aici, fiabilitatea se realizează de asemenea prin prezența încrederii între participanți și prin aceiași algoritmi de consens PoS și BFT.
Smart Contracts
În blockchain-urile implementate după Bitcoin, posibilitatea executării contractelor inteligente a fost adăugată, în diverse măsuri. Un contract inteligent este de fapt o tranzacție în care este inclus un cod programatic pentru executare. Contractele inteligente din rețeaua Ethereum sunt executate în EVM (Ethereum Virtual Machine). Pentru a începe executarea unui contract inteligent, acesta trebuie să fie inițiat clar de o altă tranzacție sau trebuie să se îndeplinească condițiile prealabile pentru executare. Rezultatele execuției contractului inteligent vor fi, de asemenea, înregistrate în blockchain. Obținerea de date din afara blockchain-ului este posibilă, dar extrem de limitată.
Ce logică de afaceri poate fi implementată prin intermediul unui contract inteligent? De fapt, nu este atât de mult, de exemplu, verificarea condițiilor pe baza datelor din blockchain, schimbarea proprietarilor activelor digitale în funcție de aceste condiții, stocarea datelor într-un depozit permanent din interiorul blockchain-ului. Logica este implementată într-un limbaj de programare de nivel înalt, Solidity.
Un exemplu clasic de funcționalitate realizată cu ajutorul contractelor inteligente este emisia de token-uri pentru desfășurarea ICO-urilor. De exemplu, am implementat un contract inteligent pentru emiterea a modeste 500 000 000 AlexToken. La deține
codul sursă al contractului inteligent scris în limbajul Solidity
pragma solidity ^0.4.23;
library SafeMath {
/**
* @dev Multiplies two numbers, throws on overflow.
**/
function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {
if (a == 0) {
return 0;
}
c = a * b;
assert(c / a == b);
return c;
}
/**
* @dev Integer division of two numbers, truncating the quotient.
**/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
// assert(b > 0); // Solidity automatically throws when dividing by 0
/**
* @title SafeMath
* @dev Math operations with safety checks that throw on error
*/
// uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return a / b;
}
/**
* @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
**/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
assert(b <= a);
return a - b;
}
/**
* @dev Adds two numbers, throws on overflow.
**/
function add(uint256 a, uint256 b) internal pure returns (uint256 c) {
c = a + b;
assert(c >= a);
return c;
}
}
/**
* @title Ownable
* @dev The Ownable contract has an owner address, and provides basic authorization control
* functions, this simplifies the implementation of "user permissions".
**/
contract Ownable {
address public owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev The Ownable constructor sets the original `owner` of the contract to the sender account.
**/
constructor() public {
owner = msg.sender;
}
/**
* @dev Throws if called by any account other than the owner.
**/
modifier onlyOwner() {
require(msg.sender == owner);
_;
}
/**
* @dev Allows the current owner to transfer control of the contract to a newOwner.
* @param newOwner The address to transfer ownership to.
**/
function transferOwnership(address newOwner) public onlyOwner {
require(newOwner != address(0));
emit OwnershipTransferred(owner, newOwner);
owner = newOwner;
}
}
/**
* @title ERC20Basic interface
* @dev Basic ERC20 interface
**/
contract ERC20Basic {
function totalSupply() public view returns (uint256);
function balanceOf(address who) public view returns (uint256);
function transfer(address to, uint256 value) public returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
}
/**
* @title ERC20 interface
* @dev see https://github.com/ethereum/EIPs/issues/20
**/
contract ERC20 is ERC20Basic {
function allowance(address owner, address spender) public view returns (uint256);
function transferFrom(address from, address to, uint256 value) public returns (bool);
function approve(address spender, uint256 value) public returns (bool);
event Approval(address indexed owner, address indexed spender, uint256 value);
}
/**
* @title Basic token
* @dev Basic version of StandardToken, with no allowances.
**/
contract BasicToken is ERC20Basic {
using SafeMath for uint256;
mapping(address => uint256) balances;
uint256 totalSupply_;
/**
* @dev total number of tokens in existence
**/
function totalSupply() public view returns (uint256) {
return totalSupply_;
}
/**
* @dev transfer token for a specified address
* @param _to The address to transfer to.
* @param _value The amount to be transferred.
**/
function transfer(address _to, uint256 _value) public returns (bool) {
require(_to != address(0));
require(_value <= balances[msg.sender]);
balances[msg.sender] = balances[msg.sender].sub(_value);
balances[_to] = balances[_to].add(_value);
emit Transfer(msg.sender, _to, _value);
return true;
}
/**
* @dev Gets the balance of the specified address.
* @param _owner The address to query the the balance of.
* @return An uint256 representing the amount owned by the passed address.
**/
function balanceOf(address _owner) public view returns (uint256) {
return balances[_owner];
}
}
contract StandardToken is ERC20, BasicToken {
mapping (address => mapping (address => uint256)) internal allowed;
/**
* @dev Transfer tokens from one address to another
* @param _from address The address which you want to send tokens from
* @param _to address The address which you want to transfer to
* @param _value uint256 the amount of tokens to be transferred
**/
function transferFrom(address _from, address _to, uint256 _value) public returns (bool) {
require(_to != address(0));
require(_value <= balances[_from]);
require(_value <= allowed[_from][msg.sender]);
balances[_from] = balances[_from].sub(_value);
balances[_to] = balances[_to].add(_value);
allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value);
emit Transfer(_from, _to, _value);
return true;
}
/**
* @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.
*
* Beware that changing an allowance with this method brings the risk that someone may use both the old
* and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this
* race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
* @param _spender The address which will spend the funds.
* @param _value The amount of tokens to be spent.
**/
function approve(address _spender, uint256 _value) public returns (bool) {
allowed[msg.sender][_spender] = _value;
emit Approval(msg.sender, _spender, _value);
return true;
}
/**
* @dev Function to check the amount of tokens that an owner allowed to a spender.
* @param _owner address The address which owns the funds.
* @param _spender address The address which will spend the funds.
* @return A uint256 specifying the amount of tokens still available for the spender.
**/
function allowance(address _owner, address _spender) public view returns (uint256) {
return allowed[_owner][_spender];
}
/**
* @dev Increase the amount of tokens that an owner allowed to a spender.
*
* approve should be called when allowed[_spender] == 0. To increment
* allowed value is better to use this function to avoid 2 calls (and wait until
* the first transaction is mined)
* From MonolithDAO Token.sol
* @param _spender The address which will spend the funds.
* @param _addedValue The amount of tokens to increase the allowance by.
**/
function increaseApproval(address _spender, uint _addedValue) public returns (bool) {
allowed[msg.sender][_spender] = allowed[msg.sender][_spender].add(_addedValue);
emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
return true;
}
/**
* @dev Decrease the amount of tokens that an owner allowed to a spender.
*
* approve should be called when allowed[_spender] == 0. To decrement
* allowed value is better to use this function to avoid 2 calls (and wait until
* the first transaction is mined)
* From MonolithDAO Token.sol
* @param _spender The address which will spend the funds.
* @param _subtractedValue The amount of tokens to decrease the allowance by.
**/
function decreaseApproval(address _spender, uint _subtractedValue) public returns (bool) {
uint oldValue = allowed[msg.sender][_spender];
if (_subtractedValue > oldValue) {
allowed[msg.sender][_spender] = 0;
} else {
allowed[msg.sender][_spender] = oldValue.sub(_subtractedValue);
}
emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
return true;
}
}
/**
* @title Configurable
* @dev Configurable varriables of the contract
**/
contract Configurable {
uint256 public constant cap = 1000000000*10**18;
uint256 public constant basePrice = 100*10**18; // tokens per 1 ether
uint256 public tokensSold = 0;
uint256 public constant tokenReserve = 500000000*10**18;
uint256 public remainingTokens = 0;
}
/**
* @title CrowdsaleToken
* @dev Contract to preform crowd sale with token
**/
contract CrowdsaleToken is StandardToken, Configurable, Ownable {
/**
* @dev enum of current crowd sale state
**/
enum Stages {
none,
icoStart,
icoEnd
}
Stages currentStage;
/**
* @dev constructor of CrowdsaleToken
**/
constructor() public {
currentStage = Stages.none;
balances[owner] = balances[owner].add(tokenReserve);
totalSupply_ = totalSupply_.add(tokenReserve);
remainingTokens = cap;
emit Transfer(address(this), owner, tokenReserve);
}
/**
* @dev fallback function to send ether to for Crowd sale
**/
function () public payable {
require(currentStage == Stages.icoStart);
require(msg.value > 0);
require(remainingTokens > 0);
uint256 weiAmount = msg.value; // Calculate tokens to sell
uint256 tokens = weiAmount.mul(basePrice).div(1 ether);
uint256 returnWei = 0;
if(tokensSold.add(tokens) > cap){
uint256 newTokens = cap.sub(tokensSold);
uint256 newWei = newTokens.div(basePrice).mul(1 ether);
returnWei = weiAmount.sub(newWei);
weiAmount = newWei;
tokens = newTokens;
}
tokensSold = tokensSold.add(tokens); // Increment raised amount
remainingTokens = cap.sub(tokensSold);
if(returnWei > 0){
msg.sender.transfer(returnWei);
emit Transfer(address(this), msg.sender, returnWei);
}
balances[msg.sender] = balances[msg.sender].add(tokens);
emit Transfer(address(this), msg.sender, tokens);
totalSupply_ = totalSupply_.add(tokens);
owner.transfer(weiAmount);// Send money to owner
}
/**
* @dev startIco starts the public ICO
**/
function startIco() public onlyOwner {
require(currentStage != Stages.icoEnd);
currentStage = Stages.icoStart;
}
/**
* @dev endIco closes down the ICO
**/
function endIco() internal {
currentStage = Stages.icoEnd;
// Transfer any remaining tokens
if(remainingTokens > 0)
balances[owner] = balances[owner].add(remainingTokens);
// transfer any remaining ETH balance in the contract to the owner
owner.transfer(address(this).balance);
}
/**
* @dev finalizeIco closes down the ICO and sets needed varriables
**/
function finalizeIco() public onlyOwner {
require(currentStage != Stages.icoEnd);
endIco();
}
}
/**
* @title LavevelToken
* @dev Contract to create the Lavevel Token
**/
contract AlexToken is CrowdsaleToken {
string public constant name = "AlexToken";
string public constant symbol = "ALT";
uint32 public constant decimals = 18;
}și reprezentarea sa binară, așa cum o vede rețeaua
60806040526000600355600060045533600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560146101000a81548160ff021916908360028111156200006f57fe5b0217905550620001036b019d971e4fe8401e74000000600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546200024a6401000000000262000b1d179091906401000000009004565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550620001986b019d971e4fe8401e740000006001546200024a6401000000000262000b1d179091906401000000009004565b6001819055506b033b2e3c9fd0803ce8000000600481905550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6b019d971e4fe8401e740000006040518082815260200191505060405180910390a362000267565b600081830190508281101515156200025e57fe5b80905092915050565b611cb880620002776000396000f300608060405260043610610112576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde03146104c7578063095ea7b31461055757806318160ddd146105bc57806323b872dd146105e7578063313ce5671461066c578063355274ea146106a3578063518ab2a8146106ce57806366188463146106f957806370a082311461075e57806389311e6f146107b55780638da5cb5b146107cc578063903a3ef61461082357806395d89b411461083a578063a9059cbb146108ca578063bf5839031461092f578063c7876ea41461095a578063cbcb317114610985578063d73dd623146109b0578063dd62ed3e14610a15578063f2fde38b14610a8c575b60008060008060006001600281111561012757fe5b600560149054906101000a900460ff16600281111561014257fe5b14151561014e57600080fd5b60003411151561015d57600080fd5b600060045411151561016e57600080fd5b3494506101a7670de0b6b3a764000061019968056bc75e2d6310000088610acf90919063ffffffff16565b610b0790919063ffffffff16565b9350600092506b033b2e3c9fd0803ce80000006101cf85600354610b1d90919063ffffffff16565b111561024c576101f66003546b033b2e3c9fd0803ce8000000610b3990919063ffffffff16565b915061022e670de0b6b3a764000061022068056bc75e2d6310000085610b0790919063ffffffff16565b610acf90919063ffffffff16565b90506102438186610b3990919063ffffffff16565b92508094508193505b61026184600354610b1d90919063ffffffff16565b6003819055506102886003546b033b2e3c9fd0803ce8000000610b3990919063ffffffff16565b6004819055506000831115610344573373ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f193505050501580156102dd573d6000803e3d6000fd5b503373ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a35b610395846000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040518082815260200191505060405180910390a361045184600154610b1d90919063ffffffff16565b600181905550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc869081150290604051600060405180830381858888f193505050501580156104bf573d6000803e3d6000fd5b505050505050005b3480156104d357600080fd5b506104dc610b52565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561051c578082015181840152602081019050610501565b50505050905090810190601f1680156105495780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561056357600080fd5b506105a2600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610b8b565b604051808215151515815260200191505060405180910390f35b3480156105c857600080fd5b506105d1610c7d565b6040518082815260200191505060405180910390f35b3480156105f357600080fd5b50610652600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610c87565b604051808215151515815260200191505060405180910390f35b34801561067857600080fd5b50610681611041565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b3480156106af57600080fd5b506106b8611046565b6040518082815260200191505060405180910390f35b3480156106da57600080fd5b506106e3611056565b6040518082815260200191505060405180910390f35b34801561070557600080fd5b50610744600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061105c565b604051808215151515815260200191505060405180910390f35b34801561076a57600080fd5b5061079f600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506112ed565b6040518082815260200191505060405180910390f35b3480156107c157600080fd5b506107ca611335565b005b3480156107d857600080fd5b506107e16113eb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561082f57600080fd5b50610838611411565b005b34801561084657600080fd5b5061084f6114ab565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561088f578082015181840152602081019050610874565b50505050905090810190601f1680156108bc5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156108d657600080fd5b50610915600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506114e4565b604051808215151515815260200191505060405180910390f35b34801561093b57600080fd5b50610944611703565b6040518082815260200191505060405180910390f35b34801561096657600080fd5b5061096f611709565b6040518082815260200191505060405180910390f35b34801561099157600080fd5b5061099a611716565b6040518082815260200191505060405180910390f35b3480156109bc57600080fd5b506109fb600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611726565b604051808215151515815260200191505060405180910390f35b348015610a2157600080fd5b50610a76600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611922565b6040518082815260200191505060405180910390f35b348015610a9857600080fd5b50610acd600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506119a9565b005b600080831415610ae25760009050610b01565b8183029050818382811515610af357fe5b04141515610afd57fe5b8090505b92915050565b60008183811515610b1457fe5b04905092915050565b60008183019050828110151515610b3057fe5b80905092915050565b6000828211151515610b4757fe5b818303905092915050565b6040805190810160405280600981526020017f416c6578546f6b656e000000000000000000000000000000000000000000000081525081565b600081600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b6000600154905090565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515610cc457600080fd5b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211151515610d1157600080fd5b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211151515610d9c57600080fd5b610ded826000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b3990919063ffffffff16565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610e80826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610f5182600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b3990919063ffffffff16565b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b601281565b6b033b2e3c9fd0803ce800000081565b60035481565b600080600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508083111561116d576000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611201565b6111808382610b3990919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a3600191505092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561139157600080fd5b60028081111561139d57fe5b600560149054906101000a900460ff1660028111156113b857fe5b141515156113c557600080fd5b6001600560146101000a81548160ff021916908360028111156113e457fe5b0217905550565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561146d57600080fd5b60028081111561147957fe5b600560149054906101000a900460ff16600281111561149457fe5b141515156114a157600080fd5b6114a9611b01565b565b6040805190810160405280600381526020017f414c54000000000000000000000000000000000000000000000000000000000081525081565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561152157600080fd5b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054821115151561156e57600080fd5b6115bf826000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b3990919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611652826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b60045481565b68056bc75e2d6310000081565b6b019d971e4fe8401e7400000081565b60006117b782600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a36001905092915050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611a0557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611a4157600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6002600560146101000a81548160ff02191690836002811115611b2057fe5b021790555060006004541115611c0a57611ba5600454600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f19350505050158015611c89573d6000803e3d6000fd5b505600a165627a7a723058205bbef016cc7699572f944871cb6f05e69915ada3a92a1d9f03a3fb434aac0c2b0029Mai multe detalii despre contractele inteligente pot fi aflate în articol: .
Concluzie
Am enumerat tehnologiile pe care sunt construite blockchain-urile moderne și cum sunt interconectate. Acum, să formulăm ce probleme pot fi rezolvate cu ajutorul blockchain-ului și ce probleme vor fi, cel mult, ineficiente. Așadar, utilizarea blockchain-ului nu este obligatorie dacă:
- Tranzacțiile au loc într-un mediu de încredere;
- Comisioanele intermediarilor nu îngreunează viața participanților;
- Participanții nu au proprietăți care pot fi reprezentate sub formă de active digitale;
- Nu există distribuție în activele digitale, adică valoarea este deținută sau furnizată doar de un singur participant.
Ce viitor așteaptă blockchain-ul? Acum putem doar specula posibilele direcții de dezvoltare a tehnologiilor blockchain:
- Blockchain-ul va deveni o tehnologie de bază la fel de obișnuită ca SQL sau NoSQL pentru a rezolva un anumit set de probleme;
- Blockchain-ul va deveni un protocol pe scară largă, asemenea HTTP pentru Internet;
- Blockchain-ul va deveni baza pentru un nou sistem financiar și politic al planetei!
În partea următoare, ne vom uita la ce blockchain-uri există acum și pentru ce sunt utilizate în diferite industrii.
Acesta este doar începutul!
Sursa: habr.com
