La nueva versión de la biblioteca Ethereum ethersV5.0 coopera con el backend Golang1.18 para vincular la billetera blockchain (Metamask/Okc) y verificar la firma en tiempo real

La idea de la descentralización de la cadena de bloques es omnipresente. Por ejemplo, el uso reciente de la autoevaluación de antígenos individuales para reemplazar las pruebas de ácido nucleico centralizadas a gran escala es la implementación de la idea de la descentralización, que evita la infección cruzada causada por grandes -escale las reuniones y mejore la eficiencia de detección. , esta vez usamos la última versión ethersV5.0 o superior de Ethereum para vincularnos a la billetera blockchain descentralizada y verificar la firma a través del servicio de back-end Golang1.18.

En el artículo anterior: Las colinas verdes no están ocultas, después de todo, Dongliu, billetera de identidad Web3.0 integrada MetaMask Ethereum inicio de sesión con un solo clic (Tornado6+Vue.js3), usamos la versión ethersV4.0 para vincular la billetera Metamask, backend usando el marco Tornado6.0 basado en Python3.10, para evitar la homogeneización, aquí se reemplaza por Okc wallet, dirección de instalación del complemento del cliente: https://chrome.google.com/webstore/detail/okx-wallet/mcohilncbfahbmgdjkbpemcciiolgcge

Monedero de navegador de enlace front-end

Primero desinstale el proyecto Vue2.0:

npm uninstall vue-cli -g

Aquí, la versión del nodo debe ser superior a 8.9 y la versión de npm debe ser superior a 6;

Luego instale Vue3.0 o superior:

npm install -g @vue/cli

Luego instale pnpm:

npm install -g pnpm

pnpm resuelve el dilema de dependencia de node_modules del npm tradicional, principalmente a través de la combinación de enlaces suaves y enlaces duros, y finalmente logra el propósito de ahorrar espacio en disco, velocidad de instalación rápida, estricta y eficiente, etc. Aquí, se recomienda usar pnpm para gestión de paquetes.

A continuación, instale la biblioteca ethers en el proyecto actual:

pnpm install [email protected] --save

Tenga en cuenta que esta versión requiere v5.0 o superior.

Según la documentación oficial de ethers5.4: https://docs.ethers.io/v5/getting-started/#getting-started–connecting-rpc

La versión ethers5.0 admite operaciones asíncronas asíncronas, lo que mejora la eficiencia.La función asíncrona es una función declarada mediante la palabra clave asíncrona. Es una instancia del constructor AsyncFunction y la palabra clave await está permitida en él. Las palabras clave async y await nos permiten escribir un comportamiento asincrónico basado en promesas de una manera más concisa sin encadenar promesas deliberadamente.

Declare el método de encadenamiento asíncrono:

//链接逻辑  
    connect:async function(){  
  
  
},

Luego solicite vincular la billetera blockchain actual y obtenga la dirección de clave pública de forma asíncrona:

const provider = new ethers.providers.Web3Provider(window.ethereum);  
  
const accounts = await provider.send("eth_requestAccounts", []);

Imprimir dirección de billetera:

console.log(accounts);

como muestra la imagen:

La dirección de clave pública de la billetera okc se ha impreso aquí y luego se genera la firma:

const signer = provider.getSigner();  
  
  
var rightnow = (Date.now()/1000).toFixed(0)  
  
            console.log(rightnow);  
  
            signer.signMessage("Signing in at "+rightnow)  
              .then((signature) => {      
                        //打印签名和公钥  
                        console.log(accounts[0],signature);  
              });

Aquí, el objeto firmante se obtiene firmante a través del objeto proveedor, y luego se llama al método signMessage para realizar la operación de firma.El algoritmo de firma adopta la forma más simple de cadena + marca de tiempo.

El front-end devuelve la firma y la dirección de la clave pública:

