go语言区块链学习调用智能合约

目录
  • 1. 获取abi文件
    • 合约的接口
  • 2. 安装abigen工具
  • 3. remix连接私有链
  • 4. 合约部署
  • 5. 初始化私有链节点创世块
  • 6. 合约部署
  • 7. 调用

1. 获取abi文件

合约的接口

在remix工具中编译合约后,会有一个abi,复制

然后新建一个xx.abi文件,把赋值的粘贴到里面

注意:代码变了,重新编译后abi也会变,所以一定要用最新的abi

也可以通过solc生成abi:

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

2. 安装abigen工具

用来生成go文件,

下载文件:github地址

找到这个main.go文件,进行go build,生成abigen.exe文件。

然后放在bin目录下的这里

然后就可以在这里验证了

使用abigen工具生成go文件

abigen --abi xx.abi --pkg packagename --type structname --out xx.go

abi 文件在 remix 部署时可以得到pkg 指定输出文件的包名,也就是package 名称type 指定合约结构体名称out 指定输出go文件名称

3. remix连接私有链

geth启动私链,要指定rpccorsdomain *,不然在remix中是连接不上的。

选择Web3 Provider方式,默认连接私有链8545端口

但是可以看到我们这里是没有account的

所以我们可以创建一个account

创建了两个之后

就可以在这里看见了。

4. 合约部署

1.连接私有链:选择Web3 Provider,默认端口号时8545,如果geth启动的rpc端口号不一致,改成一致

2.部署合约

可能会出现下面几种错误,依此列出解决办法
1 .Error: authentication needed: password or unlock:这种报错解锁下账户即可
账户解锁:personal.unlockAccount(“账户地址”)

unlock一下就行了

2 .Returned error: exceeds block gas limit:出现这种错误就看块号的gaslimit,部署时改成一直
获取块号:eth.blockNumber
根据块号获取详细信息:eth.getBlock(0) 会看到gasLimit的值,在部署时的gaslimit不能大于这个

3 .Returned error: insufficient funds for gas * price + value:部署合约需要手续费,得赚取,通过挖矿

没钱, 要挖矿赚钱。

开启指定线程数挖矿:miner.start(1)

停止挖矿:miner.stop()

检查是否在挖矿:eth.mining true:在挖矿,false:不在挖矿

获取账户地址数组:eth.accounts

获取挖矿地址:eth.coinbase 默认第一个创建的账户

查看第一个账户余额:eth.getBalance(eth.accounts[0])

获取指定账户的余额:eth.getBalance(“账户地址”)

5. 初始化私有链节点创世块

新建一个genesis.json文件,内容如下

{
    "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":{

    }
}

含义:

coinbase:挖矿账户地址,随便填,后面可以设置,一般默认第一个创建的用户

difficulty: 设置当前区块的难度,如果难度过大,cpu挖矿就很难,这里设置较小难度

gasLimit: 该值设置对GAS的消耗总量限制,用来限制区块能包含的交易信息总和,填最大即可。

nonce: nonce就是一个64位随机数,用于挖矿,注意他和mixhash的设置需要满足以太坊的Yellow paper

mixhash:与nonce配合用于挖矿,由上一个区块的一部分生成的hash。

parentHash: 上一个区块的hash值,因为是创世块,所以这个值是0extraData:

timestamp: 设置创世块的时间戳

alloc: 用来预置账号以及账号的以太币数量,因为私有链挖矿比较容易,所以我们不需要预置有币的账号,需要的时候自己创建即可以。

cmd进入到存放json文件的路径

geth -datadir "fanone" init genesis.json

6. 合约部署

部署时候需要支付手续费

http://ethscan.hubwiz.com/

7. 调用

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)  // 没什么作用
}

以上就是go语言区块链学习调用智能合约的详细内容,更多关于go语言区块链调用智能合约的资料请关注我们其它相关文章!

(0)

