Construye Una Cadena De Bloques Desde Cero Usando Go

Blockchain es la tecnología subyacente para muchas aplicaciones descentralizadas y criptomonedas. Se consideran uno de los descubrimientos más importantes de esta generación. Aunque blockchain está en su infancia, ya es aplicable a muchas industrias, creando nuevos trabajos y oportunidades para desarrolladores, artistas, jugadores, escritores de contenido y más.

El propósito de este tutorial es explicar cómo funciona la cadena de bloques explicando cómo usar Go para crear una cadena de bloques desde cero. Si ha oído hablar de blockchain pero todavía está confundido acerca de cómo funciona, este artículo es útil.

Razones para construir una cadena de bloques con Go

Go ofrece muchas características únicas adecuadas para construir blockchains. Por ejemplo, Go le permite crear aplicaciones altamente eficientes y de alto rendimiento con poco esfuerzo.

Go también es ideal para crear aplicaciones que requieren paralelismo y simultaneidad (como blockchain) con la capacidad de generar y administrar miles de Goroutines. Go implementa la recolección automática de basura y la gestión de la pila en el sistema en tiempo de ejecución.

Por último, compile su aplicación en código de máquina y un único binario, admita múltiples arquitecturas de procesador y SO, e impleméntela fácilmente en la infraestructura de su servidor.

Prerrequisitos

Para comprender cómo sigue este tutorial, necesita lo siguiente:

¿Qué es una cadena de bloques?

Una cadena de bloques es un registro digital de transacciones que se distribuyen y comparten entre nodos en una red informática. Cada transacción en la cadena de bloques se denomina bloque y utiliza tecnología de cifrado para vincularse a otra transacción.

Blockchain es útil si está tratando de construir un sistema descentralizado que garantice la seguridad e integridad de sus datos mientras mantiene la confianza entre todos los usuarios del sistema.

¿Qué es un bloque?

Hemos hablado de bloques antes, pero es posible que se pregunte qué son. En pocas palabras, un bloque es un grupo de datos y varios bloques se unen para formar una cadena de bloques.

Cada bloque de la cadena de bloques tiene las siguientes propiedades:

  • Datos que se registrarán en la cadena de bloques (datos de transacciones, etc.)
  • Hash de bloque, ID del bloque generado mediante tecnología de cifrado
  • Hash del bloque anterior. Este es el hash de cifrado del último bloque de la cadena de bloques. Grabado en todos los bloques para enlazar con la cadena y mejorar la seguridad
  • Marca de tiempo cuando se creó el bloque y se agregó a la cadena de bloques
  • Prueba de trabajo (PoW). Esta es la cantidad de esfuerzo requerido para derivar el hash del bloque actual. Hablaremos más sobre esto más adelante en el tutorial.

empezando

Primero, cree un nuevo proyecto de Go e importe todos los paquetes necesarios para construir su blockchain. Cree un archivo con nombre y guarde el siguiente código en él.blockchain.go

package main

import (
        "crypto/sha256"
        "encoding/json"
        "fmt"
        "strconv"
        "strings"
        "time"
)

A continuación, cree un tipo de bloque personalizado que contenga los datos en la cadena de bloques. Agregue el siguiente código al archivo.blockchain.go

type Block struct {
        data         map[string]interface{}
        hash         string
        previousHash string
        timestamp    time.Time
        pow          int
}

A continuación, Blockchaincree un tipo personalizado que contenga el bloque. Agregue el siguiente código al archivo.blockchain.go

type Blockchain struct {
        genesisBlock Block
        chain        []Block
        difficulty   int
}

genesisBlockLa propiedad representa el primer bloque agregado a la cadena de bloques. difficultyLas propiedades , por el contrario, definen el esfuerzo mínimo que debe hacer un minero para extraer un bloque e incluirlo en la cadena de bloques.

Calcula el hash del bloque

Como se mencionó anteriormente, el hash de bloque es un identificador generado mediante encriptación. Utilice el algoritmo SHA256 para derivar el hash de bloque de la cadena de bloques mediante el hash del hash del bloque anterior, los datos del bloque actual, la marca de tiempo y el PoW.

BlockCreemos un tipo de método que implemente esta característica.

func (b Block) calculateHash() string {
        data, _ := json.Marshal(b.data)
        blockData := b.previousHash + string(data) + b.timestamp.String() + strconv.Itoa(b.pow)
        blockHash := sha256.Sum256([]byte(blockData))
        return fmt.Sprintf("%x", blockHash)
}

