首页 > 其他分享 >智能合约开发

智能合约开发

时间:2024-03-24 16:55:48浏览次数:24  
标签:调用 console storage 智能 MyContract 开发 error 合约

1、转账

native币的转账直接用原声的transfer方法

token合约币转账,需要使用合约方法

//以太币转账
address.transfer()
// token币转账
IERC20(address).transferFrom()

2、部署

hardhat的api能直接处理好部署发布代理合约和实现合约

async function main() {
  // 获取合约工厂,保证contracts目录里面有MyContract合约
  const MyContract = await ethers.getContractFactory("MyContract");
  // 部署可升级合约
  console.log("Deploying the upgradable MyContract...");
  const myContract = await upgrades.deployProxy(MyContract, ["MyContractV1"], { initializer: "initialize", gasPrice: '...' });
  console.log("MyContract deployed to:", myContract.address);
}

3、调用

  • 在合约中调用另外合约的方法
// 引入接口类型,然后直接用目标合约地址进行调用
// 因为合约本来就在链上,是可信任环境,不需要签名
Interface(address).methodA(param1, param2, ...)
  • 从客户端调用合约的方法
// Infura等托管节点服务,它们会处理签名
// 如果没有,需要用web3.js先处理签名
const web3 = new Web3('https://mainnet.infura.io/v3/YOUR_INFURA_API_KEY'); const contract = new web3.eth.Contract(contractABI, contractAddress); // 使用call方法。 用于读取合约状态或数据,不会改变合约状态,通常用于查询合约数据,例如获取合约中的变量值或执行只读函数 contract.methods.YOUR_CONTRACT_METHOD().call() .then(result => { console.log('Result:', result); }) .catch(error => { console.error('Error:', error); }); // 使用send方法。用于执行合约方法,会改变合约状态,通常用于执行会改变合约状态的函数 contract.methods.YOUR_CONTRACT_METHOD().send({ from: '0xYOUR_ADDRESS', gas: 1000000 }) .then(receipt => { console.log('Transaction receipt:', receipt); }) .catch(error => { console.error('Error:', error); });

调用的错误一般总共有四类

  • 连接到节点的JSON-RPC错误
  • 交易错误,比如交易因gas不足而失败
  • 合约错误,一般是触发了合约的require、revert等
  • 调用错误
// json-rpc错误
{
  message: 'Internal JSON-RPC error.',
  code: -32603,
  // ...其他信息
}

// 交易错误

{
message: 'Transaction ran out of gas.',
transactionHash: '0x...',
gasUsed: 12345,
}

 4、升级

合约因为功能变更、实现bug等情况,需要升级改动。必须要使用代理模式的合约才可以升级:

  • 升级后,合约原本的storage属性不受影响

  因为storage变量存储在代理合约中,而合约逻辑存储在实现合约中。当你升级实现合约时,代理合约会将调用转发到新的实现合约,但storage变量仍然存储在代理合约中,因此不会发生变化

  • 新增的storage变量应该位于合约结构的末尾,以确保与现有storage变量的布局兼容

  storage变量按照声明的顺序在合约中进行布局。如果你在现有变量之间插入新的storage变量,可能会导致现有变量的布局发生变化,从而导致代理合约无法正确访问storage变量

 

1、solidity不足,导致以太坊分叉

2、缺少权限检查,任何人都可以调用

3、缺少可追溯能力

标签:调用,console,storage,智能,MyContract,开发,error,合约
From: https://www.cnblogs.com/johnchow/p/18081956

相关文章

  • 【C++】Linux多线程开发
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录3.1线程概述3.2创建线程3.3、线程终止3.4连接已经终止线程3.5线程的分离3.6线程取消3.7线程属性3.8线程同步3.9互斥锁3.10死锁3.11读写锁3.12生产者和消费者模型3.13条件......
  • 攻击检测:全局智能监控与精准定位
    随着互联网的快速发展,网络安全问题日益凸显,其中分布式拒绝服务攻击(DDoS)已成为威胁企业网络安全的重要隐患。为了应对这一挑战,我们致力于为客户提供全面的DDoS防护服务,确保您的网络环境安全可靠,让您的业务持续运行。作为专业的网络安全服务提供商,我们拥有丰富的经验和先进的技术手......
  • 智能停车场管理系统设计与实现|jsp+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档
    本项目包含可运行源码+数据库+LW,文末可获取本项目的所有资料。推荐阅读100套最新项目最新ssm+java项目文档+视频演示+可运行源码分享最新jsp+java项目文档+视频演示+可运行源码分享最新SpringBoot项目文档+视频演示+可运行源码分享2024年56套包含java,ssm,springboot的平台......
  • 智能停车场管理系统设计与实现|jsp+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档
    本项目包含可运行源码+数据库+LW,文末可获取本项目的所有资料。推荐阅读100套最新项目最新ssm+java项目文档+视频演示+可运行源码分享最新jsp+java项目文档+视频演示+可运行源码分享最新SpringBoot项目文档+视频演示+可运行源码分享2024年56套包含java,ssm,springboot的平台......
  • 牛逼!本地直接部署开源、离线、免费商用的大模型知识库!快速搭建个人和企业私有智能知识
    快速上手1.环境配置首先,确保你的机器安装了Python3.8-3.11(我们强烈推荐使用Python3.11)。$python--versionPython3.11.7接着,创建一个虚拟环境,并在虚拟环境内安装项目的依赖#拉取仓库$gitclonehttps://github.com/chatchat-space/Langchain-Chatchat.g......
  • qt移植到开发板 sysroot目录是干嘛的,以及busybox作用
    嵌入式开发中,sysroot目录是指定一个系统的根文件系统结构的目录,这在交叉编译过程中非常重要。当你在一台主机上为另一种架构(如嵌入式开发板的ARM架构)编译代码时,你的编译器需要访问目标系统的库和头文件。这些文件组织在一个目录结构中,这个结构模拟了目标设备上的/(根)文件系统......
  • FFmpeg开发笔记(八)Linux交叉编译Android的FFmpeg库
    ​《FFmpeg开发实战:从零基础到短视频上线》一书的“12.1.2 交叉编译Android需要的so库”介绍了如何在Windows环境交叉编译Android所需FFmpeg的so库,接下来介绍如何在Linux环境交叉编译Android所需FFmpeg的so库。1、下载Linux版本的android-ndk-r21e登录Linux服务器(比如华为云的......
  • 【Python + 微信】微信公众号开发避坑指南
    大家好,我是同学小张,日常分享AI知识和实战案例欢迎点赞+关注......
  • TensorFlow的研究应用与开发~深度学习
    TensorFlow是谷歌开源的机器学习框架,它的主要目标是让开发者能够轻松地构建和部署机器学习模型。TensorFlow的核心概念是张量(Tensor)和计算图(Graph)。张量是TensorFlow中的基本数据结构,可以看作是多维数组。张量可以是常量(Constant)或变量(Variable)。常量是指在计算图中的固定值,而......
  • 【R包开发:包的组件】 第4章 包的元数据
    DESCRIPTION(描述文件)的作用是存储包中重要的元数据。当第一次开发包时,你会使用这个文件记录包运行时所需要的包。然而,随着时间的流逝,当开始与他人分享包时,元数据文件变得越来越重要,因为它指定了谁可以使用它(许可证),以及如果包有什么问题时需要和谁(你!)联系。每一个包......