智能合约的部署

  • https://blog.csdn.net/qq_40261606/article/details/123249473

在这里插入图片描述

编译

点击图中的 “Compile 1_Storage.sol”

存和取一个数的合约,remix自带

pragma solidity >=0.8.2 <0.9.0;
/**
 * @title Storage
 * @dev Store & retrieve value in a variable
 * @custom:dev-run-script ./scripts/deploy_with_ethers.ts
 */
contract Storage {
    uint256 number;
    function store(uint256 num) public {
        number = num;
    }
    function retrieve() public view returns (uint256){
        return number;
    }
}

部署

复制右侧的 WEB3DEPLOY中的代码,node test.js

const {Web3} = require('web3');
const web3 = new Web3('http://192.168.137.131:8545');
var storageContract = new web3.eth.Contract([{
	"inputs":[],"name":"retrieve",
	"outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"}],
	"name":"store","outputs":[],"stateMutability":"nonpayable","type":"function"
}]);
var storage = storageContract.deploy({
     data: '0x6080604052348015600e575f5ffd5b506101298061001c5f395ff3fe6080604052348015600e575f5ffd5b50600436106030575f3560e01c80632e64cec11460345780636057361d14604e575b5f5ffd5b603a6066565b60405160459190608d565b60405180910390f35b606460048036038101906060919060cd565b606e565b005b5f5f54905090565b805f8190555050565b5f819050919050565b6087816077565b82525050565b5f602082019050609e5f8301846080565b92915050565b5f5ffd5b60af816077565b811460b8575f5ffd5b50565b5f8135905060c78160a8565b92915050565b5f6020828403121560df5760de60a4565b5b5f60ea8482850160bb565b9150509291505056fea26469706673582212202cea03f67c4fe745ae13812f1274b78c1f2a3eddb43bb7dd680a2b702d0b068664736f6c634300081c0033', 
     arguments: [
     ]
}).send({
     from: "0xC2b9f3b30fA3d808002adc50836A28d16c14FaF5", 
     gas: '4700000'
   }, function (e, contract){
    console.log(e, contract);
    if (typeof contract.address !== 'undefined') {
         console.log('Contract mined! address: ' + contract.address + ' transactionHash: ' + contract.transactionHash);
    }
 })

奇怪的是没有打印合约地址,手动查看(合约的那条交易只有FROM 没有TO)

# geth 通过交易 id 找到 contractAddress
> eth.getTransactionReceipt("0xd8fa5bb0052bf19759fed821dc6c8b86bdc70bd8ea31caed92ea36103741048b").contractAddress
"0xb5e4db78acf3a423c7ca5c483064f8d98329b325"

在这里插入图片描述

调用

contractABI, contractAddress

const { Web3 } = require('web3');

// 连接到以太坊节点
const web3 = new Web3('http://192.168.137.131:8545');

var account_1 = "0xC2b9f3b30fA3d808002adc50836A28d16c14FaF5";
var contractAddress = "0xb5e4db78acf3a423c7ca5c483064f8d98329b325";
var contractABI = [
    {
        "inputs": [],
        "name": "retrieve",
        "outputs": [
            {
                "internalType": "uint256",
                "name": "",
                "type": "uint256"
            }
        ],
        "stateMutability": "view",
        "type": "function"
    },
    {
        "inputs": [
            {
                "internalType": "uint256",
                "name": "num",
                "type": "uint256"
            }
        ],
        "name": "store",
        "outputs": [],
        "stateMutability": "nonpayable",
        "type": "function"
    }
];

// 创建智能合约实例
var Storage_Contract = new web3.eth.Contract(contractABI, contractAddress);

// 调用 retrieve 方法
// Storage_Contract.methods.retrieve().call({ from: account_1 })
    // .then((result) => {
        // console.log("结果_retrieve: " + result);
    // })
    // .catch((error) => {
        // console.error("调用失败:", error);
    // });

// 调用 store 方法,存储数据(例如存储数字 10)
Storage_Contract.methods.store(10).send({ from: account_1 })
    .then((receipt) => {
        console.log("结果_store:", receipt);
    })
    .catch((error) => {
        console.error("调用失败:", error);
    });

在这里插入图片描述

ABI

ABI(Application Binary Interface)以太坊采用的是 ABI 编码标准,用于将函数参数转化为字节流。
在这里插入图片描述
在以太坊交易中,input 字段包含了与交易相关的附加数据,通常是调用智能合约函数时传递的数据。对于智能合约的函数调用,这些数据会包括方法的签名(即函数的选择器)和函数参数的编码。具体来说,input 字段通常由两部分组成:

  • 函数选择器(Function Selector):0x6057361d 是函数 store(uint256) 的Keccak-256哈希值的前4个字节

  • 编码的函数参数:每个参数按照其类型进行编码。

这个 input 字段的含义是:向合约的 store 方法传递一个 uint256 类型的参数,值为 a


如果函数是参数是 string 类型

0xc63576e4000000000000000000000000000000000000000000000000000000
0000000020
0000000000000000000000000000000000000000000000000000000000000008
3230303131323235
000000000000000000000000000000000000000000000000
  • 0xc63576e4
  • 字符串的偏移量 0x20
  • 0008 字符串的长度以32字节为单位进行存储
  • 3230303131323235 为 16进制编码后的参数

以前的写法(现在是send()方法):代码第二行明确使用encoderABI()

const signContract = async (contractContent) => {
    const data = contract.methods.signContract(contractContent).encodeABI();
    const gas = await web3.eth.estimateGas({ to: contractAddress, data: data });
    const tx = {
        to: contractAddress,
        data: data,
        gas: gas,
    };

    const signedTx = await web3.eth.accounts.signTransaction(tx, privateKey);
    const receipt = await web3.eth.sendSignedTransaction(signedTx.rawTransaction);
    console.log('Transaction receipt:', receipt);
};
### 部署 Solidity 智能合约 #### 准备工作 为了能够顺利部署 Solidity 智能合约,需要准备相应的开发环境。这通常涉及到安装特定工具和服务来支持智能合约的编写、编译和部署过程[^2]。 #### 编写智能合约 使用 Solidity 进行智能合约编码时,建议利用集成开发环境(IDE),比如 Remix IDE 来简化这一流程。Remix 提供了一个在线平台,在这里可以直接创建新的合约文件,并且提供了直观界面用于编辑源码[^1]。 ```solidity // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract SimpleStorage { uint storedData; function set(uint x) public { storedData = x; } function get() public view returns (uint){ return storedData; } } ``` 上述代码展示了一个简单的存储数据的例子,其中包含了设置(`set`)和获取(`get`)两个基本功能的方法[^3]。 #### 编译智能合约 完成代码书写之后,下一步是在 Remix 中点击“Compile”按钮启动编译器选项卡下的编译任务。确保选择了正确的版本号匹配所使用的 Solidity 版本声明语句中的版本范围。一旦编译无误,则说明语法正确并且可以继续后续步骤。 #### 测试智能合约 在实际部署之前,应该先对本地环境中运行的功能进行全面测试。可以通过模拟账户发起调用来检验各个接口的行为是否符合预期。对于只读性质的操作如查询余额等不会产生成本;而涉及状态变更的动作则需关联钱包支付一定量的 Gas 费用作为手续费[^4]。 #### 发布至区块链 当确认一切正常后就可以考虑将合约正式发布到公有链上了。此时要选择合适的网络节点接入方式——例如 MetaMask 插件浏览器扩展程序可方便快捷地管理私钥并签署交易请求。最终通过发送带有签名的消息给目标地址完成整个上线动作[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值