En el código anterior, hice lo siguiente:

  • Convertí los datos del bloque a formato JSON
  • Concatenó los hashes, los datos, las marcas de tiempo y la prueba de trabajo (PoW) anteriores del bloque.
  • Concatenación anterior hash utilizando el algoritmo SHA256
  • Devolvió un resultado hash de radix 16 que incluye AF minúscula

Minería de nuevos bloques

La minería de nuevos bloques implica generar la cantidad requerida de hashes de bloque de base cero (la cantidad requerida es la dificultad de la minería). Esto significa que si su blockchain tiene un nivel de dificultad de 3, "000"necesita generar un hash de bloque que comience con , por ejemplo "0009a1bfb506…".

Dado que el hash del bloque se deriva de su contenido, debe seguir cambiando el valor de PoW del bloque actual hasta que obtenga un hash que cumpla con los criterios de minería (comenzando desde cero> dificultad).

Para implementar esto, cree un método del tipo que incremente el valor de PoW hasta que obtenga un hash válido y siga calculando el hash del bloque.mine()Block

Agregue el siguiente código al archivo.blockchain.go

func (b *Block) mine(difficulty int) {
        for !strings.HasPrefix(b.hash, strings.Repeat("0", difficulty)) {
                b.pow++
                b.hash = b.calculateHash()
        }
}

Creando un bloque Génesis

A continuación, Blockchainescriba una función que cree un bloque Génesis para la cadena de bloques y devuelva una nueva instancia de ese tipo.

Agregue el siguiente código al archivo.blockchain.go

func CreateBlockchain(difficulty int) Blockchain {
        genesisBlock := Block{
                hash:      "0",
                timestamp: time.Now(),
        }
        return Blockchain{
                genesisBlock,
                []Block{genesisBlock},
                difficulty,
        }
}

Aquí, establezca el hash del bloque génesis en "0". Dado que este es el primer bloque de la cadena de bloques, no hay un valor hash previo y la propiedad de datos está vacía.

Luego Blockchaincreé una nueva instancia de este tipo y guardé el bloque Génesis junto con la dificultad de la cadena de bloques.

Agrega un nuevo bloque a la cadena de bloques

Ahora que hemos implementado la capacidad de calcular un hash en un bloque y extraerlo, veamos cómo incluir un nuevo bloque en la cadena de bloques.

Agregue el siguiente código al archivo.blockchain.go

func (b *Blockchain) addBlock(from, to string, amount float64) {
        blockData := map[string]interface{}{
                "from":   from,
                "to":     to,
                "amount": amount,
        }
        lastBlock := b.chain[len(b.chain)-1]
        newBlock := Block{
                data:         blockData,
                previousHash: lastBlock.hash,
                timestamp:    time.Now(),
        }
        newBlock.mine(b.difficulty)
        b.chain = append(b.chain, newBlock)
}

He creado addBlockun Blockchaintipo de método que hace lo siguiente:

  • Recopile los detalles de la transacción (remitente, destinatario y monto de la transferencia)
  • Crea un nuevo bloque que contenga los detalles de la transacción.
  • Extraer un nuevo bloque utilizando el hash del bloque antiguo, los datos del bloque actual y el PoW generado
  • Agregue el bloque recién creado a la cadena de bloques

Comprueba la eficacia de la cadena de bloques.

Ha creado con éxito una cadena de bloques que puede registrar transacciones. Necesitamos la capacidad de verificar si la cadena de bloques es válida para que podamos estar seguros de que la transacción no ha sido manipulada.

Agregue el siguiente código al archivo.blockchain.go

func (b Blockchain) isValid() bool {
        for i := range b.chain[1:] {
                previousBlock := b.chain[i]
                currentBlock := b.chain[i+1]
                if currentBlock.hash != currentBlock.calculateHash() || currentBlock.previousHash != previousBlock.hash {
                        return false
                }
        }
        return true
}

Aquí recalculamos el hash de cada bloque y lo comparamos con los valores hash de los otros bloques almacenados para ver si el valor hash anterior del otro bloque era igual al valor hash del bloque anterior ... Si alguna de las comprobaciones falla, la cadena de bloques ha sido manipulada.

Realizar transacciones usando blockchain

Ahora tiene una cadena de bloques completamente funcional. Creemos una función que muestre cómo usarla.main()

Agregue el siguiente código al archivo.blockchain.go

func main() {
        // create a new blockchain instance with a mining difficulty of 2
        blockchain := CreateBlockchain(2)

        // record transactions on the blockchain for Alice, Bob, and John
        blockchain.addBlock("Alice", "Bob", 5)
        blockchain.addBlock("John", "Bob", 2)

        // check if the blockchain is valid; expecting true
        fmt.Println(blockchain.isValid())
}

