9 |
15 |
--------------------------------------------------------------------------------
/src/assets/images/social_flat_rounded_rects_svg/Facebook.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/app/app.routing.ts:
--------------------------------------------------------------------------------
1 | import {ModuleWithProviders} from '@angular/core';
2 | import {Routes, RouterModule} from '@angular/router';
3 |
4 | import {HomeComponent} from './home/home.component';
5 | import {AboutComponent} from './about/about.component';
6 |
7 | const appRoutes: Routes = [
8 | { path: '', component: HomeComponent },
9 | { path: 'about', component: AboutComponent }
10 | ];
11 |
12 | export const appRoutingProviders: any[] = [];
13 |
14 | export const routing: ModuleWithProviders = RouterModule.forRoot(appRoutes);
15 |
--------------------------------------------------------------------------------
/src/environments/environment.ts:
--------------------------------------------------------------------------------
1 | // This file can be replaced during build by using the `fileReplacements` array.
2 | // `ng build ---prod` replaces `environment.ts` with `environment.prod.ts`.
3 | // The list of file replacements can be found in `angular.json`.
4 |
5 | export const environment = {
6 | production: false
7 | };
8 |
9 | /*
10 | * In development mode, to ignore zone related error stack frames such as
11 | * `zone.run`, `zoneDelegate.invokeTask` for easier debugging, you can
12 | * import the following file, but please comment it out in production mode
13 | * because it will have performance impact when throw error
14 | */
15 | // import 'zone.js/dist/zone-error'; // Included with Angular CLI.
16 |
--------------------------------------------------------------------------------
/src/app/home/lesson.tokens.html:
--------------------------------------------------------------------------------
1 |
Tokens
2 |
3 |
Ya hemos visto como funcionan las blockchains distribuidas. Acerquémonos ahora un poco más a como funciona Bitcoin.
4 |
La blockchain de Bitcoin es como un libro de contabilidad, registra los movimientos de dinero, de un emisor a un receptor. En ningún momento la blockchain almacena la cantidad de dinero que tiene un usuario.
5 |
Para comprobar si se puede realizar un pago, Bitcoin mira hacia atrás en la cadena y mira cuando ha recibido dinero y cuando se lo ha gastado. No hace falta comprobar toda la cadena, con que encuentre que ha recibido una cantidad de dinero que todavía no ha gastado ya es suficiente.
En primer lugar vamos a ver algo muy utilizado en criptografía, los hashes. Un hash es una combinación de números y letras generada únicamente para un determinado conjunto de datos. Piensa en ello como si fuesen huellas dactilares del mundo digital.
4 |
Un hash por tanto permite identificar un conjunto de datos, ya que para un mismo conjunto de datos siempre tendremos el mismo hash. Sin embargo, si sabes el hash de unos datos es extremadamente complicado restaurar los datos originales.
5 |
En el siguiente ejemplo, vas a poder crear hashes con el algoritmo SHA-256. Adelante, escribe y borra datos y verás como el hash cambia, de manera totalmente radical. Sin embargo, si introduces exactamente los mismos datos tienes el mismo hash
6 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/src/app/app.module.ts:
--------------------------------------------------------------------------------
1 | import {NgModule} from '@angular/core';
2 | import {BrowserModule} from '@angular/platform-browser';
3 | import {FormsModule} from '@angular/forms';
4 | import {BrowserAnimationsModule} from "@angular/platform-browser/animations";
5 |
6 | import {AppComponent} from './app.component';
7 | import {routing, appRoutingProviders} from './app.routing';
8 | import {HomeComponent,LessonHash,LessonBlock,LessonBlockchain,LessonDistributed, LessonTokens, LessonThanks} from './home/home.component';
9 | import {AboutComponent} from './about/about.component';
10 |
11 | @NgModule({
12 | declarations: [
13 | AppComponent,
14 | HomeComponent,
15 | AboutComponent,
16 | LessonHash,
17 | LessonBlock,
18 | LessonBlockchain,
19 | LessonDistributed,
20 | LessonTokens,
21 | LessonThanks
22 | ],
23 | imports: [
24 | FormsModule,
25 | BrowserModule,
26 | BrowserAnimationsModule,
27 | routing
28 | ],
29 | providers: [appRoutingProviders],
30 | bootstrap: [AppComponent]
31 | })
32 |
33 | export class AppModule {
34 | }
35 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "blockchain-web-ng",
3 | "version": "0.0.0",
4 | "scripts": {
5 | "ng": "ng",
6 | "start": "ng serve",
7 | "build": "ng build"
8 | },
9 | "private": true,
10 | "dependencies": {
11 | "@angular/animations": "^6.1.10",
12 | "@angular/common": "^6.1.10",
13 | "@angular/compiler": "^6.1.10",
14 | "@angular/core": "^6.1.10",
15 | "@angular/forms": "^6.1.10",
16 | "@angular/http": "^6.1.10",
17 | "@angular/platform-browser": "^6.1.10",
18 | "@angular/platform-browser-dynamic": "^6.1.10",
19 | "@angular/router": "^6.1.10",
20 | "core-js": "^2.6.3",
21 | "js-sha256": "^0.9.0",
22 | "rxjs": "^6.3.3",
23 | "zone.js": "^0.8.29"
24 | },
25 | "devDependencies": {
26 | "@angular-devkit/build-angular": "^0.7.5",
27 | "@angular/cli": "^6.1.5",
28 | "@angular/compiler-cli": "^6.1.10",
29 | "@angular/language-service": "^6.1.10",
30 | "@types/node": "~8.9.4",
31 | "codelyzer": "~4.2.1",
32 | "ts-node": "~5.0.1",
33 | "tslint": "~5.9.1",
34 | "typescript": "~2.7.2"
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/src/assets/main.css:
--------------------------------------------------------------------------------
1 | body {
2 | font-family: Cambria, Georgia;
3 | }
4 |
5 | h1 {
6 | color: #369;
7 | font-family: Arial, Helvetica, sans-serif;
8 | font-size: 250%;
9 | font-weight: bold;
10 | margin-top: 30px;
11 | margin-bottom: 22px;
12 | }
13 |
14 | a {
15 | text-decoration: none;
16 | color: #337ab7;
17 | }
18 |
19 | a:hover {
20 | text-decoration: underline;
21 | }
22 |
23 | .header-container, .main-container, .footer-container {
24 | width: 700px;
25 | margin: 0 auto;
26 | }
27 |
28 | .main-container {
29 | margin-bottom: 20px;
30 | box-shadow: 0 1px 4px 0 rgba(0,0,0,0.37);
31 | }
32 |
33 | .main-container .resource, .main-container h3 {
34 | padding: 16px 23px;
35 | }
36 |
37 | .main-container h3 {
38 | margin: 0;
39 | color: #373E41;
40 | font-size: 20px;
41 | font-weight: bold;
42 | background-color: #ECEFF1;
43 | }
44 |
45 | .main-container h4 {
46 | margin: 0;
47 | font-size: 16px;
48 | font-weight: bold;
49 | line-height: 24px;
50 | }
51 |
52 | .main-container p {
53 | margin: 0;
54 | }
55 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # BlockchainWebNg
2 |
3 | This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 6.1.2.
4 |
5 | ## Development server
6 |
7 | Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The app will automatically reload if you change any of the source files.
8 |
9 | ## Code scaffolding
10 |
11 | Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`.
12 |
13 | ## Build
14 |
15 | Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. Use the `--prod` flag for a production build.
16 |
17 | ## Running unit tests
18 |
19 | Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io).
20 |
21 | ## Running end-to-end tests
22 |
23 | Run `ng e2e` to execute the end-to-end tests via [Protractor](http://www.protractortest.org/).
24 |
25 | ## Further help
26 |
27 | To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI README](https://github.com/angular/angular-cli/blob/master/README.md).
28 |
--------------------------------------------------------------------------------
/src/assets/images/social_flat_rounded_rects_svg/Pinterest.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/assets/images/social_flat_rounded_rects_svg/Twitter.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/app/home/home.component.html:
--------------------------------------------------------------------------------
1 |
2 |
Introducción
3 |
4 |
5 |
10 |
11 | Bienvenido a Aprende Blockchain. En esta página encontrarás respuestas sencillas a preguntas como:
12 |
13 |
¿Qué es un hash?
14 |
¿Qué es un bloque?
15 |
¿Se puede trampear Bitcoin
16 |
¿Por qué cuanta más gente use Bitcoin más seguro será?
17 |
18 |
Blockchain
19 |
Blockchain es la tecnología subyacente a inventos tan innovadores como Bitcoin o Ethereum.
20 |
21 |
22 |
23 |
Bitcoin
24 |
Bitcoin es una moneda virtual basada en Blockchain. Se implementa como un libro de contabilidad escrito en Blockchain. Su fama ya es mundial y es usada por millones de personas todos los días.
Los bloques son un conjunto de datos, con su correspondiente hash.
4 |
En primer lugar tenemos un número de bloque, un número nonce del que hablaremos más tarde y finalmente los datos.
5 |
Lo que hace un bloque distinto a lo que hemos visto antes es que un bloque puede ser válido o no. Un bloque es válido si su hash cumple cierta condición. En este caso, vamos a pedir que un bloque sea válido si su hash comienza por 3 ceros.
6 |
Como puedes comprobar, la probabilidad de que eso ocurra es mínima. Para ajustar el hash a la condición impuesta se usa el número nonce. En un proceso denominado minado se probarán valores de nonce hasta que el hash cumpla la condición impuesta, solo así el bloque es válido.
7 |
Observa que si cambias el valor de los datos es necesario volver a minar. En este ejemplo el minado es rápido, pero puede hacerse más lento eligiendo otras condiciones.
Blockchain, como su nombre indica, es una cadena de bloques. En una cadena de bloques, los bloques además de tener datos y nonce, poseen el hash del bloque anterior. Así se logra el encadenamiento.
4 |
Por supuesto para generar el hash de cada bloque ahora necesitamos los datos, el hash del bloque anterior y buscar el nonce adecuado.
5 |
Ahora imagina que quieres modificar un bloque. Si el bloque es el último de la cadena no hay problema, simplemente minas de nuevo y obtienes un bloque válido con su hash de 3 ceros al principio. ¿Y si quisiéras modificar un dato que no fuese el último?
6 |
Modificarías el bloque y lo minarías para obtener un hash de 3 ceros y tener un bloque válido. Sin embargo el bloque siguiente de la cadena contenía tu hash anterior, el de antes de realizar la modificación, y era vaĺido con ese valor. Ahora, al modificar el contenido del bloque anterior, su hash ha cambiado y el contenido del bloque siguiente también ha cambiado y ha dejado de ser válido. Tienes que volver a minar el bloque siguiente. Y el siguiente. Y el siguiente.
7 |
En un Blockchain modificar un bloque antiguo cuesta. Cuanto más antiguo sea el bloque (más atrás esté en la cadena), más difícil será modificar su valor. Esta es una de las bases de la inmutabilidad de Blockchain
8 |
9 |
Aquí tienes 5 bloques de un mini-blockchain. Observa que si modficas un bloque es necesario minar todos los bloques siguientes para que la cadena siga siendo válida
Ya hemos visto que en una Blockchain la facilidad de modificar la información contenida en los bloques se va haciendo cada vez más difícil. No obstante, esto no es suficiente para aplicaciones más universales. En concreto, Bitcoin y Ethereum usan blockchains distribuidas.
4 |
En una blockchain distribuida no basta con que la cadena sea válida (todos sus bloques sean válidos), sino que además debe de haber un consenso
5 |
Imagina una blockchain distribuida con 3 nodos. El Nodo A decide modificar un bloque, realiza todos los minados pertinentes y su cadena ahora es válida. ¿Cómo elije el sistema que cadena es válida y cuál no? Fácil. Si una cadena modifica el contenido de un bloque, aunque realice todos sus minados los hashes resultantes van a ser distintos. Realmente, solo comprobando el hash del último bloque es posible saber si una cadena ha sufrido una modificación que el resto no tiene.
6 |
Esa cadena con un último bloque de hash distinto al resto se quedará huérfana y el resto de bloques que lleguen a la red se pondrán sobre las cadenas que tienen consenso entre sí. En redes como Bitcoin o Ethereum el consenso se logra con el 51% de los nodos.
7 |
8 |
Aquí tienes una mini-red con 3 nodos. Primero intenta que todos tengan el mismo contenido. Después intenta modificar una cadena y observa lo que ocurre.
9 |
Nodo A
10 |
Bloque 1
11 |
12 |
13 |
14 |
15 |
16 |
Bloque válido
17 |
Bloque no válido
18 |
19 |
20 |
Bloque 2
21 |
22 |
23 |
24 |
25 |
26 |
Bloque válido
27 |
Bloque no válido
28 |
29 |
30 |
Bloque 3
31 |
32 |
33 |
34 |
35 |
36 |
Bloque válido
37 |
Bloque no válido
38 |
39 |
40 |
Nodo B
41 |
Bloque 1
42 |
43 |
44 |
45 |
46 |
47 |
Bloque válido
48 |
Bloque no válido
49 |
50 |
51 |
Bloque 2
52 |
53 |
54 |
55 |
56 |
57 |
Bloque válido
58 |
Bloque no válido
59 |
60 |
61 |
Bloque 3
62 |
63 |
64 |
65 |
66 |
67 |
Bloque válido
68 |
Bloque no válido
69 |
70 |
71 |
Nodo C
72 |
Bloque 1
73 |
74 |
75 |
76 |
77 |
78 |
Bloque válido
79 |
Bloque no válido
80 |
81 |
82 |
Bloque 2
83 |
84 |
85 |
86 |
87 |
88 |
Bloque válido
89 |
Bloque no válido
90 |
91 |
92 |
Bloque 3
93 |
94 |
95 |
96 |
97 |
98 |
Bloque válido
99 |
Bloque no válido
100 |
101 |
102 |
Resultado
103 |
Las blockchains contienen exactamente el mismo contenido. Todas son válidas
104 |
El nodo A ha intentado manipular los contenidos del blockchain
105 |
El nodo B ha intentado manipular los contenidos del blockchain
106 |
El nodo C ha intentado manipular los contenidos del blockchain
107 |
No hay consenso mayoritario sobre que versión de la blockchain es la correcta