gas問題out of gas的解決



1.昨天遇見了還是以前遇見的問題,就是發現有些函數就是不能用web3調用,然后怎么弄都寫不到數組上,但是今天終於將它解決了
web3的學習:
https://github.com/ethereum/wiki/wiki/JavaScript-API

今天又重新想要跑一下cryptopunks
當想要在私有鏈配置自己的合約的時候,有時你會很殘酷地發現它告訴你out of gas,這個時候你就要去查看你的初始塊配置的時候的gasLimit是不是設的比較小了,或者是你部署合約的時候gas給的是不是太小
重新又創建了一個私有鏈local4,這一次它的gaslimit設置為8個f,果然就沒有再出現過gas方面的問題了

但是在調用函數的時候我又出現了gas方面的問題

我發現這個問題的原因竟然是因為我調用的時候沒有設定使用的gas數,在remix的compile-details-gasestimates中我們是可以查看到每個函數大概要用到的gas的數量的,在下面的錯誤的transaction信息中,我們可以看見,gas的估計基本上都是90000,我想啊,這可能是自定義的每一個函數使用的最大值,當你的函數運行超過這個值以后呢,可能運行就不成功了,因為沒gas了,所以之前的調用才會出錯
然后之后我就去測了一個沒有設置gas但是成功了的transaction,然后發現它的gas值處果然是90000,這個值是該交易的sender給的gas數

> eth.getTransaction('0x4650e6c26f9ad2b850b66ad0e2b6836f4e6ad1760453d45c9d5d870c312cc227')
{
  blockHash: "0x40afdacfe0d91bac521ae4ff924b00952191da1d201180c31e6b368b83f25f06",
  blockNumber: 132,
  from: "0x0c585ae7e2e15ffd3e04e82c0e4adf5bad5a94b0",
  gas: 90000,
  gasPrice: 18000000000,
  hash: "0x4650e6c26f9ad2b850b66ad0e2b6836f4e6ad1760453d45c9d5d870c312cc227",
  input: "0x3ccfd60b",
  nonce: 13,
  r: "0x8af9e5b6be338538c2862bb36516052c9782a819644acea94cff243cbc2dab82",
  s: "0x63e5f39801860647e82ebd736fa1c32dc00fb2d53b58f55fac87c46e87bf3501",
  to: "0xafddc17c7963bd81598defbe28b43230a4bdb719",
  transactionIndex: 0,
  v: "0x41",
  value: 0
}


然后再去查看一個自己設置了gas的transaction的gas值,我們可以很明確地看見這里的gas值就是我自己設置的300000

> eth.getTransaction('0x97a1ea29b42e0c7edee7fcfb742920b18c2732ee1a3e33ff2371a5208a13ca1e')
{
  blockHash: "0xe1c7fe5cd751935f98a6fc0d3b65eab9ac4b1f4b5dcc81bbdcaf258aa40f4f26",
  blockNumber: 131,
  from: "0x0c585ae7e2e15ffd3e04e82c0e4adf5bad5a94b0",
  gas: 300000,
  gasPrice: 18000000000,
  hash: "0x97a1ea29b42e0c7edee7fcfb742920b18c2732ee1a3e33ff2371a5208a13ca1e",
  input: "0x23165b7500000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000258",
  nonce: 12,//交易的發起者在之前進行過的交易數量。
  r: "0x771a755550958a5863d8ca5b56784d62fa449afb724fd2efd28bd36a38dc183a",
  s: "0x2fc49b6f4303fe4beb96f70921ca79100ac3a991206132429aa4e42e45590bad",
  to: "0xafddc17c7963bd81598defbe28b43230a4bdb719",
  transactionIndex: 0,//該交易在區塊中的索引
  v: "0x41",
  value: 0
}


Web3調用語句:

instance.acceptBidForPunk(6,600,{from:web3.eth.accounts[1]});
> eth.getTransactionReceipt('0x2cab683a0c84d917210652f18f80161e8141893497e45cd09609525d537ad86e')
{
  blockHash: "0x15d1f2d37f4647419dc583d1af1dd47d183e8c21041254b07e9f8ea7ff81f496",
  blockNumber: 128,
  contractAddress: null,
  cumulativeGasUsed: 90000,
  from: "0x0c585ae7e2e15ffd3e04e82c0e4adf5bad5a94b0",
  gasUsed: 90000,
  logs: [],
  logsBloom: "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
  status: "0x0",//沒成功
  to: "0xafddc17c7963bd81598defbe28b43230a4bdb719",
  transactionHash: "0x2cab683a0c84d917210652f18f80161e8141893497e45cd09609525d537ad86e",
  transactionIndex: 0
}

從這個返回結果我們可以看出這筆交易沒能成功寫到區塊上

本來這個函數的作用是接受這個投標bid,然后下面來個數組的信息就應該變為false等,但是可以看見下面的輸出還是沒有改變
console.log(instance.punksOfferedForSale.call(6));
console.log(instance.punkBids.call(6));

