以太坊学习之开发编译部署调用智能合约

简介: 本文根据汪晓明的视频资料整理,ubuntu16.04测试正确。 1.打开geth控制台~$ geth --datadir ~/pengfan/eth --dev在另一个终端输入~$ geth --dev console 2>>file_to_log_output2.

本文根据汪晓明的视频资料整理,ubuntu16.04测试正确。 

1.打开geth控制台

~$ geth --datadir ~/pengfan/eth --dev

在另一个终端输入

~$ geth --dev console 2>>file_to_log_output

2.查看、设置编译器

> eth.getCompilers()
[]

设置solc为编译器

> admin.setSolc("/usr/local/bin/solc")
Error: exit status 1
    at web3.js:3119:20
    at web3.js:6023:15
    at web3.js:4995:36
    at <anonymous>:1:1

提示错误,更改路径成“/usr/bin/solc”

~$ whereis solc
solc: /usr/bin/solc /usr/local/bin/solc
> admin.setSolc("/usr/bin/solc")
"solc, the solidity compiler commandline interface\nVersion: 0.4.7+commit.822622cf.Linux.g++\n"

再次查看

>eth.getCompilers()
["Solidity"]
  • 1
  • 2

3.编写智能合约

>source="contract test { function multiply(uint a) returns(uint d) { return a * 7; }}"
  • 1

4.编译智能合约

> contract = eth.compile.solidity(source).test
  • 1

这里写图片描述

code——编译后的EVM字节码 
info——编译器返回的原数据 
abiDefinition——应用程序二进制接口定义 
compilerOptions——编译参数

5.准备工作:创建账户并激活

在以太坊上创建智能合约就是使用一个外部账户(EOA)向区块链中发送一个交易。

> personal.newAccount("123456")
"0x733bf98c0e218b430db0fe1d4c9ef04341444a82"
> personal.listAccounts
["0x733bf98c0e218b430db0fe1d4c9ef04341444a82"]
> eth.getBalance(personal.listAccounts[0])
0
> miner.start()
true
> eth.blockNumber
2
> eth.getBalance(personal.listAccounts[0])
15000000000000000000
> address=eth.accounts[0]
"0x733bf98c0e218b430db0fe1d4c9ef04341444a82"
> personal.unlockAccount(address,"123456",10000)
true

这里写图片描述 
6.指定创建合约的账户

> address=eth.accounts[0]
"0x733bf98c0e218b430db0fe1d4c9ef04341444a82"

7.部署合约

部署合约就是将编译好的合约字节码以外部账号发送交易到一个空地址的形式部署到以太坊区块链上


> abi=contract.info.abiDefinition

这里写图片描述 
8.

web3.eth.contract可以创建一个合约对象,这个对象可以在指定地址上初始化一个合约:

> MyContract=eth.contract(abi)
{
  abi: [{
      constant: false,
      inputs: [{...}],
      name: "multiply",
      outputs: [{...}],
      payable: false,
      type: "function"
  }],
  eth: {
    accounts: ["0x733bf98c0e218b430db0fe1d4c9ef04341444a82"],
    blockNumber: 14,
    coinbase: "0x733bf98c0e218b430db0fe1d4c9ef04341444a82",
    compile: {
      lll: function(),
      serpent: function(),
      solidity: function()
    },
    defaultAccount: undefined,
    defaultBlock: "latest",
    gasPrice: 20000000000,
    hashrate: 41253,
    mining: true,
    pendingTransactions: [],
    syncing: false,
    call: function(),
    contract: function(abi),
    estimateGas: function(),
    filter: function(fil, callback),
    getAccounts: function(callback),
    getBalance: function(),
    getBlock: function(),
    getBlockNumber: function(callback),
    getBlockTransactionCount: function(),
    getBlockUncleCount: function(),
    getCode: function(),
    getCoinbase: function(callback),
    getCompilers: function(),
    getGasPrice: function(callback),
    getHashrate: function(callback),
    getMining: function(callback),
    getNatSpec: function(),
    getPendingTransactions: function(callback),
    getRawTransaction: function(),
    getRawTransactionFromBlock: function(),
    getStorageAt: function(),
    getSyncing: function(callback),
    getTransaction: function(),
    getTransactionCount: function(),
    getTransactionFromBlock: function(),
    getTransactionReceipt: function(),
    getUncle: function(),
    getWork: function(),
    iban: function(iban),
    icapNamereg: function(),
    isSyncing: function(callback),
    namereg: function(),
    resend: function(),
    sendIBANTransaction: function(),
    sendRawTransaction: function(),
    sendTransaction: function(),
    sign: function(),
    signTransaction: function(),
    submitTransaction: function(),
    submitWork: function()
  },
  at: function(address, callback),
  getData: function(),
  new: function()
}

