天天看點

以太坊學習之開發編譯部署調用智能合約

本文根據汪曉明的視訊資料整理,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; }}"           

4.編譯智能合約

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

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開發,可以通路彙智網提供的最熱門線上互動教程:

其他更多内容也可以通路

這個以太坊部落格

繼續閱讀