使用Nodejs部署智能合约

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Nodejs部署智能合约相关的知识,希望对你有一定的参考价值。

参考技术A 实现智能合约的方式很多种,可以用truffle框架来实现,编译,部署。
这里介绍一种简单的使用nodejs来实现,编译,部署的方法。
创建一个nodejs项目,实现一个简单的智能合约。

这个合约实现了一个造币和转币的逻辑。
我们的合约是运行在evm上面的字节码,solidity是静态语言,需要通过编译器生成evm的字节码。

调用 node compile.js ,对BaseToken进行编译,生成字节码。web3中提供了一个部署合约的接口,使用如下,

利用编译生成的abi和bytecode,创建一个合约对象,然后进行发布,等待着异步执行的方法输出合约地址 contractAddress ,这样就完成了部署。不过这种方式有一个问题,就是在发布合约时,你的私钥处于联网状态,
处于安全策略,我们需要尽量避免私钥在联网状态。

以太坊上部署合约是向空地址发送一个附有字节码的签名交易,其中发送者就是这个合约的拥有者。因此我们只需要将合约构建成一笔交易,我们在无网状态下对这笔交易进行签名,然后将签名发送到以太坊网络中。这样能够降低我们私钥被泄漏的风险。
对合约的签名方法如下:

以上对一个合约签名,这里需要注意的问题是,to的地址需要是,空地址。
完成签名之后,我们把这笔交易发送出去就好,最简单的方法就是使用 etherscan的发送Tx的方式 ,一旦发送完成,部署完成,就可以看到合约地址。

在专用网络中使用以太坊钱包部署智能合约的问题

【中文标题】在专用网络中使用以太坊钱包部署智能合约的问题【英文标题】:Issue with deployment of a smart contract using ehereum wallet in private network 【发布时间】:2018-06-20 20:52:01 【问题描述】:

我正在尝试使用以太坊钱包客户端 (mist) 在专用网络中部署智能合约。虽然我有足够的资金,但应用程序抱怨我没有足够的资金来支付 * gas price+value。

智能合约代码:

pragma solidity ^0.4.18;

contract HelloWorld 
  uint256 counter = 0;

  /* Constructor */
  function Increase() public 
    counter++;
  

  function Decrease() public 
    counter--;
  

  function GetCounter() public constant returns(uint256)
    return counter;
  

** genesis.json **

 
  "config":  
    "chainId": 0, 
    "homesteadBlock": 0, 
    "eip155Block": 0, 
    "eip158Block": 0 
  , 
  "alloc" : , 
  "coinbase" : "0x0000000000000000000000000000000000000000", 
  "difficulty" : "0x20000", 
  "extraData" : "", 
  "gasLimit" : "0x2fefd8", 
  "nonce" : "0x0000000000000041", 
  "mixhash" : "0x000000000000000000000000000000000000000000000000000000000‌​0000000", 
  "parentHash" : "0x000000000000000000000000000000000000000000000000000000000‌​0000000", 
  "timestamp" : "0x00"

Geth 命令:

geth --datadir=./chaindata

注意:我是以太坊区块链开发的新手,所以试图通过创建私人网络来获得经验

【问题讨论】:

您能提供您的gethmist 启动脚本吗?我怀疑您的 Mist 实例正在连接到不同的网络,而不是您的私有区块链。另外,请包括您的创世配置。 "config": "chainId": 0, "homesteadBlock": 0, "eip155Block": 0, "eip158Block": 0 , "alloc" : , "coinbase" : “0x0000000000000000000000000000000000000000”, “看病难”: “地址0x20000”, “而额外”: “”, “gasLimit”: “0x2fefd8”, “随机数”: “0x0000000000000041”, “mixhash”: “0x0000000000000000000000000000000000000000000000000000000000000000”, “parentHash”: “0x0000000000000000000000000000000000000000000000000000000000000000” , "时间戳" : "0x00" 打开geth客户端和区块链的步骤1:geth --datadir=./chaindata 打开新客户端的步骤2:geth attach 打开钱包的步骤3:Ehereum wallet(MIST) GUI 【参考方案1】:

有几个问题...

您提到您的帐户有资金。你是如何将以太币添加到你在私有区块链上的账户的?没有迹象表明 genesis.json 配置中正在初始化资金。你应该有这样的东西:


  ...
  "alloc": 
        "ACCOUNT_ADDRESS": 
            "balance": "30000000000000000000000000000"
        
    

这将为您的帐户播种 300 以太币。您需要先在私有区块链上创建一个帐户并在配置文件中使用它。

其次,您在 genesis.json 中将网络 ID 设置为 0。选择不同的 ID。

第三,正如我在评论中提到的,你没有连接到你的私人网络。您需要在启动 geth 时添加--networkid 选项,并传入您在 genesis.json 中设置的网络 ID。启动 geth 时,您应该在输出中看到如下内容:

INFO [01-11|14:21:03] 初始化以太坊协议 版本="[63 62]" 网络=1

网络 ID 是您在 genesis.json 中设置的任何内容。如果您看到network=1,则表示您正在连接到主网络。

如果您刚开始使用 Solidity,您可能需要考虑暂时不要创建私有区块链。您可以将 Remix 用于完全沙盒的开发环境,或使用 Ropsten 测试网络。

【讨论】:

感谢您的建议!我使用 miner.start(3) 开采了一些以太币;使用带有 geth attach 命令的另一个控制台。此时我打开了 MIST,它自动连接到专用网络并显示了开采的以太币数量。在我尝试使用上述 HelloWorld 代码添加合同后

以上是关于使用Nodejs部署智能合约的主要内容,如果未能解决你的问题,请参考以下文章

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

Web3 开发系列教程—创建你的第一个智能合约部署第一个智能合约

以太坊私链账户下智能合约的部署与调用——使用RemixGolangGeth

验证使用 Truffle 部署的智能合约代码

实现CTF智能合约题目的环境部署

Hyperledger Fabric教程--部署Fabric智能合约