[Contrato inteligente] Go language llamadas contratos inteligentes | geth

1. Obtenga el archivo abi

interfaz de contrato

Después de compilar el contrato en la herramienta de remezcla, habrá uno abi, copie
inserte la descripción de la imagen aquí
y luego cree un nuevo archivo xx.abi y pegue la asignación en él.

inserte la descripción de la imagen aquí

Nota: el código ha cambiado y también cambiará después de volver a compilar abi, así que asegúrese de usar la últimaabi

También puede generar abi a través de solc:

solc --bin test.sol -o test.abi

2. Instalar la herramienta abigen

Se utiliza para generar archivos go,

Descargar archivo: dirección de github

inserte la descripción de la imagen aquí

inserte la descripción de la imagen aquí
Busque el archivo main.go, ejecute go build y genere el archivo abigen.exe.
inserte la descripción de la imagen aquí
Luego colóquelo aquí en el directorio bin
inserte la descripción de la imagen aquíy luego puede verificar aquí que el
inserte la descripción de la imagen aquí
archivo go se genera usando la herramienta abigen

abigen --abi xx.abi --pkg packagename --type structname --out xx.go
  • los archivos abi están disponibles cuando se implementa remix
  • pkg especifica el nombre del paquete del archivo de salida, que es el nombre del paquete
  • tipo especifica el nombre de la estructura del contrato
  • out especifica el nombre del archivo go de salida

inserte la descripción de la imagen aquí

3. Remix se conecta a la cadena privada

gethPara iniciar la cadena privada, especifique rpccorsdomain *, de lo contrario no se puede conectar en remix.
inserte la descripción de la imagen aquí

El método de selección Web3 Provider, la conexión predeterminada al puerto de cadena privada 8545

inserte la descripción de la imagen aquí
Pero puede ver que no tenemos una cuenta aquí,
inserte la descripción de la imagen aquí
por lo que podemos crear una cuenta y podemos verla aquí
inserte la descripción de la imagen aquí
después de crear dos
inserte la descripción de la imagen aquí
.

4. Implementación del contrato

1. Conéctese a la cadena privada: seleccione Web3 Providerel número de puerto predeterminado 8545, si gethel número de puerto de inicio rpces inconsistente, cámbielo al mismo
2. Implemente el contrato

Pueden ocurrir los siguientes errores y las soluciones se enumeran en consecuencia
1 .Error: se necesita autenticación: contraseña o desbloqueo: este tipo de error se puede usar para desbloquear la cuenta Desbloqueo de la cuenta
: personal.unlockAccount("dirección de la cuenta")

inserte la descripción de la imagen aquí
solo desbloquealo
inserte la descripción de la imagen aquí

2. Error devuelto: excede el límite de gas del bloque: cuando se produce este error, mire el límite de gas del número de bloque y cámbielo a siempre durante el despliegue
Obtenga el número de bloque: eth.blockNumber
Obtenga la información detallada de acuerdo con el número de bloque: eth.getBlock(0) verá el límite de gas El valor de , el límite de gas en el momento de la implementación no puede ser mayor que este
inserte la descripción de la imagen aquíinserte la descripción de la imagen aquí

3. Error devuelto: fondos insuficientes para gas * precio + valor: la implementación del contrato requiere una tarifa de manejo, que debe ganarse a través de la minería

inserte la descripción de la imagen aquí
No hay dinero, a la mía para hacer dinero.
inserte la descripción de la imagen aquí

  • Comience a minar con el número especificado de subprocesos: miner.start(1)
  • Dejar de minar: miner.stop()
  • Comprobar si la minería está en curso: eth.mining verdadero: minería, falso: no minería
  • Obtenga una matriz de direcciones de cuenta: eth.accounts
  • Obtenga la dirección de minería: eth.coinbase es la primera cuenta creada por defecto
  • Verifique el saldo de la primera cuenta: eth.getBalance(eth.accounts[0])
  • Obtener el saldo de la cuenta especificada: eth.getBalance("dirección de la cuenta")

inserte la descripción de la imagen aquí

5. Inicializar el bloque de génesis del nodo de la cadena privada

Cree un nuevo archivo genesis.json con el siguiente contenido

{
    
    
    "config":{
    
    
        "chainId":15,
        "homesteadBlock":0,
        "eip155Block":0,
        "eip158Block":0
    },
    "coinbase":"0x0000000000000000000000000000000000000000",
    "difficulty":"0x40000",
    "extraData":"",
    "gasLimit":"0xffffffff",
    "nonce":"0x0000000000000042",
    "mixhash":"0x0000000000000000000000000000000000000000000000000000000000000000",
    "parentHash":"0x0000000000000000000000000000000000000000000000000000000000000000",
    "timestamp":"0x00",
    "alloc":{
    
    

    }
}

significado:

  • coinbase: dirección de la cuenta de minería, complete casualmente, puede configurarla más tarde, generalmente el primer usuario creado por defecto
  • dificultad: establezca la dificultad del bloque actual. Si la dificultad es demasiado alta, será difícil para la minería de CPU. Establezca una dificultad más baja aquí.
  • gasLimit: Este valor establece el límite en el consumo total de GAS, que se utiliza para limitar la suma de la información de la transacción que puede contener el bloque. Rellene el valor máximo.
  • nonce: nonce es un número aleatorio de 64 bits utilizado para la minería. Tenga en cuenta que la configuración de él y mixhash debe cumplir con el papel amarillo de Ethereum
  • mixhash: usado para minar en conjunto con nonce, el hash generado por parte del bloque anterior.
  • parentHash: El valor hash del bloque anterior, porque es un bloque de génesis, por lo que este valor es 0extraData:
  • marca de tiempo: establece la marca de tiempo del bloque de génesis
  • alloc: Se usa para preestablecer una cuenta y la cantidad de ether en la cuenta. Debido a que la minería de cadena privada es más fácil, no necesitamos preestablecer una cuenta con monedas, y podemos crearla nosotros mismos cuando lo necesitemos.

cmd ingresa la ruta donde se almacena el archivo json

geth -datadir "fanone" init genesis.json

inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquíinserte la descripción de la imagen aquí

6. Implementación del contrato

Debe pagar una tarifa de manejo al implementar
http://ethscan.hubwiz.com/

7. Invocar

github.com/ethereum/go-ethereum v1.10.0

package main

import (
    "github.com/ethereum/go-ethereum/ethclient"
    "github.com/ethereum/go-ethereum/common"
    "eth_block/utils/contract/abi"
    "fmt"
    "github.com/ethereum/go-ethereum/accounts/abi/bind"
)
func main() {
    
    

    // 连接rpc
    client,err := ethclient.Dial("http://127.0.0.1:8545")

    // 定义要操作合约的账户地址
    addr := "0x29794ab2ed6c47faff7ebdd6dcdd71a263e25460"
    // 将字符串地址转为common.Address
    common_addr := common.HexToAddress(addr)

    if err != nil {
    
    
        panic("连接以太坊合约出错")
    }

    // 创建合约对象
    contract_obj,err11 := contract.NewTestAddress(common_addr,client)
    if err11 !=nil {
    
    
        panic("创建合约对象出错")
    }

    fmt.Println(contract_obj.TestAddressCaller) // Caller访问函数
    fmt.Println(contract_obj.TestAddressTransactor) // Transactor 有函数
    fmt.Println(contract_obj.TestAddressFilterer)  // 没什么作用
}

Supongo que te gusta

Origin blog.csdn.net/weixin_45304503/article/details/119466277
Recomendado
Clasificación