0x5cae6c39a56d99d68e7a20c76da0ec387e34249b 
0x1093b6dc7c6ae1340b2ebcf819dac1a7160b69a2abbb14d86a0696bd96d6b36923d5f3f82588f30a9353b327014338f51d4e7a90baa8052791a8017f156b57511c

Verificación de firma de back-end Golang

El propósito de la verificación de firma es fácil de entender, si el cliente es monitoreado por otro software que manipula maliciosamente la dirección de la clave pública al momento de vincular la billetera, es probable que cause pérdidas económicas irreparables al cliente, por lo que todos los datos expuestos en el front-end se perderá. El back-end necesita ser verificado. Previamente, usamos la versión Python3.10 para verificar la firma:

from web3.auto import w3  
from eth_account.messages import defunct_hash_message  
import time  
  
public_address = "0x5cae6c39a56d99d68e7a20c76da0ec387e34249b"  
signature = "0xc7b06789e6710652d8540487055e0e75918c9c4366ec47c9e7008760df1dedd6506a908f466e448481afed3fe009bbdbfdfa16c28585eff68be54d600083d4251b"  
  
  
#rightnow = int(time.time())  
  
rightnow = 1670142219  
  
print(rightnow)  
  
     
original_message = 'Signing in at {}'.format(rightnow)  
  
message_hash = defunct_hash_message(text=original_message)  
  
signer = w3.eth.account.recoverHash(message_hash, signature=signature)  
  
print(signer)

El programa devuelve:

1670142219  
0x5cAE6c39A56d99d68e7A20c76da0ec387e34249b

Aquí, la dirección de la clave pública se analiza inversamente a través de la firma y es consistente con la dirección obtenida por el front-end.

Luego, usamos la versión Golang1.18 para verificar la firma y ver si hay alguna diferencia. Primero, instale Golang1.18, vaya a: Conejo altibajos, cobertura completa, Go lang1.18 tutorial de refinamiento de entrada, de Baiding a Hongru, todas las plataformas (Sublime 4) Go lang entorno de desarrollo para construir EP00

Luego instale la biblioteca Ethereum basada en Golang:

go get github.com/storyicon/sigverify

De acuerdo con las pautas del documento oficial: https://github.com/storyicon/sigverify

Cree el archivo main.go:

package main  
  
import (  
	"fmt"  
  
	ethcommon "github.com/ethereum/go-ethereum/common"  
	"github.com/storyicon/sigverify"  
)  
  
func main() {  
	valid, err := sigverify.VerifyEllipticCurveHexSignatureEx(  
		ethcommon.HexToAddress("0x5cae6c39a56d99d68e7a20c76da0ec387e34249b"),  
		[]byte("Signing in at 1670142219"),  
		"0xc7b06789e6710652d8540487055e0e75918c9c4366ec47c9e7008760df1dedd6506a908f466e448481afed3fe009bbdbfdfa16c28585eff68be54d600083d4251b",  
	)  
	fmt.Println(valid, err) // true <nil>  
}

Aquí, el método sigverify.VerifyEllipticCurveHexSignatureEx tiene tres parámetros, que son la dirección de la clave pública, el conjunto de caracteres de la firma y la cadena de la firma devuelta por el front-end, y el valor de retorno es válido:

➜  mydemo git:(master) ✗ go run "/Users/liuyue/wodfan/work/mydemo/src/mytest.go"  
true <nil>

Si se verifica la firma, devolverá un valor booleano: verdadero.

En este punto, el proceso de verificación de firma de back-end ha terminado.

epílogo

En general, el front-end Ethers utiliza la nueva sintaxis de ES7 async/await para lograr importantes mejoras. Proporciona una forma de vincular de forma asíncrona los objetos de la cartera utilizando un estilo de código síncrono sin bloquear el subproceso principal, mientras que el back-end Golang se utiliza como un compilado. experiencia de lenguaje El proceso de firma es más simple y más conveniente que Python interpretado.

Supongo que te gusta

Origin blog.csdn.net/zcxey2911/article/details/128386219
Recomendado
Clasificación