相关推荐

  • Go语言调用其它程序并获得程序输出的方法

    本文实例讲述了Go语言调用其它程序并获得程序输出的方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: package main import (     "exec" // "os/exec" in go1     "fmt" ) func main(){     cmd := exec.Command("ls", "-l")     buf, err := cmd.Output()   

  • Go语言开发区块链只需180行代码(推荐)

    区块链开发用什么语言?通过本文你将使用Go语言开发自己的区块链(或者说用go语言搭建区块链).理解哈希函数是如何保持区块链的完整性.掌握如何用Go语言编程创造并添加新的块.实现多个节点通过竞争生成块.通过浏览器来查看整个链.了解所有其他关于区块链的基础知识. 但是,文章中将不会涉及工作量证明算法(PoW)以及权益证明算法(PoS)这类的共识算法,同时为了让你更清楚得查看区块链以及块的添加,我们将网络交互的过程简化了,关于 P2P 网络比如"全网广播"这个过程等内容将在后续文章中补上.

  • 使用go实现简易比特币区块链公链功能

    使用go语言实现具备以下功能的简易区块链 区块与区块链 共识机制 数据库 Cli命令行操作 交易管理 密码学 数字签名 交易缓存池 P2P网络管理 由于平时还要进行论文工作,项目不定时更新 2021.1.1实现了区块结构.区块链结构.工作量证明pow,剩下部分陆续更新 1.实现区块结构 package BLC import ( "bytes" "crypto/sha256" "time" ) //实现一个最基本的区块结构 type Block s

  • 教你用go语言实现比特币交易功能(Transaction)

    比特币交易 交易(transaction)是比特币的核心所在,而区块链唯一的目的,也正是为了能够安全可靠地存储交易.在区块链中,交易一旦被创建,就没有任何人能够再去修改或是删除它. 对于每一笔新的交易,它的输入会引用(reference)之前一笔交易的输出(这里有个例外,coinbase 交易),引用就是花费的意思.所谓引用之前的一个输出,也就是将之前的一个输出包含在另一笔交易的输入当中,就是花费之前的交易输出.交易的输出,就是币实际存储的地方.下面的图示阐释了交易之间的互相关联: 注意: 有一

  • go语言区块链学习调用智能合约

    目录 1. 获取abi文件 合约的接口 2. 安装abigen工具 3. remix连接私有链 4. 合约部署 5. 初始化私有链节点创世块 6. 合约部署 7. 调用 1. 获取abi文件 合约的接口 在remix工具中编译合约后,会有一个abi,复制 然后新建一个xx.abi文件,把赋值的粘贴到里面 注意:代码变了,重新编译后abi也会变,所以一定要用最新的abi 也可以通过solc生成abi: solc --bin test.sol -o test.abi 2. 安装abigen工具 用来

  • go语言区块链学习调用以太坊

    目录 1. geth 简介 1.1 下载地址: 1.2 安装: 1.3 查看是否安装成功 2. geth命令介绍 3. geth常用命令 3.1 指定数据目录 --datadir 3.2 账户相关 3.3 控制台console: 3.4 删除数据: 3.5 help 3.6 常见错误 4. Go语言调用合约 4.1 启动rpc端口 4.2 Go调用以太坊 4.3 调用接口 eth接口 personal接口 db接口 geth 以太坊智能合约开发中最常用的命令行工具. Geth是由以太坊基金会提供

  • go语言区块链实战实现简单的区块与区块链

    目录 区块链实战 Version 1 区块相关: 区块链相关 区块链实战 字节 字段 说明 4 版本 区块版本号,表示本区块遵守的验证规则 32 父区块头哈希值 前一区块的Merkle树根的哈希值,同样采取SHA256计算 32 Merkle根 该区块中交易的Merkle树根的哈希值,同样采用SHA256计算 4 时间戳 该区块产生的近似时间,精确到秒的UNIX时间戳,必须严格大于前11各区块的时间的中值,同时全节点也会拒接那些超过自己两个小时的时间戳的区块 4 难度目标 该区块工作量证明算法的

  • 利用Python实现智能合约的示例详解

    目录 智能合约 1. 是什么 2. 使用场景 用Python如何实现 1. 设计智能合约 2. 编写智能合约源代码 3. 编译智能合约 4. 部署智能合约 5. 调用智能合约方法 6. 监控智能合约事件 7. 升级智能合约 智能合约 1. 是什么 智能合约是一种由计算机程序编写的自动化合约,它可以在没有第三方干预的情况下执行交易和契约条款.智能合约使用区块链技术实现,可以实现不同的功能,例如交易.投票.代币发放和数据存储等.智能合约的执行是基于其代码的逻辑,并且在既定条件满足时自动执行.智能合约

  • Spring Boot 整合 Fisco Bcos部署、调用区块链合约的案例

    本篇文章介绍 Spring Boot 整合 Fisco Bcos 的相关技术(合约的调用) 简介 在上一节,介绍了Spring Boot 整合 Fisco BCOS的最最基础的案例(SpringBoot成功连接Fisco BCOS,并访问其节点网络 --> 文章链接). 本节,咱们继续介绍Spring Boot 整合 Fisco BCOS的最最重要的技术点:部署.调用区块链合约(基于上一节的工程案例). 主要流程 --> 1.合约开发(省略,因为是案例演示,直接使用 Fisco BCOS自带的

  • web3.js调用链上的方法操作NFT区块链MetaMask详解

    目录 实例化链上方法 MetaMask 首先要初始化web3 实例化链 调用链上方法授权 调用游戏链上方法质押NFT 实例化链上方法 公司的项目全是区块链项目,最近这个项目是要构建一个链上的游戏社区,目前这个功能是用户可以质押NFT到游戏的链上,然后游戏那边就可以有人去参加竞赛,然后质押人可以赎回NFT. MetaMask web3.js MetaMask 浏览器插件用的是小狐狸MetaMask 网络用的是测试网络Rinkeby,记得切换网络,把设置 > 高级 > 显示测试网络 打开 let

  • Python学习入门之区块链详解

    前言 本文将给大家简单介绍关于区块链(BlockChain)的相关知识,并用Python做一简单实现.下面话不多说,来一起看看详细的介绍: 什么是区块链 简单来说,区块链就是把加密数据(区块)按照时间顺序进行叠加(链)生成的永久.不可逆向修改的记录.具体来说,它区块链是由一串使用密码学方法产生的数据块组成的,每一个区块都包含了上一个区块的哈希值(hash),从创始区块(genesis block)开始连接到当前区块,形成块链.每一个区块都确保按照时间顺序在上一个区块之后产生,否则前一个区块的哈希

  • 你应该知道的区块链运作7个核心技术

    区块链运作的7个核心技术,你知道几个? 1.区块链的链接 顾名思义,区块链即由一个个区块组成的链.每个区块分为区块头和区块体(含交易数据)两个部分.区块头包括用来实现区块链接的前一区块的哈希(PrevHash)值(又称散列值)和用于计算挖矿难度的随机数(nonce).前一区块的哈希值实际是上一个区块头部的哈希值,而计算随机数规则决定了哪个矿工可以获得记录区块的权力. 2.共识机制 区块链是伴随比特币诞生的,是比特币的基础技术架构.可以将区块链理解为一个基于互联网的去中心化记账系统.类似比特币这样

  • 如何用120行Java代码写一个自己的区块链

    区块链是目前最热门的话题,广大读者都听说过比特币,或许还有智能合约,相信大家都非常想了解这一切是如何工作的.这篇文章就是帮助你使用 Java 语言来实现一个简单的区块链,用不到 120 行代码来揭示区块链的原理! "用不到120行 Java 代码就能实现一个自己的区块链!" 听起来不可思议吧?有什么能比开发一个自己的区块链更好的学习实践方法呢?那我们就一起来实践下! 因为我们是一家从事互联网金融的科技公司,所以我们采用虚拟资产金额作为这篇文章中的示例数据.大家可以先为自己想一个数字,后

随机推荐