编写智能合约
以下编写了一个简单的存储智能合约,不是 NFT 智能合约。
1 | // SPDX-License-Identifier: GPL-3.0 |
编译智能合约
在 Remix 上compile刚刚写好的智能合约,然后会出现以下界面,ABI 和 Bytecode 待会需要用到

部署智能合约
这里实现两种部署智能合约的方式,一种是在 geth 控制台部署,一种是使用 Go 实现
geth 控制台部署
1、解锁账户
24-4-15 更新: personal.unlockAccount 被弃用,且新方法不需要
1 | personal.unlockAccount(eth.coinbase) |
2、录入智能合约的 bytecode
1 | var code = "0x" + "608060405234801561001057600080fd5b50610218806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80631003e2d21461004657806360fe47b1146100625780636d4ce63c1461007e575b600080fd5b610060600480360381019061005b9190610106565b61009c565b005b61007c60048036038101906100779190610106565b6100b8565b005b6100866100c2565b6040516100939190610142565b60405180910390f35b60008054826100ab919061018c565b9050806000819055505050565b8060008190555050565b60008054905090565b600080fd5b6000819050919050565b6100e3816100d0565b81146100ee57600080fd5b50565b600081359050610100816100da565b92915050565b60006020828403121561011c5761011b6100cb565b5b600061012a848285016100f1565b91505092915050565b61013c816100d0565b82525050565b60006020820190506101576000830184610133565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610197826100d0565b91506101a2836100d0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156101d7576101d661015d565b5b82820190509291505056fea2646970667358221220cbc928270d8a2ea9cd6f6c4b97793588c6a480da09388d19c6fb1f05d75e718464736f6c634300080f0033" |
3、录入智能合约的 ABI
ABI 需要先经过压缩转义
1 | var abi=JSON.parse('[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"add\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"get\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"}],\"name\":\"set\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]') |
4、部署智能合约
1 | var gas = eth.estimateGas({data: code}) //先估算需要多大的gas |
创建成功后,控制台中会出现以下提示
1 | INFO [04-15|11:43:39.794] Submitted contract creation hash=0xf2503d2c684283a9afb6ab47233a4f2fb01f156135c429586b924a0756d0a8d8 from=0x890fb1799Fe7fA4b8E01Ccf343e088D946fCd556 nonce=1 contract=0xa5D8278723e8808151c2066198619fc02818b526 value=0 |
在控制台输入 myContractInstance,能获得以下信息
1 | { |
24-4-10 更新: 在输入第一行命令的时候,发现报以下错误。原因: PUSH0 opcode 是在 solidity 0.8.20 被引入的,而私链由于还未到 Shanghai 硬分叉,此时还不支持 PUSH0 opcode

5、启动节点挖矿
因为在私链上没有其他节点挖矿,而部署智能合约也是一笔交易,所以需要节点挖矿使这笔交易打包上链,智能合约才部署成功
1 | miner.start() |
6、调用智能合约
第一种调用用于需要花费 gas 的函数,第二种则用于不需要花费 gas 的函数,第一种调用由于也是一笔交易,所以需要节点挖矿上链
1 | contract.function_name.sendTransaction("parameter_1","parameter_2",{from:"account_address"}) |
使用 Go 部署
这里想要实现的效果是,每次新创建一个账户的时候,都会自动部署该智能合约,这一功能用 Go 实现。
1 | package main |
调用智能合约
安装 abigen 工具
1 | go get -u github.com/ethereum/go-ethereum |
生成合约绑定代码
1 | abigen --sol SimpleStorage.sol --pkg main --out SimpleStorage.go |
在 main 函数中添加智能合约绑定和调用智能合约
NewSimpleStorage 不是一个标准函数,而是在使用 abigen 时创建的一个函数,用于创建智能合约的绑定对象
1 | // 创建智能合约绑定 |