开发合约系统(主流合约框架对比)
开发合约系统(主流合约框架对比)
2024-11-22 12:44:28  作者:该有多虚伪  网址:https://m.xinb2b.cn/tech/wfe223481.html

目前主流的合约开发主要有ETH的solidity,Solana的bpf(linux中常用)以及wasm;对于这些合约的开发,每条公链接都有自己的工具和框架,降低开发者在使用中的难度;今天就挑了三个对比,他们分别是 ETH的hardhat工具,Solana的anchor和substrate的ink!,我来为大家科普一下关于开发合约系统?以下内容希望对你有帮助!


开发合约系统

目前主流的合约开发主要有ETH的solidity,Solana的bpf(linux中常用)以及wasm;对于这些合约的开发,每条公链接都有自己的工具和框架,降低开发者在使用中的难度;今天就挑了三个对比,他们分别是 ETH的hardhat工具,Solana的anchor和substrate的ink!。

你将了解如下的内容:

工具/框架的使用方法自动生成的模版以及如何进行简单的开发综合对比框架的使用和代码分析ETH hardhat

官方doc

官方Tutorial

环境配置:因为需要使用 Ethers.js 进行测试和交互,所以需要安装node.js;

安装:npm install --save-dev hardhat

初始化项目:在项目中执行 npx hardhat,经过提示,选择自己要使用的模版,然后会在根目录中创建必要的文件和目录;

.├── README.md├── contracts│ └── Greeter.sol├── hardhat.config.js├── node_modules├── package-lock.json├── package.json├── scripts│ └── sample-script.js└── test └── sample-test.js

可以看到框架已经帮我们分好了目录,其中contracts目录下是具体的solidity合约代码;scripts中是部署合约需要的代码;test中是测试代码;

编译:npx hardhat complie

部署: npx hardhat run scripts/deploy.js --network <network-name>

不带--network参数,会使用hardhat自带的默认网络,使用remote的网络(测试/正式网络)需要修改hardhat,config.js文件,具体的修改代码如下;

require("@nomiclabs/hardhat-waffle");// Go to https://www.alchemyapi.io, sign up, create// a new App in its dashboard, and Replace "KEY" with its keyconst ALCHEMY_API_KEY = "KEY";// Replace this private key with your Ropsten account private key// To export your private key from Metamask, open Metamask and// go to Account Details > Export Private Key// Be aware of NEVER putting real Ether into testing accountsconst ROPSTEN_PRIVATE_KEY = "YOUR ROPSTEN PRIVATE KEY";module.exports = { solidity: "0.8.4", networks: { ropsten: { url: `https://eth-ropsten.alchemyapi.io/v2/${ALCHEMY_API_KEY}`, accounts: [`${ROPSTEN_PRIVATE_KEY}`] } }};

测试:npx hardhat test

由于hardhat自带本地ETH网络,所以不需要启动节点可以通过web3接口进行测试;

Debug:

1. 在合约代码中添加 ```import "hardhat/console.sol";``` 导入日志工具; 2. 在需要使用的代码中通过 ```console.log("info %s", to);```的方式打印一些需要的调试信息; 3. 最后使用``` npx hardhat test``` 会输出调试信息;

Solana Anchor

官方文档

依赖安装配置:

安装rust安装solana安装node.js和yarn并且换源安装anchor

初始化项目:

运行 anchor init <new-project-name>

.├── Anchor.toml // Anchor 配置文件├── Cargo.toml // Rust 工作区配置文件。├── app // 应用程序前端的目录├── migrations // 合约迁移部署的代码│ └── deploy.ts├── node_modules├── package.json├── programs // 合约逻辑代码│ └── test│ ├── Cargo.toml│ ├── Xargo.toml│ └── src └── lib.rs├── tests // 合约测试│ └── test.ts├── tsconfig.json└── yarn.lock

编译:anchor build

编译的命令是下面两条命令的组合;1. `cargo build-bpf`2. `anchor idl parse -f program/src/lib.rs -o target/idl/basic_0.json`

测试:anchor test

部署:anchor deploy

Anchor.toml文件中可以定义部署的网络环境和钱包信息等数据

[provider] cluster = "localnet" wallet = "~/.config/solana/id.json"

示例代码