Conclusión

En este tutorial, le mostraremos qué es un bloque, qué contiene, cómo funciona la cadena de bloques internamente, cómo calcular el hash del bloque y cómo implementar un algoritmo de consenso para extraer el bloque., Cómo registrar transacciones en blockchain. , blockchain.

La esencia de GitHub ya que el código fuente para la cadena de bloques Go está disponible . Es perfecto para aplicaciones donde la eficiencia y el rendimiento son prioridades primordiales, por lo que no puede esperar a ver las grandes cosas que ha creado con Go.

¡Feliz codificación! 

Enlace: https://blog.logrocket.com/how-to-build-blockchain-from-scratch-go/

#blockchain  #github  #go 

What is GEEK

Buddha Community

Construye Una Cadena De Bloques Desde Cero Usando Go

Construye Una Cadena De Bloques Desde Cero Usando Go

Blockchain es la tecnología subyacente para muchas aplicaciones descentralizadas y criptomonedas. Se consideran uno de los descubrimientos más importantes de esta generación. Aunque blockchain está en su infancia, ya es aplicable a muchas industrias, creando nuevos trabajos y oportunidades para desarrolladores, artistas, jugadores, escritores de contenido y más.

El propósito de este tutorial es explicar cómo funciona la cadena de bloques explicando cómo usar Go para crear una cadena de bloques desde cero. Si ha oído hablar de blockchain pero todavía está confundido acerca de cómo funciona, este artículo es útil.

Razones para construir una cadena de bloques con Go

Go ofrece muchas características únicas adecuadas para construir blockchains. Por ejemplo, Go le permite crear aplicaciones altamente eficientes y de alto rendimiento con poco esfuerzo.

Go también es ideal para crear aplicaciones que requieren paralelismo y simultaneidad (como blockchain) con la capacidad de generar y administrar miles de Goroutines. Go implementa la recolección automática de basura y la gestión de la pila en el sistema en tiempo de ejecución.

Por último, compile su aplicación en código de máquina y un único binario, admita múltiples arquitecturas de procesador y SO, e impleméntela fácilmente en la infraestructura de su servidor.

Prerrequisitos

Para comprender cómo sigue este tutorial, necesita lo siguiente:

¿Qué es una cadena de bloques?

Una cadena de bloques es un registro digital de transacciones que se distribuyen y comparten entre nodos en una red informática. Cada transacción en la cadena de bloques se denomina bloque y utiliza tecnología de cifrado para vincularse a otra transacción.

Blockchain es útil si está tratando de construir un sistema descentralizado que garantice la seguridad e integridad de sus datos mientras mantiene la confianza entre todos los usuarios del sistema.

¿Qué es un bloque?

Hemos hablado de bloques antes, pero es posible que se pregunte qué son. En pocas palabras, un bloque es un grupo de datos y varios bloques se unen para formar una cadena de bloques.

Cada bloque de la cadena de bloques tiene las siguientes propiedades:

  • Datos que se registrarán en la cadena de bloques (datos de transacciones, etc.)
  • Hash de bloque, ID del bloque generado mediante tecnología de cifrado
  • Hash del bloque anterior. Este es el hash de cifrado del último bloque de la cadena de bloques. Grabado en todos los bloques para enlazar con la cadena y mejorar la seguridad
  • Marca de tiempo cuando se creó el bloque y se agregó a la cadena de bloques
  • Prueba de trabajo (PoW). Esta es la cantidad de esfuerzo requerido para derivar el hash del bloque actual. Hablaremos más sobre esto más adelante en el tutorial.

empezando

Primero, cree un nuevo proyecto de Go e importe todos los paquetes necesarios para construir su blockchain. Cree un archivo con nombre y guarde el siguiente código en él.blockchain.go

package main

import (
        "crypto/sha256"
        "encoding/json"
        "fmt"
        "strconv"
        "strings"
        "time"
)

A continuación, cree un tipo de bloque personalizado que contenga los datos en la cadena de bloques. Agregue el siguiente código al archivo.blockchain.go

type Block struct {
        data         map[string]interface{}
        hash         string
        previousHash string
        timestamp    time.Time
        pow          int
}

A continuación, Blockchaincree un tipo personalizado que contenga el bloque. Agregue el siguiente código al archivo.blockchain.go

type Blockchain struct {
        genesisBlock Block
        chain        []Block
        difficulty   int
}

genesisBlockLa propiedad representa el primer bloque agregado a la cadena de bloques. difficultyLas propiedades , por el contrario, definen el esfuerzo mínimo que debe hacer un minero para extraer un bloque e incluirlo en la cadena de bloques.