[ true,
  BigNumber { s: 1, e: 0, c: [ 6 ] },
  '0x0c585ae7e2e15ffd3e04e82c0e4adf5bad5a94b0',
  BigNumber { s: 1, e: 2, c: [ 600 ] },
  '0x0000000000000000000000000000000000000000' ]
wanghuideMacBook-Pro:new wanghui$ node new1.js
wanghuideMacBook-Pro:new wanghui$ node new1.js
[ true,
  BigNumber { s: 1, e: 0, c: [ 6 ] },
  '0xa79be9d7cb24c4b43f5e89198f25a96f7a5f191f',
  BigNumber { s: 1, e: 2, c: [ 620 ] } ]

Web3調用語句,加上gas后:
instance.acceptBidForPunk(6,600,{from:web3.eth.accounts[1],gas:300000});

> eth.getTransactionReceipt('0x97a1ea29b42e0c7edee7fcfb742920b18c2732ee1a3e33ff2371a5208a13ca1e')
{
  blockHash: "0xe1c7fe5cd751935f98a6fc0d3b65eab9ac4b1f4b5dcc81bbdcaf258aa40f4f26",
  blockNumber: 131,
  contractAddress: null,
  cumulativeGasUsed: 56074,
  from: "0x0c585ae7e2e15ffd3e04e82c0e4adf5bad5a94b0",
  gasUsed: 56074,
  logs: [{
      address: "0xafddc17c7963bd81598defbe28b43230a4bdb719",
      blockHash: "0xe1c7fe5cd751935f98a6fc0d3b65eab9ac4b1f4b5dcc81bbdcaf258aa40f4f26",
      blockNumber: 131,
      data: "0x0000000000000000000000000000000000000000000000000000000000000001",
      logIndex: 0,
      removed: false,
      topics: ["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", "0x0000000000000000000000000c585ae7e2e15ffd3e04e82c0e4adf5bad5a94b0", "0x000000000000000000000000a79be9d7cb24c4b43f5e89198f25a96f7a5f191f"],
      transactionHash: "0x97a1ea29b42e0c7edee7fcfb742920b18c2732ee1a3e33ff2371a5208a13ca1e",
      transactionIndex: 0
  }, {
      address: "0xafddc17c7963bd81598defbe28b43230a4bdb719",
      blockHash: "0xe1c7fe5cd751935f98a6fc0d3b65eab9ac4b1f4b5dcc81bbdcaf258aa40f4f26",
      blockNumber: 131,
      data: "0x0000000000000000000000000000000000000000000000000000000000000000",
      logIndex: 1,
      removed: false,
      topics: ["0x58e5d5a525e3b40bc15abaa38b5882678db1ee68befd2f60bafe3a7fd06db9e3", "0x0000000000000000000000000000000000000000000000000000000000000006", "0x0000000000000000000000000c585ae7e2e15ffd3e04e82c0e4adf5bad5a94b0", "0x0000000000000000000000000000000000000000000000000000000000000000"],
      transactionHash: "0x97a1ea29b42e0c7edee7fcfb742920b18c2732ee1a3e33ff2371a5208a13ca1e",
      transactionIndex: 0
  }],
  logsBloom: "0x00000000004000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000400000000000000000000000000000100010000000008000000000000000000000000000000001000000000000000020000000000000000000800000000000000000000000010000000000000000408000000001000400000000000000000000008000000800000000000000000000000000000000000000000000000000000000000000000080000000000000002000000000000000000000000000000000000000000000000000020000000000080000000000000000000000000000000000000000000002000000000",
  status: "0x1",
  to: "0xafddc17c7963bd81598defbe28b43230a4bdb719",
  transactionHash: "0x97a1ea29b42e0c7edee7fcfb742920b18c2732ee1a3e33ff2371a5208a13ca1e",
  transactionIndex: 0
}

然后就發現這個函數的調用成功了,但是很奇怪的一點,就是我們可以從gasUsed: 56074看出,真正使用到的gas其實是小於90000的,但是為什么還是失敗,之后看見在解釋吧
數組信息變為:
console.log(instance.punksOfferedForSale.call(6));
console.log(instance.punkBids.call(6));

[ false,
  BigNumber { s: 1, e: 0, c: [ 6 ] },
  '0xa79be9d7cb24c4b43f5e89198f25a96f7a5f191f',
  BigNumber { s: 1, e: 0, c: [ 0 ] },
  '0x0000000000000000000000000000000000000000' ]
[ false,
  BigNumber { s: 1, e: 0, c: [ 6 ] },
  '0x0000000000000000000000000000000000000000',
  BigNumber { s: 1, e: 0, c: [ 0 ] } ]

余額變為
console.log(instance.pendingWithdrawals.call(web3.eth.accounts[1]));

BigNumber { s: 1, e: 2, c: [ 620 ] }

當然,這上面只是十分死板地將gas的值給定死了,如果想要比較自動得到使用的gas值的話,是可以使用web3的estimate來做的
或者是你可以先調用一個函數,但是這個時候你還不要進行挖礦,然后此時交易的區塊的狀態就是pending,查看其gaslimit
web3.eth.getBlock("pending").gasLimit
4712388

然后在gas處就可以寫這個值了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM