仅使用 EVM API 在区块链上部署智能合约,而不使用 geth 或 tuffle 或 ganache?

Posted

技术标签:

【中文标题】仅使用 EVM API 在区块链上部署智能合约,而不使用 geth 或 tuffle 或 ganache?【英文标题】:Deploy smart contract on blockchain only using EVM API without using geth or tuffle or ganache? 【发布时间】:2020-03-09 00:26:40 【问题描述】:

我已经使用 node js 为物联网用例实现了我的个人区块链,所以我现在想在不使用 geth 或 tuffle 或 ganache 或 Remix 或 web3.js 的情况下将智能合约代码部署到这个区块链中,所以我的目标是使用 EVM API只是为了编译和执行智能合约。 那么,如何?

【问题讨论】:

不清楚您在问什么...您使用的是以太坊分叉还是具有 EVM 功能的东西?您提到使用 Node.js “实现了个人区块链”。除非您构建了对某些 EVM 解释器的支持,否则它将无法运行 EVM 字节码。如果您要连接到诸如 Geth 或 Parity from 节点之类的东西,您可以直接部署字节码。你能澄清一下吗? 如果不运行节点,那么 EVM 是从哪里来的? 也许 OP 正在询问如何在 OP 部署到自己的区块链时创建 EVM 解释器 我成功编译并生成了字节码和 ABI 以及操作码,但我想看看智能合约代码的结果!除此之外,我如何将此字节码更改为地址,并在我询问地址时执行字节码。 【参考方案1】:

您可以查看合同 ABI 规范

关注here

合约应用程序二进制接口 (ABI) 是 从外部与以太坊生态系统中的合约交互 区块链和合约间交互。数据是 根据其类型进行编码,如本规范中所述。这 编码不是自我描述的,因此需要一个模式才能 解码。

还有,

要与以太坊集成,需要启用 RPC / IPC 的以太坊客户端节点,如 Geth, parityquorum 等。

如果您只是对从合约中检索现有数据或从以太坊公共链发送离线签名交易感兴趣,您可以使用像 Infura 这样的公共节点,而无需安装像 Parity 或 Geth 这样的本地客户端。

对于智能合约开发,您还可以安装Test RPC,它将在内存中创建一个没有松露或甘纳许的网络。

testrpc 是一个基于 Node.js 的以太坊客户端,用于测试和 发展。它使用 ethereumjs 来模拟完整的客户端行为和 使开发以太坊应用程序的速度更快。它还包括 所有流行的 RPC 功能和特性(如事件)并且可以运行 确定性地使开发变得轻而易举。

有关 testrpc 的更多详细信息,请关注here

安装 testrpc

npm install -g ethereumjs-testrpc

注意

Ganache CLI 是最新版本的 TestRPC:一个快速且可定制的 区块链模拟器。它允许您调用区块链 无需运行实际以太坊节点的开销。

安装 ganache-cli

npm install -g ganache-cli

步骤:-

    为物联网应用创建智能合约。 使用 nodejs 的 solc solidity 编译器编译合约

    从编译好的JS合约对象中获取接口对象

    字节码字符串,它是 合同基本上是一组(某种)汇编指令 让以太坊虚拟机执行

    将合约部署到 testrpc 网络

here 是不使用松露或甘纳许的详细解决方案

仅使用字节码进行部署

另请参阅以仅使用字节码进行部署:here 和 here 和 Yellow paper

【讨论】:

感谢您的帮助,但目标是仅使用 EVM js,因为我实现了不同的区块链(我的区块链用于物联网而不是加密。 您需要编译合约并部署到网络..不需要任何工具或框架....工具让一切变得简单......您可以为物联网创建智能合约......编译它并部署到网络......为此,但网络应该启动并运行 谢谢你我明白了,但我想在我自己的区块链上而不是在网络上部署合约 你自己的网络是什么意思。以太坊支持私有区块链网络。所以你需要创建你自己的网络。然后在上面部署你的智能合约。 我正在深入研究 etheurum 不使用 etheurum(所以请尝试由我存储智能合约而不使用 etheurum【参考方案2】:

编译你的合约(结果文件是/build/contracts/YourContract.json),然后在没有松露的情况下部署:

// Dependencies
const Web3 = require('web3');
const fs = require("fs");

// Load Parameter
let PROVIDER = ...
let FROM_ACCOUNT = ...
let FROM_PRIVATE_KEY = ...

// Create web3 instance
const web3 = new Web3(new Web3.providers.HttpProvider(PROVIDER), null, transactionConfirmationBlocks: 1);

// Deploy
web3.eth.getTransactionCount(FROM_ACCOUNT)
    .catch(e => 
        console.log(e);
    )
    .then(txCount => 

        // construct the transaction data
        const txData = 
            nonce: web3.utils.toHex(txCount),
            from: FROM_ACCOUNT,
            data: JSON.parse(fs.readFileSync('./build/contracts/YourContract.json', 'utf8')).bytecode,
            gasLimit: web3.utils.toHex(7900000),
            gasPrice: web3.utils.toHex(web3.utils.toWei('12', 'gwei')),
        ;
        console.log('nonce             : ' + txData.nonce);
        console.log('gasPrice          : ' + txData.gasPrice);

        // contract creation
        web3.eth.accounts.signTransaction(txData, FROM_PRIVATE_KEY).then(signed => 
            console.log('sign transaction  : OK');

            web3.eth.sendSignedTransaction(signed.rawTransaction)
                .on("error", error => 
                    console.log('send transaction  : ' + error);
                    throw "DEPLOY FAILED";
                )
                .on("receipt", (receipt) => 
                    console.log('send transaction  : OK');
                    let contractAddress = (receipt.contractAddress === null) ? 'n.a.' : receipt.contractAddress;
                    console.log("CONTRACT_ADDRESS  : " + contractAddress);
                );
            );
        );
    );

依赖 web3 v1.2.1 和 fs v0.0.2

【讨论】:

以上是关于仅使用 EVM API 在区块链上部署智能合约,而不使用 geth 或 tuffle 或 ganache?的主要内容,如果未能解决你的问题,请参考以下文章

以太坊虚拟机 EVMEVMC interpreter

区块链 智能合约 虚拟机 EVM 资料总结

区块链 智能合约 虚拟机 EVM 资料总结

智能合约实战 gas gasprice gaslimit

智能合约实战 gas gasprice gaslimit

Solidity智能合约单元测试介绍