Calcula el hash del bloque

Como se mencionó anteriormente, el hash de bloque es un identificador generado mediante encriptación. Utilice el algoritmo SHA256 para derivar el hash de bloque de la cadena de bloques mediante el hash del hash del bloque anterior, los datos del bloque actual, la marca de tiempo y el PoW.

BlockCreemos un tipo de método que implemente esta característica.

func (b Block) calculateHash() string {
        data, _ := json.Marshal(b.data)
        blockData := b.previousHash + string(data) + b.timestamp.String() + strconv.Itoa(b.pow)
        blockHash := sha256.Sum256([]byte(blockData))
        return fmt.Sprintf("%x", blockHash)
}

En el código anterior, hice lo siguiente:

  • Convertí los datos del bloque a formato JSON
  • Concatenó los hashes, los datos, las marcas de tiempo y la prueba de trabajo (PoW) anteriores del bloque.
  • Concatenación anterior hash utilizando el algoritmo SHA256
  • Devolvió un resultado hash de radix 16 que incluye AF minúscula

Minería de nuevos bloques

La minería de nuevos bloques implica generar la cantidad requerida de hashes de bloque de base cero (la cantidad requerida es la dificultad de la minería). Esto significa que si su blockchain tiene un nivel de dificultad de 3, "000"necesita generar un hash de bloque que comience con , por ejemplo "0009a1bfb506…".

Dado que el hash del bloque se deriva de su contenido, debe seguir cambiando el valor de PoW del bloque actual hasta que obtenga un hash que cumpla con los criterios de minería (comenzando desde cero> dificultad).

Para implementar esto, cree un método del tipo que incremente el valor de PoW hasta que obtenga un hash válido y siga calculando el hash del bloque.mine()Block

Agregue el siguiente código al archivo.blockchain.go

func (b *Block) mine(difficulty int) {
        for !strings.HasPrefix(b.hash, strings.Repeat("0", difficulty)) {
                b.pow++
                b.hash = b.calculateHash()
        }
}

Creando un bloque Génesis

A continuación, Blockchainescriba una función que cree un bloque Génesis para la cadena de bloques y devuelva una nueva instancia de ese tipo.

Agregue el siguiente código al archivo.blockchain.go

func CreateBlockchain(difficulty int) Blockchain {
        genesisBlock := Block{
                hash:      "0",
                timestamp: time.Now(),
        }
        return Blockchain{
                genesisBlock,
                []Block{genesisBlock},
                difficulty,
        }
}

Aquí, establezca el hash del bloque génesis en "0". Dado que este es el primer bloque de la cadena de bloques, no hay un valor hash previo y la propiedad de datos está vacía.

Luego Blockchaincreé una nueva instancia de este tipo y guardé el bloque Génesis junto con la dificultad de la cadena de bloques.

Agrega un nuevo bloque a la cadena de bloques

Ahora que hemos implementado la capacidad de calcular un hash en un bloque y extraerlo, veamos cómo incluir un nuevo bloque en la cadena de bloques.

Agregue el siguiente código al archivo.blockchain.go

func (b *Blockchain) addBlock(from, to string, amount float64) {
        blockData := map[string]interface{}{
                "from":   from,
                "to":     to,
                "amount": amount,
        }
        lastBlock := b.chain[len(b.chain)-1]
        newBlock := Block{
                data:         blockData,
                previousHash: lastBlock.hash,
                timestamp:    time.Now(),
        }
        newBlock.mine(b.difficulty)
        b.chain = append(b.chain, newBlock)
}

He creado addBlockun Blockchaintipo de método que hace lo siguiente:

  • Recopile los detalles de la transacción (remitente, destinatario y monto de la transferencia)
  • Crea un nuevo bloque que contenga los detalles de la transacción.
  • Extraer un nuevo bloque utilizando el hash del bloque antiguo, los datos del bloque actual y el PoW generado
  • Agregue el bloque recién creado a la cadena de bloques

Comprueba la eficacia de la cadena de bloques.

Ha creado con éxito una cadena de bloques que puede registrar transacciones. Necesitamos la capacidad de verificar si la cadena de bloques es válida para que podamos estar seguros de que la transacción no ha sido manipulada.

Agregue el siguiente código al archivo.blockchain.go

func (b Blockchain) isValid() bool {
        for i := range b.chain[1:] {
                previousBlock := b.chain[i]
                currentBlock := b.chain[i+1]
                if currentBlock.hash != currentBlock.calculateHash() || currentBlock.previousHash != previousBlock.hash {
                        return false
                }
        }
        return true
}