9.将合约部署到区块链上

>myContract=MyContract.new({from:address,data:contract.code})
{
  abi: [{
      constant: false,
      inputs: [{...}],
      name: "multiply",
      outputs: [{...}],
      payable: false,
      type: "function"
  }],
  address: undefined,
  transactionHash: "0xc99efdc9ffb6f8283556b5de80c76f9bb3b37faf62bb8374ddf79480257866ac"
}

10.检查交易池,有一个待处理事项,要通过挖矿让交易生效,红色框中说明交易已经发送到区块链中了,等待矿工确认。

> txpool.status
{
  pending: 1,
  queued: 0
}
  • 这里写图片描述
> txpool.status
{
  pending: 0,
  queued: 0
}
> miner.stop()
true

11.合约写进区块链之后就可以调用了(合约交互),以下为合约调用代码,通过abi取合约对象

使用eth.contract来定义一个合约类,定义的合约类遵从ABI定义

> Multiply7=eth.contract(contract.info.abiDefinition)
{
  abi: [{
      constant: false,
      inputs: [{...}],
      name: "multiply",
      outputs: [{...}],
      payable: false,
      type: "function"
  }],
  eth: {
    accounts: ["0x733bf98c0e218b430db0fe1d4c9ef04341444a82"],
    blockNumber: 24,
    coinbase: "0x733bf98c0e218b430db0fe1d4c9ef04341444a82",
    compile: {
      lll: function(),
      serpent: function(),
      solidity: function()
    },
    defaultAccount: undefined,
    defaultBlock: "latest",
    gasPrice: 20000000000,
    hashrate: 0,
    mining: false,
    pendingTransactions: [],
    syncing: false,
    call: function(),
    contract: function(abi),
    estimateGas: function(),
    filter: function(fil, callback),
    getAccounts: function(callback),
    getBalance: function(),
    getBlock: function(),
    getBlockNumber: function(callback),
    getBlockTransactionCount: function(),
    getBlockUncleCount: function(),
    getCode: function(),
    getCoinbase: function(callback),
    getCompilers: function(),
    getGasPrice: function(callback),
    getHashrate: function(callback),
    getMining: function(callback),
    getNatSpec: function(),
    getPendingTransactions: function(callback),
    getRawTransaction: function(),
    getRawTransactionFromBlock: function(),
    getStorageAt: function(),
    getSyncing: function(callback),
    getTransaction: function(),
    getTransactionCount: function(),
    getTransactionFromBlock: function(),
    getTransactionReceipt: function(),
    getUncle: function(),
    getWork: function(),
    iban: function(iban),
    icapNamereg: function(),
    isSyncing: function(callback),
    namereg: function(),
    resend: function(),
    sendIBANTransaction: function(),
    sendRawTransaction: function(),
    sendTransaction: function(),
    sign: function(),
    signTransaction: function(),
    submitTransaction: function(),
    submitWork: function()
  },
  at: function(address, callback),
  getData: function(),
  new: function()
}

12.指定特定地址,得到该地址上的合约实例

> myMultiply7=Multiply7.at(myContract.address)
{
  abi: [{
      constant: false,
      inputs: [{...}],
      name: "multiply",
      outputs: [{...}],
      payable: false,
      type: "function"
  }],
  address: "0x8bd328e25b6846e01dd855123374fb285454cf0a",
  transactionHash: null,
  allEvents: function(),
  multiply: function()
}

