Hablemos de la tecnología de campo de ondas de cadena de bloques, solo hablemos de tecnología

Hablemos de la tecnología de campo de ondas de cadena de bloques, solo hablemos de tecnología

prefacio

Recientemente, debido a que el proyecto usa el protocolo tron ​​para acceder a la cadena de bloques, investigué un poco al respecto y primero clasifiqué la información relevante para que todos la aprendan y la usen;

Hay muy poca información sobre esta parte de Internet, por lo que hay muchas dificultades para aprender, especialmente los muchos conceptos nuevos que contiene, que son difíciles de entender. Por ejemplo, descentralización, dirección, algoritmo de cifrado, factor de algoritmo, significado de clave privada, mnemónico, protocolo trc, contrato inteligente, usdt, etc.;

fondo

Muchas personas entran en contacto con la cadena de bloques, principalmente a través del papel de usdt como un activo estable (también conocido como USDT). ¿Qué es usdt? Exploremos este tema a continuación.

USDT es una moneda virtual que vincula la criptomoneda a la moneda legal dólar estadounidense, un token de la unidad de medida básica; Tether USD (en adelante, USDT), un token basado en la moneda de valor estable dólar estadounidense (USD), lanzado por Tether, 1USDT= Por 1 USD, los usuarios pueden usar USDT y USD para intercambio 1:1 en cualquier momento.

La empresa afirma cumplir estrictamente con la garantía de reserva 1:1, es decir, por cada token USDT emitido, su cuenta bancaria tendrá una garantía de fondo de USD 1. Los usuarios pueden realizar consultas de fondos en la plataforma Tether para garantizar la transparencia, y luego el emisor de activos estables de usdt deposita los activos legales de las instituciones bancarias de terceros para garantizar que mi usdt esté garantizado y no se emita en exceso ni pierda la capacidad de pago;

¿Cómo sabemos que lo que dice la empresa Tether es cierto?

Verificamos este punto a través del sitio web oficial de Tether (https://tether.to/en/supported-protocols/), ingresamos a la interfaz de visualización de transparencia (https://tether.to/en/transparency/) y puedes ver que se ha emitido Cuántas fichas y la situación de la apuesta.

Se puede ver que no solo hay USDT, sino también ESDT y CSDT; de hecho, U representa a los Estados Unidos, E representa a Europa y C representa a China.

Cadena TRON

TRON es una plataforma de cadena de bloques pública de código abierto que admite funciones de contratos inteligentes, también conocida como TRON. Su fundador es Justin Sun, un chino que fotografió el almuerzo de Buffett, Niu. Muy bien, basta de tonterías, introduzcamos algunas cosas.

que es cadena de bloques

Ya que hemos mencionado las cadenas muchas veces, ¿qué son exactamente las cadenas?

De hecho, la cadena puede entenderse como una plataforma que puede hacer algunas cosas. Como ejecutar contratos inteligentes, emitir tokens, etc. Por supuesto, para construir una cadena descentralizada, se deben implementar algunos mecanismos, como construir un mecanismo de confianza, que es el núcleo del núcleo descentralizado. Dicho esto, necesitamos introducir un concepto: el consenso. Es decir, ¿cómo construir una red confiable en un entorno desconfiado distribuido?

consenso

No existe una institución centralizada como un banco en el sistema blockchain, por lo que al transmitir información y transferir valor, el mecanismo de consenso resuelve y garantiza la consistencia y corrección de cada transacción en todos los nodos contables. Este nuevo mecanismo de consenso de blockchain permite una cooperación eficiente y a gran escala para completar la operación sin depender de una organización centralizada.

Prueba de poder de trabajo

La comprensión simple de prueba de trabajo es una prueba, que se utiliza para confirmar que el nodo ha realizado una cierta cantidad de trabajo. Todo el proceso de seguimiento del trabajo suele ser extremadamente ineficiente, y es una forma muy eficiente de demostrar que se ha completado la carga de trabajo correspondiente mediante la certificación de los resultados del trabajo. Bitcoin utiliza el mecanismo PoW en el proceso de generación de bloques. Se necesitan muchos cálculos para obtener números aleatorios razonables para resolver problemas matemáticos. Al verificar los registros y verificar la prueba de la información de la cadena de bloques, puede saber si se ha completado el coeficiente de dificultad especificado. carga de trabajo

Prueba de participación

Es decir, deposite activos en el banco, y el banco le distribuirá los ingresos correspondientes según la cantidad y el tiempo de los activos digitales que tenga. Para los activos de moneda cifrada que utilizan el mecanismo PoS, el sistema asignará los derechos e intereses correspondientes a los nodos en función del producto de la cantidad de monedas en poder del nodo y el tiempo (días de monedas).

Hay algunos otros mecanismos de consenso, y aquí están dos de los mecanismos de consenso más extendidos y comunes.

nodo

TRON es una red distribuida compuesta por muchas computadoras, que necesitan ejecutar software que pueda verificar datos de transacciones y bloques, también llamados nodos. Para ejecutar un nodo, debe tener un software llamado cliente instalado y ejecutándose en su sistema.

"Nodo" hace referencia a un software de cliente en ejecución. El cliente es una implementación de TRON, que puede verificar todas las transacciones en cada bloque, manteniendo la seguridad de la red y la precisión de los datos. En la actualidad, el cliente TRON está implementado por el lenguaje Java, que sigue el protocolo TRON y realiza las funciones de la red TRON y la cadena de bloques.

Todos pueden descargar el código fuente relevante y ejecutar el cliente del nodo, y pueden verificar la transacción por sí mismos; también se puede entender que "nodo" se refiere a un software de cliente en ejecución. El cliente es una implementación de TRON, que puede verificar todas las transacciones en cada bloque, manteniendo la seguridad de la red y la precisión de los datos.

bloquear

Un bloque es una colección que contiene una serie de transacciones, y otro bloque también contiene el valor hash del bloque anterior. Esta implementación conecta cada bloque para formar una cadena.

Para garantizar que todos los nodos en la red TRON mantengan un estado consistente y estén de acuerdo con el historial de transacciones, empaquetamos las transacciones en bloques, lo que permite enviar, confirmar y sincronizar cientos de transacciones en toda la red al mismo tiempo. Cada bloque recién creado contiene el valor hash de su bloque principal. En un momento dado, casi todos los nodos de la red acuerdan la cantidad de bloques y el estado histórico.

TokenTrx

TRX es la criptomoneda más importante en la red TRON, al igual que el token en la cadena Ethereum es eth; TRX es la unidad básica de cuentas en la cadena de bloques TRON, y las actividades de transacción en la cadena tron ​​usan trx como medida estándar .

TRX se puede acuñar, destruir, transferir, etc.; con estas funciones, podemos entender por qué existe el concepto de TRC20-USDT más adelante.

  • Estándar de protocolo TRC20

Sabemos que la cadena TRON admite la operación de contratos inteligentes, y el TRC20 con el que estamos familiarizados es en realidad un tipo de contrato que implementa algunas funciones, como consulta de token, transferencia, autorización y otras funciones.
TRC-20 es un conjunto de estándares de contrato formulados para la emisión de activos simbólicos, es decir, los contratos escritos de conformidad con este estándar se consideran un contrato TRC-20. Cuando todo tipo de billeteras e intercambios están acoplando los activos del contrato TRC-20, a partir de este conjunto de estándares de contrato, puede saber qué funciones y eventos están definidos en este contrato, para facilitar el acoplamiento.

Debe comprender que trc20 es un protocolo, que es un tipo de protocolo bajo la cadena tron ​​de TRON, y también hay trx, trc10, trc721, etc., y la cadena TRON coopera con la empresa emisora ​​usdt para escribir un contrato inteligente, el protocolo Se han realizado varias funciones, como transacción, consulta, autorización, monitoreo de eventos, etc. El trc20-usdt que vemos en la transferencia de dirección es la ejecución de esta transferencia de método de transacción, por lo que podemos transferir el usdt en una dirección a otra dirección;

//trc20 协议中支持的方法
contract TRC20 {
    
    
    function totalSupply() constant returns (uint theTotalSupply);
    function balanceOf(address _owner) constant returns (uint balance);
    function transfer(address _to, uint _value) returns (bool success);
    function transferFrom(address _from, address _to, uint _value) returns (bool success);
    function approve(address _spender, uint _value) returns (bool success);
    function allowance(address _owner, address _spender) constant returns (uint remaining);
    event Transfer(address indexed _from, address indexed _to, uint _value);
    event Approval(address indexed _owner, address indexed _spender, uint _value);
}

Ahora entenderás por qué apareció la palabra TRC20-USDT, y esta es la razón. De la misma manera, si se implementa un contrato inteligente que admite transacciones USDT en la cadena eth, entonces esta cadena puede realizar transacciones de transferencia a través de ETH, como erc20-usdt.

Trc20-usdt

transferir

Para concretar la transacción, primero debe tener una dirección, su propia dirección, la dirección de la otra parte, usdt, trx fuel fee, luego, ¿qué pasos siguen estos elementos para lograr el objetivo?

  • Crear transacción, firmar sin conexión, transmitir

Primero pega el código:

/**
     * 发起 trc20 交易 (目标地址, 数量, 合约地址, 私钥)
     * 地址 默认为 usdt 合约地址
     * @throws Throwable
     */
    public String sendTrc20(String toAddress, BigDecimal amount, String privateKey) throws Throwable {
    
    
        String ownerAddress = TronUtils.getAddressByPrivateKey(privateKey);
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("contract_address", TronUtils.toHexAddress(USDT_CPNTRACT));
        jsonObject.put("function_selector", "transfer(address,uint256)");
        List<Type> inputParameters = new ArrayList<>();
        inputParameters.add(new Address(TronUtils.toHexAddress(toAddress).substring(2)));
        inputParameters.add(new Uint256(amount.multiply(decimal).toBigInteger()));
        String parameter = FunctionEncoder.encodeConstructor(inputParameters);
        jsonObject.put("parameter", parameter);
        jsonObject.put("owner_address", TronUtils.toHexAddress(ownerAddress));
        jsonObject.put("call_value", 0);
        jsonObject.put("fee_limit", 6000000L);
        String trans1 = HttpClientUtils.postJson(tronUrl + "/wallet/triggersmartcontract", jsonObject.toString());
        JSONObject result = JSONObject.parseObject(trans1);
        System.out.println("trc20 result:" + result.toJSONString());
        if (result.containsKey("Error")) {
    
    
            throw new RuntimeException("result.containsKey(\"Error\")");
        }
        JSONObject tx = result.getJSONObject("transaction");
        //填写备注
        tx.getJSONObject("raw_data").put("data", Hex.toHexString("备注信息".getBytes()));
        String txid = TronUtils.signAndBroadcast(tronUrl, privateKey, tx);
        if (txid != null) {
    
    
            System.out.println("txid:" + txid);
            return txid;
        }
        return null;
    }

crear transacción

String ownerAddress = TronUtils.getAddressByPrivateKey(privateKey);
JSONObject jsonObject = new JSONObject();
jsonObject.put("contract_address", TronUtils.toHexAddress(USDT_CPNTRACT));
jsonObject.put("function_selector", "transfer(address,uint256)");
List<Type> inputParameters = new ArrayList<>();
inputParameters.add(new Address(TronUtils.toHexAddress(toAddress).substring(2)));
inputParameters.add(new Uint256(amount.multiply(decimal).toBigInteger()));
String parameter = FunctionEncoder.encodeConstructor(inputParameters);
jsonObject.put("parameter", parameter);
jsonObject.put("owner_address", TronUtils.toHexAddress(ownerAddress));
jsonObject.put("call_value", 0);
jsonObject.put("fee_limit", 6000000L);
String trans1 = HttpClientUtils.postJson(tronUrl + "/wallet/triggersmartcontract", jsonObject.toString());
JSONObject result = JSONObject.parseObject(trans1);
System.out.println("trc20 result:" + result.toJSONString());
        if (result.containsKey("Error")) {
    
    
            throw new RuntimeException("result.containsKey(\"Error\")");
        }
        JSONObject tx = result.getJSONObject("transaction");
        //填写备注
        tx.getJSONObject("raw_data").put("data", Hex.toHexString("备注信息".getBytes()));

Primero obtenga su propia dirección a través de la clave privada, luego especifique la dirección del contrato, es decir, la dirección del contrato de usdt en TRON, y especifique el método en el contrato; luego especifique la dirección de la otra parte, adjunte la tarifa de combustible trx, y cree una transacción llamando a /wallet/triggersmartcontract; hasta ahora, el primer paso está hecho;

Es necesario explicar aquí que el concepto de tarifa de combustible trx es la tarifa del minero que se paga al nodo de la cadena de bloques; si no hay una transacción trx, la transacción no tiene éxito; muchas personas se preguntan por qué el intercambio no necesita trx, eso es porque el intercambio lo ayuda ha pagado, use la billetera web3 para transferir, debe pagar trx;

  • Firmar y transmitir
public static String signAndBroadcast(String tronUrl,String privateKey,JSONObject transaction)throws Throwable{
    
    
        if(tronUrl.endsWith("/")){
    
    
            tronUrl= tronUrl.substring(0,tronUrl.length() - 1);
        }
        Protocol.Transaction tx = packTransaction(transaction.toJSONString());
        byte[] bytes = signTransactionByte(tx.toByteArray(), ByteArray.fromHexString(privateKey));
        String signTransation = Hex.toHexString(bytes);
        JSONObject jsonObjectGB = new JSONObject();
        jsonObjectGB.put("transaction", signTransation);
        String url = tronUrl + "/wallet/broadcasthex";
        String transationCompelet1 = HttpClientUtils.postJson(url, jsonObjectGB.toString());
        JSONObject transationCompelet = JSONObject.parseObject(transationCompelet1);
        System.out.println("signAndBroadcast transationCompelet:" + transationCompelet.toJSONString());
        if (transationCompelet.getBoolean("result")) {
    
    
            return transationCompelet.getString("txid");
        } else {
    
    
            logger.error(String.format("签名交易失败: %s",transationCompelet1));
            return null;
        }
    }
    /**
     * 签名交易
     * @param transaction
     * @param privateKey
     * @return
     * @throws InvalidProtocolBufferException
     * @throws NoSuchAlgorithmException
     */
    public static byte[] signTransactionByte(byte[] transaction, byte[] privateKey) throws InvalidProtocolBufferException, NoSuchAlgorithmException {
    
    
        ECKey ecKey = ECKey.fromPrivate(privateKey);
        Protocol.Transaction transaction1 = Protocol.Transaction.parseFrom(transaction);
        byte[] rawdata = transaction1.getRawData().toByteArray();
        MessageDigest digest = MessageDigest.getInstance("SHA-256");
        digest.update(rawdata,0,rawdata.length);
        byte[] hash= digest.digest();
        byte[] sign = ecKey.sign(hash).toByteArray();
        return transaction1.toBuilder().addSignature(ByteString.copyFrom(sign)).build().toByteArray();
    }
  • Principio de verificación de firma

Cuando se conoce la dirección del iniciador de la transacción (propietario del contrato), la clave pública (recuperación) se deduce a través del mensaje firmado y la clave pública se convierte en una dirección, que se compara con la dirección del iniciador. Si las direcciones coinciden, la verificación es exitosa.

  • Métodos de verificación de firmas

El método de autenticación toma tres parámetros:

  • ID de transacción (es decir, hash de transacción, obtenido al calcular SHA256 a través de Transaction.rawData)
  • Firme el mensaje (es decir, Transaction.signature)
  • Dirección del iniciador (es decir, Transaction.rawData.contract.parameter.ownerAddress, donde el tipo de parámetro es com.google.protobuf.Any, que debe descomprimirse según el tipo de transacción específico)
byte[] bytes = signTransactionByte(tx.toByteArray(), ByteArray.fromHexString(privateKey));
String signTransation = Hex.toHexString(bytes);
  • transmisión

La transmisión puede entenderse como el envío de transacciones. Cualquier interacción con la red TRON se denomina transacción. Una transacción puede ser una transferencia de TRX, comprometer/desbloquear TRX, activar un contrato inteligente, etc.

Solo las transacciones que consumen recursos se registran en la cadena. La tarifa de gas trx mencionada anteriormente es el recurso consumido aquí, cuando otros nodos de la cadena de bloques confirmen su transacción y transmitan la transacción a otros, la transacción se considerará exitosa y se sincronizará con otros nodos de la base de datos;

wrapper.broadcastTransaction(signedTransaction); //return transaction hash if successfully broadcasted, otherwise the error code

String url = tronUrl + "/wallet/broadcasthex";
String transationCompelet1 = HttpClientUtils.postJson(url, jsonObjectGB.toString());
JSONObject transationCompelet = JSONObject.parseObject(transationCompelet1);

Lo anterior es la lógica detrás de la transferencia trc20-usdt. Hablemos de la creación y generación de direcciones de billetera y direcciones de billetera;

Cuenta y Dirección

TRON adopta el modelo de cuenta, la identificación única de la cuenta es la dirección (dirección) y se requiere la firma de clave privada para la operación de la cuenta. Las cuentas constan de un par de claves criptográficas: una clave pública y una clave privada. La clave pública se asigna a una dirección y la clave privada se utiliza para firmar transacciones. Este par de claves no solo puede evitar que la transacción sea manipulada y falsificada, sino que también prueba que la transacción fue efectivamente enviada por el remitente. La clave privada consta de 64 caracteres hexadecimales. La generación de la clave pública se basa en la clave privada, y la clave pública correspondiente se genera mediante el algoritmo de firma digital de curva elíptica (https://en.wikipedia.org/wiki/Elliptic_Curve_Digital_Signature_Algorithm). La dirección se puede calcular en función de la clave pública.

Formato de dirección de cuenta

La dirección de la cuenta de red TRON tiene dos formatos, uno es el formato hexadecimal y el otro es el formato Base58.

Formato hexadecimal: use la clave pública P como entrada, calcule SHA3 para obtener el resultado H, tome los últimos 20 bytes de H, complete un byte 0x41 al frente para obtener la dirección en formato hexadecimal. Por ejemplo:

418840E6C55B9ADA326D211D818C34A994AECED808

Formato Base58: realice un cálculo de verificación base en la dirección en formato hexadecimal para obtener la dirección en formato Base58, y el primer carácter de todas las direcciones de cuenta es T. Por ejemplo:

TNPeeaaFB7K9cmo4uQpcU32zGK8G1NYqeL

Lo que vemos y usamos a menudo es la dirección en formato Base58.

  • que es una billetera

wallet Wallet puede entenderse como una herramienta para administrar direcciones y claves privadas en una cuenta, estas herramientas pueden ser aplicaciones o sitios web, a estas herramientas las llamamos wallets, como nuestras wallets de uso común imToken, tronLink, etc. Cuando usamos la billetera web3, a menudo nos piden que creemos o importemos activamente palabras de entrada y claves privadas para crear billeteras ¿Cuál es el principio detrás de esto?

Podemos entender que la dirección de la billetera de la billetera es la clave pública en este algoritmo, esta dirección es pública, y otros pueden hacer transacciones con usted, etc., y la regla mnemotécnica que se suele decir es pasar la clave privadaalgoritmo reversibleConvertidas en 12 cadenas comunes en inglés, las dos son equivalentes (este proceso es diferente de generar direcciones de billetera y algoritmos de clave privada), cualquiera que entienda los algoritmos de encriptación sabe que los algoritmos de encriptación generalmente no tienen reversibilidad. La clave privada puede derivar la clave pública. pero no al revés. Así que asegúrese de proteger su clave privada y el mnemotécnico que representa la clave privada.

Bueno, después de entender estas cosas, veamos el código:

    /**
     * 离线创建地址
     *
     * @return
     */
    public static Map<String, String> createAddress() {
    
    
        ECKey eCkey = new ECKey(random);
    String privateKey = ByteArray.toHexString(eCkey.getPrivKeyBytes());
        byte[] addressBytes = eCkey.getAddress();
        String hexAddress = ByteArray.toHexString(addressBytes);
        Map<String, String> addressInfo = new HashMap<>(3);
        addressInfo.put("address", toViewAddress(hexAddress));
        addressInfo.put("hexAddress", hexAddress);
        addressInfo.put("privateKey", privateKey);
        return addressInfo;
    }

En este proceso hay mucho conocimiento relacionado con los algoritmos. Lo que hay que explicar es que el algoritmo de encriptación de la billetera tron ​​ha pasado por múltiples conversiones y encriptaciones. Este proceso es muy complicado, por lo que no entraré en detalles. .

búsqueda de direcciones

Si conocemos la dirección de una billetera, podemos consultar sus transacciones de billetera, como todos los protocolos en la cadena tron, como transacciones trx, transacciones trc20-usdt, etc.;

String specificWalletTransferUrl = urlAddress + blockWalletBean.monitorAddress + "/transactions/trc20";
Map<String, String> paraMap = new HashMap<>();
paraMap.put("limit", "30");
paraMap.put("only_confirmed", "true");
paraMap.put("contract_address", "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t");
String content = httpGet(specificWalletTransferUrl, paraMap);
System.out.println("content:" + content);
f (!StringUtils.isEmpty(content)) {
    
    
    JSONObject jsonObject = JSONObject.parseObject(content);
    JSONArray results = jsonObject.getJSONArray("data");
    //解析数据, 获取 wallet address 交易详细信息

escaneo de bloque

public BigInteger getNowBlock() {
    
    
        String url = tronUrl + "/wallet/getnowblock";
        String httpRequest = HttpRequest.get(url).execute().body();
        JSONObject jsonObject1 = JSONObject.parseObject(httpRequest);
        return jsonObject1.getJSONObject("block_header").getJSONObject("raw_data").getBigInteger("number");
    }

escribir al final

De hecho, esta billetera y contrato inteligente tienen muchas funciones. A menudo escuchamos que algunas personas han sido robadas. ¿Cómo lo hicieron esas personas robadas? ¿Cómo podemos prevenirlo? Estas cosas requieren que estudiemos profundamente para entenderlas Misterio, bueno, el espacio es limitado, así que este es el final.

Supongo que te gusta

Origin blog.csdn.net/wan212000/article/details/128168228
Recomendado
Clasificación