如何部署Solidity智能合约到Solana

  • 时间:
  • 浏览:84
  • 来源:区块链技术网

部署Solidity智能合约到Solana

  • 什么是Solana,你如何将Solidity智能合约部署到Solana?
  • Solana是一个新的区块链,专注于性能。它支持像Ethereum那样的智能合约,他们称之为程序。你可以使用Rust开发[4]这些程序,但现在有一个新的项目,将Solidity编译为Solana程序。换句话说,你现在就可以把你用Solidity写的合约部署到Solana上了。

    当然,Solana上的交易成本只是以太坊上的一小部分。那么,这一切是如何进行的呢?

    交易排序(历史证明)

    Solana最大的特点是它的历史证明(PoH),它是基于一串sha256哈希值作为时间的证明。其背后的想法是,要计算hash300,必须先按顺序计算hash1,然后hash2,以此类推。这是因为哈希值的输出是无法预测的,每个中间结果都会自动成为下一个中间结果的输入。

    最新一代的CPU在计算sha256时速度非常快,但同样必须按顺序进行。而这就是为什么人们可以肯定不会有一个定制的ASIC,它的速度是100倍。

    因此,当一个节点收到用hash300签名的交易时,它将知道这些交易将被放在hash200之后,但在hash400之前(假设100个hash为延迟)。这与ETH2.0使用的可验证延迟函数(VDFs)的概念很相似。区别在于证明的验证,对于VDF来说,验证的步骤要比创建证明复杂得多,而对于PoH来说,需要重新计算每个哈希值。那么,如何才能有效地完成PoH验证?

    幸运的是,PoH证明验证,与PoH证明创建不同,可以并行化。证明必须包含每个中间哈希值,然后每个中间哈希值的计算可以被并行验证。这在现代GPU上是可以非常有效地实现的。当然,这样做的缺点是证明尺寸非常大,而且对Solana验证器的硬件要求普遍较高。好处是性能,因为它减少了信息传递的开销+延迟,因为提供了一个预先确定的交易顺序。

    新的交易捆绑在一个批次中,并乐观地[5]通过UDP从当前的领导者流向所有其他验证者,其中每个验证者收到捆绑的不同数据部分。在下一个步骤中,验证者相互之间共享缺失的数据集,所有这些都是并发的、不间断的、流式的,从而获得非常高的性能。

    在Solana上达成的共识(权益证明)

    但PoH并不能解决共识问题,为此Solana使用了PBFT(实用拜占庭容错[6])的一个版本,它与Cosmos的Tendermint共识算法(这里[7]是一个很好的视频概述)称为Tower BFT[8]。但是,由于Solana可以使用PoH作为其区块链时钟,PBFT的共识超时可以直接用这个编码。

    所有先前的PBFT投票的超时时间随着每一个新的投票而翻倍。想象一下,在过去的12秒内,每个验证者都投了32次票的场景。12秒前的最后一票现在有2³²个时段的超时,或大约54年的PoH时间。或者换句话说,你必须在CPU上计算sha256哈希值54年,才能够回滚那次投票。

    Solana的其他功能包括。

    • Turbine[9] -- 一个区块传播协议
    • Gulf Stream[10] -- 无Mempool的交易转发协议
    • Sealevel[11] -- 并发的智能合约运行时间
    • Pipelining[12]--用于验证优化的交易处理单元
    • Cloudbreak[13]--横向扩展的账户数据库
    • Replicators[14] — 分布式账本存储

    如果你想了解更多,请查看Solana的文档[15]、白皮书[16]和博客文章[17]。

    部署ERC-20 代币到Solana

    部署Solidity编写的ERC-20到Solana需要安装以下所有工具并运行部署脚本:

    1. 安装Solang

    安装Solang的最佳方式是使用VS Code 插件[18]。它将自动安装正确的solang二进制文件和依赖项。或者,你可以直接[19]下载二进制文件,然后手动[20]安装依赖项。VS Code插件也将为你提供Solang的编译能力,由于支持的功能不同,普通的Solidity插件并不十分准确。

    为了使扩展正常工作,你需要执行下面几个步骤:

    1. 确保在插件设置中选择Solana作为目标

    2. 禁用工作区的solidity插件

    现在让我们拿一个ERC20合约[21]来实验,这里的代码是Openzeppelin的1:1拷贝。

    你还需要初始化软件包并安装所需的依赖项。

    你还需要初始化软件包并安装所需的依赖项。

    $ npm init
    $ npm install @solana/solidity @solana/web3.js

    2. 安装Solana工具套件

    接下来是安装Solana测试套件[22],如果你是在Mac OS上运行,只要运行以下命令:

    $ sh -c "$(curl -sSfL https://release.solana.com/v1.8.5/install)"

    3. 创建ERC-20合约

    现在让我们在包根中取一个ERC20合约[23]作为ERC20.sol,这里的代码几乎是Openzeppelin的1:1拷贝。

    4. 编译Solidity -> Solana

    接下来是安装Solana测试套件[24]。如果你在Mac OS上运行,只要运行以下命令:

    $ solang ERC20.sol --target solana --output build

    这将产生

    • build/ERC20.abi:就像你从Ethereum知道的那样,它是合约的ABI。
    • build/bundle.so: 这里的新内容是编译后的Solana程序[25]。

    5. 部署ERC-20合约

    现在创建以下deploy-erc20.js脚本:

    const { Connection, LAMPORTS_PER_SOL, Keypair } = require('@solana/web3.js')
    const { Contract, publicKeyToHex } = require('@solana/solidity')
    const { readFileSync } = require('fs')

    const ERC20_ABI = JSON.parse(readFileSync('./build/ERC20.abi''utf8'))
    const BUNDLE_SO = readFileSync('./build/bundle.so')

    ;(async function () {
        console.log('Connecting to your local Solana node ...')
        const connection = new Connection(
            // works only for localhost at the time of writing
            // see https://github.com/solana-labs/solana-solidity.js/issues/8
            'http://localhost:8899'// "https://api.devnet.solana.com",
            'confirmed'
        )

        const payer = Keypair.generate()
        while (true) {
            console.log('Airdropping (from faucet) SOL to a new wallet ...')
            await connection.requestAirdrop(payer.publicKey, 1 * LAMPORTS_PER_SOL)
            await new Promise((resolve) => setTimeout(resolve, 1000))
            if (await connection.getBalance(payer.publicKey)) break
        }

        const address = publicKeyToHex(payer.publicKey)
        const program = Keypair.generate()
        const storage = Keypair.generate()

        const contract = new Contract(connection, program.publicKey, storage.publicKey, ERC20_ABI, payer)

        console.log('Deploying the Solang-compiled ERC20 program ...')
        await contract.load(program, BUNDLE_SO)

        console.log('Program deployment finished, deploying ERC20 ...')
        await contract.deploy('ERC20', ['MyToken''MTO''1000000000000000000'], program, storage, 4096 * 8)

        console.log('Contract deployment finished, invoking contract functions ...')
        const symbol = await contract.symbol()
        const balance = await contract.balanceOf(address)

        console.log(`ERC20 contract for ${symbol} deployed!`)
        console.log(`Wallet at ${address} has a balance of ${balance}.`)

        contract.addEventListener(function (event{
            console.log(`${event.name} event emitted!`)
            console.log(
                `${event.args[0]} sent ${event.args[2]} tokens to
           ${event.args[1]}`

            )
        })

        console.log('Sending tokens will emit a "Transfer" event ...')
        const recipient = Keypair.generate()
        await contract.transfer(publicKeyToHex(recipient.publicKey), '1000000000000000000')

        process.exit(0)
    })()

    在这里,我们使用了

    • Solana Web3[26]
    • Solana Solidty[27]。

    如果你是Dapp开发者并想连接一个钱包,可以看一下Solana钱包适配器[28]。

    现在我们准备运行自己的本地Solana链。

    $ solana-test-validator --reset --quiet

    并在一个单独的标签中运行我们的脚本。

    $ node deploy-erc20.js

    刚刚命令将ERC-20代币部署到的本地Solana链上!

    猜你喜欢

    这些还在运营的野鸡“交易所”不要再碰了

    不管币圈还在任何投资项目中,只要不能安全出金都是骗人。熊大说过野鸡交易所限制用户提现有很多?涉嫌洗钱?涉嫌刷单?涉嫌赌博?资不抵债?系统穿仓等等?没有经历过真正牛熊市交易所很难在这个市场存活。这也就是为什么不建议投资者选择小交易所交易的原因。

    2022-01-18

    OKEX交易所突然更名,意欲何为?

    你好,我是良心哥。我们专门曝光币圈黑幕,怒怼空气币和各种骗局。如果你在币圈被割了韭菜或者被诈骗,来找我,我帮你!

    2022-01-18

    WTF 空投,吃了我的gas费给我拿回来

    WTF ?抱歉,我们不是在骂人。 这是一个正在发钱的项目,开局半小时内持币地址已经突破5000,截止目前发稿2个小时时间持币地址已经破万。登录头部交易所几乎是必然。话不多说,操作手册奉上:

    2022-01-17

    九句话,从零了解Web3

    Web3 这个新鲜的专业名词诞生于 2014 年,在一开始,他被用来描述实现去中心化共识的新型协议,而到如今,它已经成为了对公链生态、应用程序甚至设计理念的统称。犹如「我是谁?」这样的哲学问题一样,「什么是 Web3」这个问题很多人都给出了自己的答案,而且似乎每个人的回答都不尽相同。

    2022-01-17

    零知识证明 - Halo2电路构建源代码导读

    理解Halo2,可以从两部分着手:1/ 电路构建 2/ 证明系统。从开发者的角度看,电路构建是接口。如何通过Halo2构建建电路,这些电路在Halo2的内部如何表示是理解电路构建的关键。本文就从源代码的角度深入浅出讲解Halo2的电路构建。

    2022-01-17