前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >部署Solidity智能合约到Solana

部署Solidity智能合约到Solana

作者头像
Tiny熊
发布2021-12-31 19:42:16
2.1K0
发布2021-12-31 19:42:16
举报
文章被收录于专栏:深入浅出区块链技术
  • 译文出自:登链翻译计划[1]
  • 译者:翻译小组[2]
  • 校对:Tiny 熊[3]

部署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拷贝。

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

代码语言:javascript
复制
$ npm init
$ npm install @solana/solidity @solana/web3.js

2. 安装Solana工具套件

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

代码语言:javascript
复制
$ 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上运行,只要运行以下命令:

代码语言:javascript
复制
$ solang ERC20.sol --target solana --output build

这将产生

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

5. 部署ERC-20合约

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

代码语言:javascript
复制
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链。

代码语言:javascript
复制
$ solana-test-validator --reset --quiet

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

代码语言:javascript
复制
$ node deploy-erc20.js

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

那么Solang到底是什么?

用他们自己的话说。通过Solang,你可以为Solana[29]、Parity Substrate[30]和Ethereum ewasm[31]编译用Solidity[32]编写的智能合约。它使用llvm[33]编译器框架来产生WebAssembly(wasm)或BPF合约代码。

它与Moonbeam[34]和Evmos[35]等克隆EVM的项目相比如何?由于EVM的克隆保留了运行EVM的所有开销,Solang的解决方案应该更有效率,因为它是在链上原生运行的,但也有一些注意事项:

Solang的目标是与Solidity[36] 0.7兼容,但有一些关键的区别:

  • 库总是静态地链接到合约代码中。
  • Solang生成WebAssembly或BPF,而不是EVM。这意味着不支持使用EVM指令的assembly {}语句。
  • Solana不存在gas。有不得超过的计算预算,但没有基于使用的计算单元的收费。
    • 不能在Solana上为外部调用设置gas。
    • tx.gasprice不可用。
    • gasleft()不可用。
  • block.number给出的是槽号而不是块的高度。
  • 你可以使用print()[37]打印输出以进行调试。
  • selfdestructtx.origin不可用。
  • Solana地址是base58编码的,而不是16进制的。可以用特殊的语法来指定一个地址常量
代码语言:javascript
复制
address"<account>"
代码语言:javascript
复制
address foo = address"5GBWmgdFAMqm8ZgAHGobqDqX6tjLxJhv53ygjNtaaAn3sjeZ"
  • 新账户的大小可以用space指定。默认情况下,新账户的大小为1 kilobyte(1024字节),加上任何固定大小字段所需的大小。当你指定空格时,这是在固定尺寸字段(如状态中的字符串)之外的空间。所以,如果你指定space: 0,那么没有任何空间分配给动态的字段。
代码语言:javascript
复制
contract Hatchling {
    string name;

    constructor(string id) payable {
        require(id != "", "name must be provided");
        name = id;
    }
}

contract Adult {
    function test() public {
        Hatchling h = new Hatchling{space: 10240}("luna");
    }
}
  • 那么,这是否可以使用了?
    • 我不确定它是否可以用于生产环境,但即使不是,也肯定很快就可以了。
  • 我们编译的ERC-20合约是否与Solana 上的其他的SPL代币兼容吗?
    • 我也不确定,如果你知道答案,请留言。 来源:https://soliditydeveloper.com/solana

参考资料

[1]登链翻译计划: https://github.com/lbc-team/Pioneer

[2]翻译小组: https://learnblockchain.cn/people/412

[3]Tiny 熊: https://learnblockchain.cn/people/15

[4]开发: https://docs.solana.com/developing/on-chain-programs/developing-rust

[5]乐观地: http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.65.4735

[6]实用拜占庭容错: http://pmg.csail.mit.edu/papers/osdi99.pdf

[7]这里: https://www.youtube.com/watch?v=IafgKJN3nwU

[8]Tower BFT: https://medium.com/solana-labs/tower-bft-solanas-high-performance-implementation-of-pbft-464725911e79

[9]Turbine: https://medium.com/solana-labs/turbine-solanas-block-propagation-protocol-solves-the-scalability-trilemma-2ddba46a51db

[10]Gulf Stream: https://medium.com/solana-labs/gulf-stream-solanas-mempool-less-transaction-forwarding-protocol-d342e72186ad

[11]Sealevel: https://medium.com/solana-labs/sealevel-parallel-processing-thousands-of-smart-contracts-d814b378192

[12]Pipelining: https://solana.com/pipelining-in-solana-the-transaction-processing-unit/

[13]Cloudbreak: https://medium.com/solana-labs/cloudbreak-solanas-horizontally-scaled-state-architecture-9a86679dcbb1

[14]Replicators: https://medium.com/solana-labs/replicators-solanas-solution-to-petabytes-of-blockchain-data-storage-ef79db053fa1

[15]文档: https://docs.solana.com/

[16]白皮书: https://solana.com/solana-whitepaper.pdf

[17]博客文章: https://medium.com/solana-labs

[18]VS Code 插件: https://solang.readthedocs.io/en/latest/extension.html

[19]直接: https://github.com/hyperledger-labs/solang/releases/

[20]手动: https://solang.readthedocs.io/en/latest/installing.html#installing-the-llvm-libraries

[21]ERC20合约: https://gist.github.com/gorgos/92ecded4a501e329dbf16a66517f1908

[22]安装Solana测试套件: https://docs.solana.com/cli/install-solana-cli-tools#use-solanas-install-tool

[23]ERC20合约: https://gist.github.com/gorgos/92ecded4a501e329dbf16a66517f1908

[24]安装Solana测试套件: https://docs.solana.com/cli/install-solana-cli-tools#use-solanas-install-tool

[25]Solana程序: https://docs.solana.com/cli/deploy-a-program

[26]Solana Web3: https://github.com/solana-labs/solana-web3.js

[27]Solana Solidty: https://github.com/solana-labs/solana-solidity.js

[28]Solana钱包适配器: https://github.com/solana-labs/wallet-adapter

[29]Solana: https://www.solana.com/

[30]Parity Substrate: https://substrate.dev/

[31]Ethereum ewasm: https://github.com/ewasm/design

[32]Solidity: https://en.wikipedia.org/wiki/Solidity

[33]llvm: https://www.llvm.org/

[34]Moonbeam: https://moonbeam.network/

[35]Evmos: https://soliditydeveloper.com/evmos

[36]Solidity: https://learnblockchain.cn/docs/solidity/0.7.5/

[37]print(): https://solang.readthedocs.io/en/latest/language.html#print-string

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-12-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 深入浅出区块链技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 部署Solidity智能合约到Solana
    • 交易排序(历史证明)
      • 在Solana上达成的共识(权益证明)
        • 部署ERC-20 代币到Solana
          • 1. 安装Solang
            • 1. 确保在插件设置中选择Solana作为目标
            • 2. 禁用工作区的solidity插件
          • 2. 安装Solana工具套件
            • 3. 创建ERC-20合约
              • 4. 编译Solidity -> Solana
                • 5. 部署ERC-20合约
                • 那么Solang到底是什么?
                  • 参考资料
                  相关产品与服务
                  GPU 云服务器
                  GPU 云服务器(Cloud GPU Service,GPU)是提供 GPU 算力的弹性计算服务,具有超强的并行计算能力,作为 IaaS 层的尖兵利器,服务于生成式AI,自动驾驶,深度学习训练、科学计算、图形图像处理、视频编解码等场景。腾讯云随时提供触手可得的算力,有效缓解您的计算压力,提升业务效率与竞争力。
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档