关于abigen编译sol文件生成go报错

Fatal: Failed to generate ABI binding: duplicated identifier "XX_X"(normalized "XXX"), use --alias for renaming
 

遇到这种情况一般是合约里的函数名出现_符号。而在abigen在解析abi文件生成.go文件的时候会要求去掉"_"这个符号.我们这时可以使用重命名的方式来执行编译

abigen --abi XXX.abi --pkg XXX --out XXX.go  --alias XX_X =XXX

加上--alias 选项更改掉提示的名字

#通过abigen生成go文件示例
abigen -sol pdbank.sol -pkg Pdbank -out Pdbank.go

如果提示 

Fatal: Failed to build Solidity contract: exec: "solc": executable file not found in $PATH
 

sudo add-apt-repository ppa:ethereum/ethereum
sudo apt-get update
sudo apt-get install solc
solc --abi Store.sol

它会将其写入名为“Store_sol_Store.abi”的文件中

现在让我们用abigen将ABI转换为我们可以导入的Go文件。 这个新文件将包含我们可以用来与Go应用程序中的智能合约进行交互的所有可用方法。

abigen --abi=Store_sol_Store.abi --pkg=store --out=Store.go

为了从Go部署智能合约,我们还需要将solidity智能合约编译为EVM字节码。 EVM字节码将在事务的数据字段中发送。 在Go文件上生成部署方法需要bin文件。

solc --bin Store.sol

现在我们编译Go合约文件,其中包括deploy方法,因为我们包含了bin文件。

abigen --bin=Store_sol_Store.bin --abi=Store_sol_Store.abi --pkg=store --out=Store.go

solc直接生成go文件示例

solc game.sol --combined-json abi,bin | abigen --pkg game --type storage --out game.go --combined-json - 

如果使用solc进行编译的情况下提示版本不对可以直接用代码丢到remix里面生成abi。然后使用abigen生成对应的go文件

### 使用 Golang 开发智能合约的方法 在区块链领域,Golang 是一种广泛使用的编程语言开发智能合约。以下是关于如何使用 Golang 编写或转换为智能合约的相关信息。 #### 1. 智能合约的基础概念 智能合约是一种用计算机语言编写的程序,用于定义和执行交易的条件、业务逻辑等[^2]。它可以在区块链网络上自动运行并操作账本数据。Fabric 平台中的链码(Chaincode)就是一种典型的智能合约形式,通常由 Golang 实现[^4]。 #### 2. Fabric 中的 Golang 链码开发 Hyperledger Fabric 支持多种语言实现链码,其中 Golang 的性能和稳定性表现优异。开发者可以通过编写 Go 文件来创建链码,并将其部署到区块链网络中。以下是一个简单的例子: ```go package main import ( "fmt" "github.com/hyperledger/fabric-contract-api-go/contractapi" ) type SmartContract struct { contractapi.Contract } func (s *SmartContract) SaveEvidence(ctx contractapi.TransactionContextInterface, key string, value string) error { err := ctx.GetStub().PutState(key, []byte(value)) if err != nil { return fmt.Errorf("failed to save evidence: %v", err) } return nil } func (s *SmartContract) FindEvidence(ctx contractapi.TransactionContextInterface, key string) (*string, error) { valueBytes, err := ctx.GetStub().GetState(key) if err != nil || len(valueBytes) == 0 { return nil, fmt.Errorf("evidence not found with key: %s", key) } valueString := string(valueBytes) return &valueString, nil } func main() { chaincode, err := contractapi.NewChaincode(new(SmartContract)) if err != nil { fmt.Printf("Error creating chaincode: %s", err.Error()) return } server := &contractapi.Server{CCID: "example_cc", Chaincode: chaincode} if err := server.Start(); err != nil { fmt.Printf("Error starting server: %s", err.Error()) } } ``` 上述代码展示了如何通过 Hyperledger Fabric 提供的 `fabric-contract-api-go` 库构建一个基本的存证功能链码[^3]。 #### 3. 将 Golang 转换为 ABI 和接口文件 为了使智能合约能够与其他应用程序交互,通常需要生成 ABI(Application Binary Interface)。对于 Ethereum 生态系统,可以利用工具如 abigen 来完成这一过程。具体流程如下: - 编写 Solidity 或其他兼容的语言版本的智能合约。 - 使用 abigen 工具将 ABI 转化为目标语言(如 Go)的绑定文件[^1]。 然而,在 Hyperledger Fabric 场景下,由于其架构设计不同,无需显式生成 ABI 文件。取而代之的是直接提供 API 接口以便外部调用。 #### 4. BSN 上的 Node.js 智能合约开发 虽然题目提到 Golang,但在某些情况下也可以考虑使用 JavaScript 进行开发。例如,在 Blockchain Service Network (BSN) 环境中支持 Node.js 版本的应用开发。尽管如此,如果目标平台更倾向于 Golang,则应优先采用该方式。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值