以太坊私有链下智能合约部署

上一篇文章实现了搭建私有链,以下进行智能合约的部署

一、 编写合约

简单的乘法例子:

pragma solidity ^0.4.2;
contract test {

   function multiply(uint a) returns(uint d) {
       return a * 7;
   }
}

二、 编译合约

推荐网站:here

得到:Interface 和 Bytecode 和 Web3 deploy

Bytecode: 6060604052341561000f57600080fd5b5b60ab8061001e6000396000f30060606040526000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063c6888fa114603d575b600080fd5b3415604757600080fd5b605b60048080359060200190919050506071565b6040518082815260200191505060405180910390f35b60006007820290505b9190505600a165627a7a723058206f9974e7f2c8329cbc09530d06d001018bfeca369c7cd8f9d565298adbdd2a9c0029

Interface: [{"constant":false,"inputs":[{"name":"a","type":"uint256"}],"name":"multiply","outputs":[{"name":"d","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"}]

Web3 deploy:
var browser_ballot_sol_testContract = web3.eth.contract([{"constant":false,"inputs":[{"name":"a","type":"uint256"}],"name":"multiply","outputs":[{"name":"d","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"}]);
var browser_ballot_sol_test = browser_ballot_sol_testContract.new(
   {
     from: web3.eth.accounts[0],
     data: ‘0x6060604052341561000f57600080fd5b5b60ab8061001e6000396000f30060606040526000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063c6888fa114603d575b600080fd5b3415604757600080fd5b605b60048080359060200190919050506071565b6040518082815260200191505060405180910390f35b60006007820290505b9190505600a165627a7a723058206f9974e7f2c8329cbc09530d06d001018bfeca369c7cd8f9d565298adbdd2a9c0029‘,
     gas: ‘4300000‘
   }, function (e, contract){
    console.log(e, contract);
    if (typeof contract.address !== ‘undefined‘) {
         console.log(‘Contract mined! address: ‘ + contract.address + ‘ transactionHash: ‘ + contract.transactionHash);
    }
 })

三、 部署合约

在部署合约前,我们要明确需要以下几项条件:

  1. 一个有Ether的账户;
  2. 该账户已解锁;
  3. 编译合约得到的abi和code。

所以首先需要做以下工作:

//创建账户
personal.newAccount(‘密码‘)

//挖矿,获得ether
miner.start()
miner.stop()

//账户解锁
personal.unlockAccount("第一个账户地址", "密码")

第一步: 获取abi信息,即上述编译得到的interface

abi = [{"constant":false,"inputs":[{"name":"a","type":"uint256"}],"name":"multiply","outputs":[{"name":"d","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"}]

得到结果:

[{
    constant: false,
    inputs: [{
        name: "a",
        type: "uint256"
    }],
    name: "multiply",
    outputs: [{
        name: "d",
        type: "uint256"
    }],
    payable: false,
    stateMutability: "nonpayable",
    type: "function"
}]
> 

第二步:

multiplyContract = web3.eth.contract(abi)

得到结果:

{
  abi: [{
      constant: false,
      inputs: [{...}],
      name: "multiply",
      outputs: [{...}],
      payable: false,
      stateMutability: "nonpayable",
      type: "function"
  }],
  eth: {
    accounts: ["0xbe98c12f918275591c9a43ec3c7bc44cfca50d2f"],
    blockNumber: 7,
    coinbase: "0xbe98c12f918275591c9a43ec3c7bc44cfca50d2f",
    compile: {
      lll: function(),
      serpent: function(),
      solidity: function()
    },
    defaultAccount: undefined,
    defaultBlock: "latest",
    gasPrice: 18000000000,
    hashrate: 0,
    mining: false,
    pendingTransactions: [],
    protocolVersion: "0x3f",
    syncing: false,
    call: function(),
    ... (一堆function)
}

第三步: 复制 Web3 deploy 到命令行

multiply = multiplyContract.new(
   {
     from: web3.eth.accounts[0],
     data: ‘0x6060604052341561000f57600080fd5b5b60ab8061001e6000396000f30060606040526000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063c6888fa114603d575b600080fd5b3415604757600080fd5b605b60048080359060200190919050506071565b6040518082815260200191505060405180910390f35b60006007820290505b9190505600a165627a7a723058206f9974e7f2c8329cbc09530d06d001018bfeca369c7cd8f9d565298adbdd2a9c0029‘,
     gas: ‘4300000‘  //改为300000
   }, function (e, contract){
    console.log(e, contract);
    if (typeof contract.address !== ‘undefined‘) {
         console.log(‘Contract mined! address: ‘ + contract.address + ‘ transactionHash: ‘ + contract.transactionHash);
    }
 })

得到结果

{
  abi: [{
      constant: false,
      inputs: [{...}],
      name: "multiply",
      outputs: [{...}],
      payable: false,
      stateMutability: "nonpayable",
      type: "function"
  }],
  address: undefined,
  transactionHash: "0x87400471a0e32edcfa9e1ca621d08a318e9abb85299d280deb8bc199e118427f"
}

==> 在这一步,可能你会得到一条错误信息:

invalid sender undefined

解决方法: 在genesis.json文件中,chainId 不能设置为0。 如果你完全按照github上给的官方配置文件,就会产生这个错误

==> 在这一步,可能你会得到一条错误信息:

Error: authentication needed: password or unlock undefined

解决方法:先解锁账户啦

personal.unlockAccount("第一个账户地址", "密码")

==> 在这一步,可能你还会遇到这个问题:

Error: exceeds block gas limit undefined
The contract code couldn‘t be stored, please check your gas amount. undefined

解决方法:把gas改为300000。直接从那个网站的Web3 deploy 复制可能是4300000,然后改成300000,就没问题了。

猜测原因:

eth.getBlock("pending").gasLimit
web3.eth.estimateGas({data: bytecode})

可以先输入这两条来预判一下范围,取中间值。

第四步:然后我们需要挖矿确认

miner.start()

等待一会,你会得到一条信息:
Contract mined! address: 0xdb385bc97ed9fbac62920102d5edc7c4bf993c79 transactionHash: 0x87400471a0e32edcfa9e1ca621d08a318e9abb85299d280deb8bc199e118427f
==> 就代表部署成功啦。

miner.stop()

四、合约交互

第一步:获取合约对象

MyContract = eth.contract(abi)

得到结果:

{
  abi: [{
      constant: false,
      inputs: [{...}],
      name: "multiply",
      outputs: [{...}],
      payable: false,
      stateMutability: "nonpayable",
      type: "function"
  }],
  eth: {
    accounts: ["0xd88ad6d115ed640b69f01e24ff1433f75d5c8f87"],
    blockNumber: 4,
    coinbase: "0xd88ad6d115ed640b69f01e24ff1433f75d5c8f87",
    compile: {
      lll: function(),
      serpent: function(),
      solidity: function()
    },
    defaultAccount: undefined,
    defaultBlock: "latest",
    gasPrice: 18000000000,
    hashrate: 612,
    mining: false,
    pendingTransactions: [],

    ...(一堆function)
}

第二步:实例化合约

myContract = MyContract.at(multiply.address)

得到结果:

{
  abi: [{
      constant: false,
      inputs: [{...}],
      name: "multiply",
      outputs: [{...}],
      payable: false,
      stateMutability: "nonpayable",
      type: "function"
  }],
  address: "0xdb385bc97ed9fbac62920102d5edc7c4bf993c79",
  transactionHash: null,
  allEvents: function(),
  multiply: function()
}

第三步:调用合约

myContract.multiply.call(5)

得到结果:

35

五、在电脑B调用该合约

确定两台电脑已成功连接。电脑B上新建账户,并解锁。

1. abi = [{constant:false,inputs:[{name:‘a‘,type:‘uint256‘}],name:‘multiply‘,outputs:[{name:‘d‘,type:‘uint256‘}],type:‘function‘}]  //合约的abi
2. address = 0xdb385bc97ed9fbac62920102d5edc7c4bf993c79  // 合约地址
3. myContract = web3.eth.contract(abi).at(address)

==> 然后就可以调用使用了 myContract.multiply.call(5)
得到结果:35

原文地址:https://www.cnblogs.com/beyang/p/8469311.html

时间: 2024-07-30 04:41:43

以太坊私有链下智能合约部署的相关文章

以太坊私链与智能合约部署学习(博主修正篇)—— 第一篇

以太坊(Ethereum)自2017年5月诞生以来,发展迅速.作为了一个小白,博主初步打算上个车,过个瘾.那什么是以太坊?请参看度娘的解释(https://baike.baidu.com/item/%E4%BB%A5%E5%A4%AA%E5%9D%8A/20865117?fr=aladdin). 事物是个新事特,也是个好东西,但资料不多,所以小白博主也只能慢慢找寻资料,慢慢记录自己填坑的过程.  第一篇的主题是:以太坊私链的创建:)    一.配置环境与软件安装 1.安装geth 以下的资料来自

如何搭建以太坊私有链

在开发以太坊时,很多时候需要搭建一条以太坊私有链,通过本文一起看看如何在Mac上进行搭建. 写在前面 阅读本文前,你应该对以太坊语言有所了解,如果你还不了解,建议你先看以太坊是什么 go-ethereum客户端安装 Go-ethereum客户端通常被称为Geth,它是个命令行界面,执行在Go上实现的完整以太坊节点.Geth得益于Go语言的多平台特性,支持在多个平台上使用(比如Windows.Linux.Mac).Geth是以太坊协议的具体落地实现,通过Geth,你可以实现以太坊的各种功能,如账户

使用 Go-Ethereum 1.7.2搭建以太坊私有链

1.什么是Ethereum(以太坊) 以太坊(Ethereum)并不是一个机构,而是一款能够在区块链上实现智能合约.开源的底层系统,以太坊从诞生到2017年5月,短短3年半时间,全球已有200多个以太坊应用诞生.以太坊是一个平台和一种编程语言,使开发人员能够建立和发布下一代分布式应用. 以太坊可以用来编程,分散,担保和交易任何事物:投票,域名,金融交易所,众筹,公司管理, 合同和大部分的协议,知识产权,还有得益于硬件集成的智能资产. 以太坊的白皮书:https://github.com/ethe

区块链,使用 Go-Ethereum 搭建以太坊私有链

1.什么是Ethereum(以太坊) 以太坊(Ethereum)并不是一个机构,而是一款能够在区块链上实现智能合约.开源的底层系统,以太坊从诞生到2017年5月,短短3年半时间,全球已有200多个以太坊应用诞生.以太坊是一个平台和一种编程语言,使开发人员能够建立和发布下一代分布式应用. 以太坊可以用来编程,分散,担保和交易任何事物:投票,域名,金融交易所,众筹,公司管理, 合同和大部分的协议,知识产权,还有得益于硬件集成的智能资产. 以太坊的白皮书:https://github.com/ethe

什么是以太坊?什么是智能合约?

以太坊是一个分布式的计算平台.它会生成一个名为Ether的加密货币.程序员可以在以太坊区块链上写下"智能合约",这些以太坊智能合约会根据代码自动执行. 以太坊是什么? 以太坊经常与比特币相提并论,但情况却有所不同.比特币是一种加密货币和分布式支付网络,允许比特币在用户之间转移. 相关:什么是比特币?它是如何工作的? 以太坊项目有更大的目标.正如Ethereum网站所说,"以太坊是一个运行智能合约的分布式平台".这些智能合约运行在"以太坊虚拟机"上

以太坊私有链挖矿操作指南

先总体说一下步骤: 1.操作系统准备 linux(centos6.7) 2. golang安装 3.下载以太坊 4. 安装以太坊 5. 创世区块文件的准备 6. 创世区块初始化 7. 以太坊启动 ===================================== 1.最好是centos6.5以上的操作系统 2. 使用yum命令安装golang语言 [[email protected] src]# yum install golang 3. 下载以太坊源码,演示用的链接是 https://

Windows 10下搭建以太坊私有链环境

通过网上的资料,结合自己的搭建的eth环境,希望能对大家搭建区块链环境有所帮助了解.下面开始进入准备. 本次是windows环境下的私有链环境搭建,所以需要做以下准备: 1.win10系统(家庭版),64位 2.以太坊钱包Ethereum-Wallet-win64-0-10-0(我用的版本0.10.0) 3.以太坊geth客户端(我用的是1.4.11版) 1.1 安装geth Windows要求必须是64位系统,从官方网站下载编译好的win64客户端,下载解压后只有一个Geth.exe,运行安装

区块链入门(2):搭建以太坊私有链(private network of ethereum),以及挖矿的操作..

在做一些测试工作的时候, 为了方便控制以及更快的进入真正的测试工作,可能需要搭建一个私有的以太坊网络. 而以太坊节点之间能够互相链接需要满足1)相同的协议版本2)相同的networkid,所以搭建私有网络最方便的方法就是通过geth命令中的--networkid选项,设置一个与主网不同的networkid(主网的networkid为1),这也是官方推荐的方法. 下面开始建立私有以太坊网络: mkdir private-geth cd private-geth 建立创世纪区块文件,是一个json格

CentOS7搭建以太坊私有链

1. 环境准备:Win10 64位安装 VM VirtualBox,操作系统版本: CentOS-7-x86_64-Everything-1611.iso(7.71G). 切换root账号,方便安装程序 2. 安装Golang 1.9以上版本,yum安装的可以是1.8.3,所以要手动下载安装 国内镜像:https://studygolang.com/dl #cd /usr #wget https://studygolang.com/dl/golang/go1.10.1.linux-amd64.t