contenido
1. Obtenga el archivo abi
interfaz de contrato
Después de compilar el contrato en la herramienta de remezcla, habrá uno abi
, copie
y luego cree un nuevo archivo xx.abi y pegue la asignación en él.
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
Busque el archivo main.go, ejecute go build y genere el archivo abigen.exe.
Luego colóquelo aquí en el directorio bin
y luego puede verificar aquí que el
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
3. Remix se conecta a la cadena privada
geth
Para iniciar la cadena privada, especifique rpccorsdomain *, de lo contrario no se puede conectar en remix.
El método de selección Web3 Provider
, la conexión predeterminada al puerto de cadena privada 8545
Pero puede ver que no tenemos una cuenta aquí,
por lo que podemos crear una cuenta y podemos verla aquí
después de crear dos
.
4. Implementación del contrato
1. Conéctese a la cadena privada: seleccione Web3 Provider
el número de puerto predeterminado 8545
, si geth
el número de puerto de inicio rpc
es 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")
solo desbloquealo
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
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
No hay dinero, a la mía para hacer dinero.
- 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")
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
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) // 没什么作用
}