使用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" : "0x0000000000000000000000000000000000000000000000000000000000000000",
"parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
"timestamp" : "0x00"
Geth 命令:
geth --datadir=./chaindata
注意:我是以太坊区块链开发的新手,所以试图通过创建私人网络来获得经验
【问题讨论】:
您能提供您的geth
和mist
启动脚本吗?我怀疑您的 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 开发系列教程—创建你的第一个智能合约部署第一个智能合约