use anchor_lang::prelude::*;declare_id!("Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS");#[program]mod basic_1 { use super::*; pub fn initialize(ctx: Context<Initialize>, data: u64) -> ProgramResult { let my_account = &mut ctx.accounts.my_account; my_account.data = data; Ok(()) } pub fn update(ctx: Context<Update>, data: u64) -> ProgramResult { let my_account = &mut ctx.accounts.my_account; my_account.data = data; Ok(()) }}#[derive(Accounts)]pub struct Initialize<'info> { #[account(init, payer = user, space = 8 8)] pub my_account: Account<'info, MyAccount>, #[account(mut)] pub user: Signer<'info>, pub system_program: Program<'info, System>,}#[derive(Accounts)]pub struct Update<'info> { #[account(mut)] pub my_account: Account<'info, MyAccount>,}#[account]pub struct MyAccount { pub data: u64,}#[error]pub enum ErrorCode { #[msg("This account cannot update")] CannotUpdate,}

示例代码解析#[program] 下面的mod中包含了instructions,如果你不了解Solana中的instruction,可以看一下官方文档;#[derive(Accounts)] 包含了账户信息,solana中的账户有点绕,你可以理解为Linux中一切皆文件的概念,具体的也需要你看官方文档;#[account] 账户属性,账户初始化的时候需要支付租金和指定size;#[account(init, payer = user, space = 8 8)] #[account(mut)]下面两个派生宏的组合可以自定义错误信息#[error]#[msg("detail error info")]ink!

官方Doc

安装依赖:

安装rust安装cargo和wasm依赖安装contracts-node

初始化项目:

使用命令创建新的合约项目:cargo contract new <new project name>

flipper └─ lib.rs <-- Contract Source Code └─ Cargo.toml <-- Rust Dependencies and ink! Configuration └─ .gitignore

编译:cargo nightly contract build

测试:cargo nightly test

部署:直接在节点的UI界面上传编译之后的文件(target目录下的.contract结尾的文件),substrate的部署和运行时分开的,同一份代码只能部署一份,但是可以有很多的运行实例;

示例代码:

// We are importing the default ink! typesuse ink_lang as ink;#[ink::contract]mod MyContract { // Our struct will use those default ink! types #[ink(storage)] pub struct MyContract { number: u32, } impl MyContract { /// Constructor that initializes the `u32` value to the given `init_value`. #[ink(constructor)] pub fn new(init_value: u32) -> Self { Self { number: init_value, } } #[ink(message)] pub fn my_public_function(&self) { } /// Private function fn my_private_function(&self) { } }}self.env().emit_event() // 用于发出event,向外界提示信息,可以认为和Solana Anchor中的console.log类似self.env().caller() // 表示合约的调用者,solana中会使用programID来表示;

派生宏介绍#[ink::contract] 用于合约的mod#[ink(storage)] 用户合约中的数据存储,具体支持的数据类型,会对rust原生类型做一些封装;#[ink(constructor) 用户初始化构造,不同于以太坊,这里可以有多个constructor;#[ink(message)] 用于constuctor之外的 pub函数;总提对比

平台 / 框架

代码模板优势

特点

难度

ETH / Hardhat

包括部署目录,合约目录,测试目录,拆分比较详细,结构很清晰

主要是对代码模块逻辑进行拆分,没有对solidity进行过多的封装,原生迁移比较容易;

需要了解solidity和javascript

Solana / Anchor

包括部署目录,合约目录,测试目录,拆分比较详细,结构很清晰

进行了很多的宏封装,将很多instructions和account进行包装,虽然简化了开发难度和代码量,但是对与刚了解solana的开发者不太容易理解细节;

需要了解solana的交易和account含义,并且要会rust

Substrate / ink!

单纯地包含了合约代码,比较简洁

进行了一些封装,简化了开发难度,但是自由度比较高,不用太局限于太多的细节;

需要会rust,对小白用户比较友好