在实例中能够调用的函数有两个:allEvents和multiply。multiply显然是一开始我们定义合约的时候写的函数。我们可以使用两种方法来调用multiply函数:sendTransaction(3, {from: address})和call(3)。

> myMultiply7.multiply.sendTransaction(3, {from:address})
"0x71eed110365e80fb4d9436c30f5480fb5522afa629f629be816d4b07ef8d7c83"
> myMultiply7.multiply.call(3)
21
> myMultiply7.multiply.call(8)
56

使用sendTransaction(3, {from: address})返回的值为一个字符串,这个字符串代表的是发送的交易的hash值。使用这个方法调用合约将会使调用的结果成为全局共识的一部分 
使用call(3)这个方法调用合约只会在本地上运行

要改变合约状态,只能用第一种方法。

转自:https://blog.csdn.net/p03721/article/details/54176353

如果你希望高效的学习以太坊DApp开发,可以访问汇智网提供的最热门在线互动教程:

其他更多内容也可以访问这个以太坊博客


相关文章
|
2月前
|
前端开发 安全 JavaScript
dapp智能合约系统开发解决方案/需求指南/案例步骤/源码程序
定义需求:明确系统的需求和功能。确定你的DApp将提供哪些服务,并了解相关的业务流程和规则。考虑如何实现这些功能,以及你打算使用的智能合约平台(如以太坊、EOS等)。
|
4月前
|
安全 区块链
现成秒合约系统开发搭建源码|秒合约案例
智能合约的优势在于它的透明性和安全性。由于智能合约是以代码形式存在的,所有的交易信息都可以被记录和追溯
|
6月前
|
机器学习/深度学习 人工智能 自然语言处理
秒合约开发原理丨秒合约系统开发(详细规则)丨秒合约源码案例部署
秒合约开发原理丨秒合约系统开发(详细规则)丨秒合约源码案例部署
|
7月前
|
存储 安全 算法
能玩合约跟单的交易所系统平台开发源码搭建实例分析
def __str__(self): return f"{self.user_id} {self.symbol} {self.side} {self.volume} {self.price} {self.timestamp}"
|
8月前
|
安全 区块链
DAPP智能合约链游系统开发源码部署示例
  //SPDX-License-Identifier:MIT   pragma solidity^0.8.0;   contract Game{   //游戏合约的名称   string public name;   //游戏玩家的地址   mapping(address=&gt;bool)public players;   //玩家的分数
|
9月前
|
安全 区块链 数据安全/隐私保护
基于以太坊的智能合约Fomo3D游戏开发规则部署
基于以太坊的智能合约Fomo3D游戏开发规则部署
|
开发框架 JavaScript 前端开发
如何使用Truffle来对智能合约实现并部署?
如何使用Truffle来对智能合约实现并部署?
210 0
|
数据处理 网络安全 区块链
智能合约系统丨智能合约DAPP系统开发(方案及逻辑)丨智能合约开发源码案例部署
以太坊是一个区块链平台,拥有自己的加密货币,称为以太(ETH)或以太坊,以及自己的编程语言,称Solidity。
|
JavaScript 前端开发 Go
【智能合约】Go语言调用以太坊 | geth
目录 1. geth 简介 1.1 下载地址: 1.2 安装: 1.3 查看是否安装成功 2. geth命令介绍 3. geth常用命令 3.1 指定数据目录 --datadir 3.2 账户相关 3.3 控制台console: 3.4 删除数据: 3.5 help 3.6 常见错误 4. Go语言调用合约 4.1 启动rpc端口 4.2 Go调用以太坊 4.3 调用接口 net_version net_listening net_peerCount eth接口 personal接口 db接口 最后
1029 0
【智能合约】Go语言调用以太坊 | geth
|
存储 前端开发 算法
智能合约开发(案例)丨智能合约DAPP系统开发(详情)丨智能合约开发源码系统
什么是智能合约   智能合约,简单来说就是“不需要人工干预的,自动执行的合同”。它是一种以密码学为基础,通过数学算法来保证数据的安全性、不可篡改性和防抵赖性以及执行结果可追踪性的计算机程序。从本质上来说,智能合约就像是一个加密的数据库。