Aquí recalculamos el hash de cada bloque y lo comparamos con los valores hash de los otros bloques almacenados para ver si el valor hash anterior del otro bloque era igual al valor hash del bloque anterior ... Si alguna de las comprobaciones falla, la cadena de bloques ha sido manipulada.

Realizar transacciones usando blockchain

Ahora tiene una cadena de bloques completamente funcional. Creemos una función que muestre cómo usarla.main()

Agregue el siguiente código al archivo.blockchain.go

func main() {
        // create a new blockchain instance with a mining difficulty of 2
        blockchain := CreateBlockchain(2)

        // record transactions on the blockchain for Alice, Bob, and John
        blockchain.addBlock("Alice", "Bob", 5)
        blockchain.addBlock("John", "Bob", 2)

        // check if the blockchain is valid; expecting true
        fmt.Println(blockchain.isValid())
}

Conclusión

En este tutorial, le mostraremos qué es un bloque, qué contiene, cómo funciona la cadena de bloques internamente, cómo calcular el hash del bloque y cómo implementar un algoritmo de consenso para extraer el bloque., Cómo registrar transacciones en blockchain. , blockchain.

La esencia de GitHub ya que el código fuente para la cadena de bloques Go está disponible . Es perfecto para aplicaciones donde la eficiencia y el rendimiento son prioridades primordiales, por lo que no puede esperar a ver las grandes cosas que ha creado con Go.

¡Feliz codificación! 

Enlace: https://blog.logrocket.com/how-to-build-blockchain-from-scratch-go/

#blockchain  #github  #go 

Fannie  Zemlak

Fannie Zemlak

1599854400

What's new in the go 1.15

Go announced Go 1.15 version on 11 Aug 2020. Highlighted updates and features include Substantial improvements to the Go linker, Improved allocation for small objects at high core counts, X.509 CommonName deprecation, GOPROXY supports skipping proxies that return errors, New embedded tzdata package, Several Core Library improvements and more.

As Go promise for maintaining backward compatibility. After upgrading to the latest Go 1.15 version, almost all existing Golang applications or programs continue to compile and run as older Golang version.

#go #golang #go 1.15 #go features #go improvement #go package #go new features

Cómo construir una cadena de bloques desde cero con Go

Usar Go para construir una cadena de bloques desde cero

Descubra por qué Go es una excelente opción para construir una cadena de bloques, además de un tutorial paso a paso sobre cómo puede implementarlo usted mismo.

Las cadenas de bloques son la tecnología subyacente para muchas aplicaciones descentralizadas y criptomonedas. Se consideran uno de los descubrimientos más importantes de esta generación. A pesar de estar en sus primeras etapas, blockchain ya es aplicable en muchas industrias y está creando nuevos puestos de trabajo y oportunidades para desarrolladores, artistas, jugadores, escritores de contenido y muchos más.

Este tutorial tiene como objetivo enseñarle cómo funcionan las cadenas de bloques al guiarlo a través de la construcción de una desde cero con Go. Si ha oído hablar de las cadenas de bloques, pero todavía está confundido acerca de cómo funcionan, este artículo es para usted.

¿Por qué construir una cadena de bloques con Go?

Go proporciona muchas características y funcionalidades únicas que lo convierten en una buena opción para construir una cadena de bloques. Por ejemplo, Go le permite crear aplicaciones de alto rendimiento y rendimiento con poco esfuerzo.

Go también es excelente para crear aplicaciones que requieren paralelismo y simultaneidad (como blockchains) con su capacidad para generar y administrar miles de Goroutines. Go implementa la recolección automática de basura y la gestión de la pila con su sistema de tiempo de ejecución.

Por último, compila aplicaciones en código de máquina y binarios únicos, admite múltiples sistemas operativos y arquitecturas de procesador, y se implementa fácilmente en la infraestructura del servidor.

¿Qué es una cadena de bloques?

Una cadena de bloques es un registro digital de transacciones distribuidas y compartidas entre los nodos de una red informática. Cada transacción en la cadena de bloques se llama bloque y se vincula a otra con técnicas de criptografía.

Las cadenas de bloques son útiles cuando intenta construir un sistema descentralizado que garantice la seguridad e integridad de los datos mientras mantiene la confianza entre todos los usuarios del sistema.

¿Qué es un bloque?

Mencionamos bloques anteriormente, y es posible que se pregunte qué son. En pocas palabras, un bloque es un grupo de datos y varios bloques se unen para formar una cadena de bloques.