,
  • 生物学top期刊有哪些(统一生物异速生长的规模法则新理论)
  • 2024-11-22统一生物异速生长的规模法则新理论导语生命遵循普遍的规模法则(scalinglaw),尤其是代谢过程,其典型是3/4次幂的异速生长律(克莱伯定律)生物利用能量进行生长和繁衍,所以能量代谢的过程和生物的生产过程应该被紧密联系起来在这一原。
  • 购买一台法拉利488全过程(落地400多万的法拉利488一年贬值近百万)
  • 2024-11-22落地400多万的法拉利488一年贬值近百万颜值、性能、奢侈?其实对于法拉利而言,用什么词汇去形容它根本就不重要,因为在这近百年的发展历史当中“法拉利”三个字早就已经成为了它最好的代名词!这就有点像人们提到李小龙第一个想到的就是“功夫”一样大家。
  • 体温计有实心的吗 你不知道的事一页手册
  • 2024-11-22体温计有实心的吗 你不知道的事一页手册知道如何处理满地乱滚的水银球球吗?知道备孕时用什么测量基础体温吗?知道怎么成功装病不上班上手术吗?/雾然而今天我们完全不会谈论这些,着重普及基础知识:体温计回复「体温计」可查看本文P.S.戳百度经验“。
  • 黑执事啵酱穿女装(黑执事最强助手到齐)
  • 2024-11-22黑执事最强助手到齐黑执事:最强助手到齐,复仇开始了,啵酱完胜高尔!啵酱接近监督生们的计划因为高尔的破坏而夭折,他们两个人也算是结下了梁子,睚眦必报的啵酱自然也不会轻易放过这个“说谎精”但是因为高尔身处红舍,啵酱无法进行。
  • 连续变量数据方差(连续变量假设检验)
  • 2024-11-22连续变量假设检验在医学研究中,数据的反应变量不止一个时,称为多变量数据具体看下面示例:示例:某医生需评价一种新食谱对具有家族遗传性心脏病患者的作用16名患者进行了6个月的饮食实验,实验指标为体重和三酰甘油水平,并在实。
  • 新概念1动词变化表 新概念英语一册二册被动语态
  • 2024-11-22新概念1动词变化表 新概念英语一册二册被动语态1.何时运用被动语态:(1)强调动作的接受者:AmericawasdiscoveredbyColumbus.(2)不知谁是动作的执行者:Youarewantedonthephone.(3)作客观说明:。
  • 逆水寒新手玩什么职业(推荐这些职业)
  • 2024-11-22推荐这些职业血河血河是一个比较平衡的职业,不管在防御、输出、还是做任务、PK等等属于近战职业,类似于战士素问素问属于奶妈职业,远攻,加血,是团队中必不可缺的职业很适合女孩玩儿九灵九灵属于法士职业,远攻、攻击力都比。
  • 高中生物必修一知识点总结人教版(高中生物到底怎么学?)
  • 2024-11-22高中生物到底怎么学?从生物圈到细胞生命系统的层次性细胞学说内容(统一性)除病毒以外,细胞是生物体结构和功能的基本单位,也是地球上最基本的生命系统高中生物到底怎么学?首先、基本知识的归纳就是把书本上问的所有知识点有条理的罗。
  • 20个刷新认知的趣味冷知识(6个涨姿势的趣味冷知识)
  • 2024-11-226个涨姿势的趣味冷知识1、古代的人认为,家里的每一个东西都会有专门的神灵进行守护!比如厨房是灶王爷,守护厕所的叫做紫姑!2、古罗马的角斗场十分残酷,只要两个人进入之后,那么就一定要有一方死亡,但是这么血腥的规则却有一个不能。
  • 失去了才知道珍贵(失去了才知道珍惜)
  • 2024-11-22失去了才知道珍惜我好怀念在那个小城市简单佛系的生活,没有压力,每天很自在地想干什么干什么,随心而活,时间自由,活动自由…多好啊!但当时还觉着日子过得太平淡,活得太平庸,无数次的问自己,就这样活着,有意思吗?这样我本来。
  • 常见吊顶类型有几种(这五种吊顶方式)
  • 2024-11-22这五种吊顶方式吊顶几乎是每个家庭必备的装修环节,不仅能起到修饰房梁的作用,还能凸显空间的整体层次感,给人带来不一样的视觉感受随着经济的日益发展,吊顶的形式也日趋多样,那么当下又有哪些比较流行的吊顶方式呢?双眼皮吊顶。
  • 感谢大哥刷礼物的感谢词
  • 2024-11-22感谢大哥刷礼物的感谢词感谢大哥的支持,能够在这里给我刷礼物,破费了,能够得到大哥的赏识我除了感动还是感动,此时此刻的心情无法用言语来表达,因为你的支持是我最大的动力,礼物不重要,重要的是您对我的认可和,祝愿大哥事事顺利,心。