Cada bloque de una cadena de bloques posee las siguientes propiedades:

  • Datos para registrar en la cadena de bloques, por ejemplo, datos de transacciones
  • Un hash de bloque, el ID del bloque generado mediante técnicas de criptografía.
  • El hash del bloque anterior, que es el hash criptográfico del último bloque de la cadena de bloques. Se graba en cada bloque para enlazarlo a la cadena y mejorar su seguridad.
  • Una marca de tiempo de cuándo se creó el bloque y se agregó a la cadena de bloques.
  • Prueba de trabajo (PoW), que es la cantidad de esfuerzo realizado para derivar el hash del bloque actual. Explicaremos esto en profundidad más adelante en el tutorial.

Empezando

Comencemos creando un nuevo proyecto de Go e importando todos los paquetes necesarios para construir nuestra cadena de bloques. Cree un archivo con nombre blockchain.goy guarde el siguiente código en él:

package main

import (
        "crypto/sha256"
        "encoding/json"
        "fmt"
        "strconv"
        "strings"
        "time"
)

A continuación, crearemos un tipo de bloque personalizado para contener los datos de nuestra cadena de bloques. Agregue el siguiente código al blockchain.goarchivo:

type Block struct {data map [string] interface {} hash string previousHash string timestamp time.Time pow int}

Luego, crearemos un Blockchaintipo personalizado que contenga nuestros bloques. Agregue el siguiente código al blockchain.goarchivo:

type Blockchain struct {
        genesisBlock Block
        chain        []Block
        difficulty   int
}

La genesisBlockpropiedad representa el primer bloque agregado a la cadena de bloques. Por el contrario, la difficultypropiedad define el esfuerzo mínimo que los mineros deben realizar para extraer un bloque e incluirlo en la cadena de bloques.

Calcular el hash de un bloque

Como comentamos anteriormente, el hash de un bloque es su identificador generado mediante criptografía. Derivaremos el hash de bloque para nuestra cadena de bloques mediante el hash del hash del bloque anterior, los datos del bloque actual, la marca de tiempo y el PoW utilizando el algoritmo SHA256 .

Creemos un método para nuestro Blocktipo que implemente esta funcionalidad:

func (b Block) calculateHash() string {
        data, _ := json.Marshal(b.data)
        blockData := b.previousHash + string(data) + b.timestamp.String() + strconv.Itoa(b.pow)
        blockHash := sha256.Sum256([]byte(blockData))
        return fmt.Sprintf("%x", blockHash)
}

En el código anterior, hicimos lo siguiente:

  • Convirtió los datos del bloque a formato JSON.
  • Concatenó el hash, los datos, la marca de tiempo y la prueba de trabajo (PoW) anteriores del bloque
  • Hashed la concatenación anterior con el algoritmo SHA256
  • Devolvió el resultado de hash en base 16, con letras minúsculas para AF

Minería de nuevos bloques

La extracción de un nuevo bloque implica generar un hash de bloque que comienza con un número deseado de ceros (el número deseado es la dificultad de extracción). Esto significa que si la dificultad del blockchain es de tres, que tienen que generar un hash bloque que comienza con "000", por ejemplo, "0009a1bfb506…".

Debido a que derivamos el hash de un bloque a partir de su contenido, debemos seguir cambiando el valor de PoW del bloque actual hasta que obtengamos un hash que satisfaga nuestra condición de minería (ceros iniciales> dificultad).

Para implementar esto, crearemos un mine()método para nuestro Blocktipo que seguirá incrementando el valor de PoW y calculando el hash del bloque hasta que obtengamos un hash válido.

Agregue el siguiente código al blockchain.goarchivo:

func (b *Block) mine(difficulty int) {
        for !strings.HasPrefix(b.hash, strings.Repeat("0", difficulty)) {
                b.pow++
                b.hash = b.calculateHash()
        }
}

Creando el bloque de génesis

A continuación, escribiremos una función que crea un bloque de génesis para nuestra cadena de bloques y devuelve una nueva instancia del Blockchaintipo.

Agregue el siguiente código al blockchain.goarchivo:

func CreateBlockchain(difficulty int) Blockchain {
        genesisBlock := Block{
                hash:      "0",
                timestamp: time.Now(),
        }
        return Blockchain{
                genesisBlock,
                []Block{genesisBlock},
                difficulty,
        }
}

Aquí, configuramos el hash de nuestro bloque génesis en "0". Debido a que es el primer bloque de la cadena de bloques, no hay valor para el hash anterior y la propiedad de datos está vacía.

Luego, creamos una nueva instancia del Blockchaintipo y almacenamos el bloque de génesis junto con la dificultad de la cadena de bloques.

Agregar nuevos bloques a la cadena de bloques

Ahora que hemos implementado funcionalidades para que nuestros bloques calculen su hash y se extraigan, veamos cómo incluir nuevos bloques en una cadena de bloques.

Agregue el siguiente código al blockchain.goarchivo:

func (b *Blockchain) addBlock(from, to string, amount float64) {
        blockData := map[string]interface{}{
                "from":   from,
                "to":     to,
                "amount": amount,
        }
        lastBlock := b.chain[len(b.chain)-1]
        newBlock := Block{
                data:         blockData,
                previousHash: lastBlock.hash,
                timestamp:    time.Now(),
        }
        newBlock.mine(b.difficulty)
        b.chain = append(b.chain, newBlock)
}

Aquí, creamos un addBlockmétodo para el Blockchaintipo que hace lo siguiente:

  • Recopila los detalles de una transacción (remitente, destinatario y monto de la transferencia)
  • Crea un nuevo bloque con los detalles de la transacción.
  • Extrae el nuevo bloque con el hash del bloque anterior, los datos del bloque actual y el PoW generado
  • Agrega el bloque recién creado a la cadena de bloques.

Comprobando la validez de la cadena de bloques

Hemos creado con éxito una cadena de bloques que puede registrar transacciones, y necesitamos una funcionalidad que verifique si la cadena de bloques es válida para que sepamos que no se han manipulado transacciones.

Agregue el siguiente código al blockchain.goarchivo:

func (b Blockchain) isValid() bool {
        for i := range b.chain[1:] {
                previousBlock := b.chain[i]
                currentBlock := b.chain[i+1]
                if currentBlock.hash != currentBlock.calculateHash() || currentBlock.previousHash != previousBlock.hash {
                        return false
                }
        }
        return true
}

Aquí, recalculamos el hash de cada bloque, los comparamos con los valores hash almacenados de los otros bloques y verificamos si el valor hash anterior de cualquier otro bloque es igual al valor hash del bloque anterior. Si alguna de las comprobaciones falla, la cadena de bloques ha sido manipulada.

Usando la cadena de bloques para realizar transacciones

¡Ahora tenemos una cadena de bloques completamente funcional! Creemos una main()función para mostrar su uso.

Agregue el siguiente código al blockchain.goarchivo:

func main() {
        // create a new blockchain instance with a mining difficulty of 2
        blockchain := CreateBlockchain(2)

        // record transactions on the blockchain for Alice, Bob, and John
        blockchain.addBlock("Alice", "Bob", 5)
        blockchain.addBlock("John", "Bob", 2)

        // check if the blockchain is valid; expecting true
        fmt.Println(blockchain.isValid())
}

Conclusión

En este tutorial, aprendió cómo funcionan las cadenas de bloques bajo el capó, incluido qué bloques son y qué contienen, y cómo calcular un hash de bloque, implementar un algoritmo de consenso para minar bloques, registrar transacciones en la cadena de bloques y validar la autenticidad de un blockchain.

El código fuente de la cadena de bloques Go está disponible como GitHub Gist . No puedo esperar a ver las cosas asombrosas que crea con Go, ya que es una buena opción para aplicaciones donde la eficiencia y el rendimiento son la máxima prioridad.

¡Feliz codificación!

Fuente: https://blog.logrocket.com

#go #golang #blockchain 

joe biden

1617257581

Software de restauración de Exchange para restaurar sin problemas PST en Exchange Server

¿Quiere restaurar los buzones de correo de PST a Exchange Server? Entonces, estás en la página correcta. Aquí, lo guiaremos sobre cómo puede restaurar fácilmente mensajes y otros elementos de PST a MS Exchange Server.

Muchas veces, los usuarios necesitan restaurar los elementos de datos de PST en Exchange Server, pero debido a la falta de disponibilidad de una solución confiable, los usuarios no pueden obtener la solución. Háganos saber primero sobre el archivo PST y MS Exchange Server.

Conozca PST y Exchange Server

PST es un formato de archivo utilizado por MS Outlook, un cliente de correo electrónico de Windows y muy popular entre los usuarios domésticos y comerciales.

Por otro lado, Exchange Server es un poderoso servidor de correo electrónico donde todos los datos se almacenan en un archivo EDB. Los usuarios generalmente guardan la copia de seguridad de los buzones de correo de Exchange en el archivo PST, pero muchas veces, los usuarios deben restaurar los datos del archivo PST en Exchange. Para resolver este problema, estamos aquí con una solución profesional que discutiremos en la siguiente sección de esta publicación.

Un método profesional para restaurar PST a Exchange Server

No le recomendamos que elija una solución al azar para restaurar los datos de PST en Exchange Server. Por lo tanto, al realizar varias investigaciones, estamos aquí con una solución inteligente y conveniente, es decir, Exchange Restore Software. Es demasiado fácil de manejar por todos los usuarios y restaurar cómodamente todos los datos del archivo PST a Exchange Server.

Funciones principales ofrecidas por Exchange Restore Software

El software es demasiado simple de usar y se puede instalar fácilmente en todas las versiones de Windows. Con unos pocos clics, la herramienta puede restaurar los elementos del buzón de Exchange.

No es necesario que MS Outlook restaure los datos PST en Exchange. Todos los correos electrónicos, contactos, notas, calendarios, etc. se restauran desde el archivo PST a Exchange Server.

Todas las versiones de Outlook son compatibles con la herramienta, como Outlook 2019, 2016, 2013, 2010, 2007, etc. La herramienta proporciona varios filtros mediante los cuales se pueden restaurar los datos deseados desde un archivo PST a Exchange Server. El programa se puede instalar en todas las versiones de Windows como Windows 10, 8.1, 8, 7, XP, Vista, etc.

Descargue la versión de demostración del software de restauración de Exchange y analice el funcionamiento del software restaurando los primeros 50 elementos por carpeta.

Líneas finales

No existe una solución manual para restaurar los buzones de correo de Exchange desde el archivo PST. Por lo tanto, hemos explicado una solución fácil e inteligente para restaurar datos de archivos PST en Exchange Server. Simplemente puede usar este software y restaurar todos los datos de PST a Exchange Server.

Más información:- https://www.datavare.com/software/exchange-restore.html

#intercambio de software de restauración #intercambio de restauración #buzón del servidor de intercambio #herramienta de restauración de intercambio

joe biden

1617255938

¿Cómo migrar los buzones de correo de Exchange a la nube de Office 365?

Si tiene problemas para migrar los buzones de correo de Exchange a Office 365, debe leer este artículo para saber cómo migrar los buzones de correo de Exchange EDB a Office 365. Al migrar a Office 365, los usuarios pueden acceder a sus buzones de correo desde cualquier lugar y desde cualquier dispositivo.

En esta publicación, explicaremos las razones detrás de esta migración y una solución profesional para migrar de Exchange a Office 365.

Razones para migrar Exchange Server a la nube de Office 365

Office 365 apareció por primera vez en 2011 y, dado que se considera la mejor plataforma para aquellas organizaciones que desean administrar todo su sistema de correo electrónico en la nube. Estas son las características clave de Office 365:

  1. Permite trabajar desde cualquier lugar y desde cualquier lugar.
  2. No se preocupe por el spam y el malware.
  3. La seguridad proporcionada por Office 365 es altamente confiable.
  4. Controla el costo total y brinda flexibilidad financiera.
  5. Todas las actualizaciones y mejoras son administradas por Microsoft.

¿Cómo migrar los buzones de correo de Exchange a Office 365?

Hay varias formas manuales de migrar los buzones de correo de Exchange EDB a Office 365, pero para evitar estos complicados y prolongados procedimientos, presentamos una solución de terceros, es decir, la herramienta de migración de Exchange, que es automatizada y directa para la migración de Exchange a Office 365. La herramienta funciona rápidamente y migra todos los elementos del buzón de Exchange Server a Office 365.

La herramienta de migración de Datavare Exchange es demasiado fácil de usar y ofrece pasos sencillos para migrar EDB a Office 365:

  1. Descargue e instale el software en su sistema.
  2. Agregue el archivo EDB de Exchange con el botón Examinar.
  3. Seleccione exportar a buzones de correo de Office 365.
  4. Proporcione los detalles de inicio de sesión de la cuenta de Office 365.
  5. Seleccione la carpeta y presione el botón Finalizar.

Por lo tanto, todos sus buzones de correo de Exchange EDB ahora se migran a Office 365.
Nota: puede usar filtros para migrar los elementos de datos deseados de la cuenta de Exchange a la de Office 365

Líneas finales

Este blog le indica una solución profesional para la migración de buzones de correo de Exchange a la cuenta de Office 365. Dado que las soluciones manuales son complicadas, sugerimos la herramienta de migración de Exchange, que es demasiado simple de usar. Los usuarios no se enfrentan a problemas al operar el programa. La mejor parte de este software es que no necesita habilidades técnicas para realizar la migración. Se puede comprender el funcionamiento del software descargando la versión de demostración que permite la migración de los primeros 50 elementos por carpeta.

Más información:- https://www.datavare.com/software/edb-migration.html

#herramienta de migración de intercambio #migración de intercambio #migrar buzones de correo de exchange