blockchain - 在infura上,使用truffle 创建和发币contract

访问量: 35

refer to: https://docs.infura.io/infura/tutorials/ethereum/deploy-a-contract-using-truffle

1. 安装 truffle 

npm install -g truffle  --verbose(我在这里卡住了, 用proxy也不行,只能使用 cnpm 的方式来安装了 )

好吧,用了cnpm,  900 seconds

npm timing build:run:postinstall:node_modules/truffle/node_modules/es5-ext Completed in 105ms
npm info run truffle@5.5.18 postinstall { code: 0, signal: null }
npm timing build:run:postinstall:node_modules/truffle Completed in 827343ms
npm timing build:run:postinstall Completed in 827343ms
npm timing build:deps Completed in 853234ms
npm timing build Completed in 853234ms
npm timing reify:build Completed in 853238ms
npm timing reify:trash Completed in 705ms
npm timing reify Completed in 908472ms

added 577 packages in 15m
npm timing command:install Completed in 908495ms
npm verb exit 0
npm timing npm Completed in 908605ms
npm info ok

2. 在当前文件夹下,$ npm install dotenv

3. $ truffle init

$ truffle init

Starting init...
================

> Copying project files to /mnt/d/workspace/test_truffle

Init successful, sweet!

Try our scaffold commands to get started:
  $ truffle create contract YourContractName # scaffold a contract
  $ truffle create test YourTestName         # scaffold a test

可以看到,truffle 生成了这样几个文件夹:

$ find contracts/ migrations/ test/
contracts/   智能合约
contracts/Migrations.sol   已经存在了一个文件了
migrations/   迁移
migrations/1_initial_migration.js    已经存在了一个了
test/   测试文件夹

4. 安装 hdwallet-provider

npm install @truffle/hdwallet-provider

5. 创建.env文件

INFURA_API_URL = "https://goerli.infura.io/v3/427a8f460d514ebfadf0d6c60b0?????"   # infura的 API URL
MNEMONIC = "margin blouse tenant chat hub chef addict club rather ??? ??? ??? "  # metamask 助记词

metamask的助记词可以在  https://metamask.zendesk.com/hc/en-us/articles/360015290032-How-to-Reveal-Your-Seed-Phrase  这里查询到  ( 右上角 LOGO -> settings -> 隐私与安全性 -> ... )

6. 在contracts 目录下,创建 Demo.sol , 内容如下:

$ cat contracts/Demo.sol
pragma solidity >= 0.5.8;

contract Demo {
  event Echo(string message);

  function echo(string calldata message) external {
    emit Echo(message);
  }
}

7. 修改 truffle-config.js ,内容如下:

require('dotenv').config()

const HDWalletProvider = require('@truffle/hdwallet-provider')
const { INFURA_API_URL, MNEMONIC } = process.env


module.exports = {
  networks: {
    development: {
      host: "127.0.0.1",
      port: 8545,
      network_id: '*'
    },
    goerli: {
      provider: () => new HDWalletProvider(MNEMONIC, INFURA_API_URL),
      network_id: 5,
      gas: 5500000
    }
  }
};

8. 运行 truffle compile 

$ truffle compile

Compiling your contracts...
===========================
> Compiling ./contracts/Demo.sol
> Compiling ./contracts/Migrations.sol
> Artifacts written to /mnt/d/workspace/test_truffle/build/contracts
> Compiled successfully using:
   - solc: 0.5.16+commit.9c3226ce.Emscripten.clang

9. 我们回顾一下contracts 目录下

在migration 目录下,创建新文件, 内容如下:2_deploy_contract.js

const DemoContract = artifacts.require('Demo')

module.exports = function(deployer) {
  deployer.deploy(DemoContract)
}

10. 部署到网络上

查看命令详情: truffle help deploy

运行: truffle deploy --network goerli --verbose-rpc --interactive

我这里没能成功,一开始是报错:

Compiling your contracts...
===========================
> Everything is up to date, there is nothing to compile.


Starting migrations...
======================
> Network name:    'goerli'
> Network id:      5
> Block gas limit: 29970705 (0x1c95111)


1_initial_migration.js
======================

   Deploying 'Migrations'
   ----------------------
   > transaction hash:    0xfea291f3c52b3862654a9ea0d21edf9a7c99f380808c3f723950f9842e71eb0b
   ⠧ Blocks: 0            Seconds: 37
/mnt/d/workspace/test_truffle/node_modules/eth-block-tracker/src/polling.js:51
        const newErr = new Error(`PollingBlockTracker - encountered an error while attempting to update latest block:\n${err.stack}`)
                       ^
Error: PollingBlockTracker - encountered an error while attempting to update latest block:
undefined
    at PollingBlockTracker._performSync (/mnt/d/workspace/test_truffle/node_modules/eth-block-tracker/src/polling.js:51:24)
    at runMicrotasks (<anonymous>)
    at processTicksAndRejections (node:internal/process/task_queues:96:5)

后来搜索了一下,要么是.env 变量写错了,要么是从https 切换到wss的 rpc server, 我试了不好用,后来是修改 truffle-config.js , 内容为:

require('dotenv').config();
const HDWalletProvider = require('@truffle/hdwallet-provider');
const { INFURA_API_URL, MNEMONIC } = process.env;

module.exports = {
  networks: {
    development: {
      host: "127.0.0.1",
      port: 8545,
      network_id: "*"
    },
    goerli: {
      provider: () => new HDWalletProvider(MNEMONIC, INFURA_API_URL),
      network_id: '5',
      gas: 5500000,
      networkCheckTimeout: 1000000,    // 这里设置超时时间1000秒
      timeoutBlocks: 200,
      addressIndex: 2
    }
  }
};

然后就卡住了, 看了一下,可以在goerli 网络上找到对应的 pending contract address:

https://goerli.etherscan.io/tx/0x458646b9bfc73fe4bc856a310eeeaee9e9d7888e812acdf5820056ce36031352

不过pending的也太久了吧。。。10分钟过去了还没消息。

This txn hash was found in our secondary node and should be picked up by our indexer in a short while.

好的,750秒之后, 有消息了

Compiling your contracts...
===========================
> Everything is up to date, there is nothing to compile.


Starting migrations...
======================
> Network name:    'goerli'
> Network id:      5
> Block gas limit: 29970705 (0x1c95111)


1_initial_migration.js
======================

   Deploying 'Migrations'
   ----------------------
   > transaction hash:    0x458646b9bfc73fe4bc856a310eeeaee9e9d7888e812acdf5820056ce36031352
   ⠋ Blocks: 0            Seconds: 76
   ⠼ Blocks: 0            Seconds: 76
   ⠇ Blocks: 0            Seconds: 76
   ⠙ Blocks: 0            Seconds: 76
   ⠴ Blocks: 0            Seconds: 76
   ⠧ Blocks: 0            Seconds: 76
   ⠋ Blocks: 0            Seconds: 80
   ⠙ Blocks: 0            Seconds: 480
   > {locks: 0            Seconds: 752
   >   "jsonrpc": "2.0",
   >   "method": "eth_call",
   >   "params": [
   >     {
   >       "from": "0xc0dd5021e298db57bef361c735cd1c04cef2e48a",
   >       "gas": "0xe4a888",
   >       "data": "0x6080604052336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555034801561005057600080fd5b5061021e806100606000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063445df0ac146100465780638da5cb5b14610064578063fdacd576146100ae575b600080fd5b61004e6100dc565b6040518082815260200191505060405180910390f35b61006c6100e2565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6100da600480360360208110156100c457600080fd5b8101908080359060200190929190505050610107565b005b60015481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146101ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806101b76033913960400191505060405180910390fd5b806001819055505056fe546869732066756e6374696f6e206973207265737472696374656420746f2074686520636f6e74726163742773206f776e6572a265627a7a7231582007302f208a10686769509b529e1878bda1859883778d70dedd1844fe790c9bde64736f6c63430005100032",
   >       "maxPriorityFeePerGas": "0x9502F900",
   >       "maxFeePerGas": "0x9502f910"
   >     },
   >     "latest"
   >   ],
   >   "id": 1655422484419
   > }
 <   {locks: 0            Seconds: 752
 <     "id": 1655422484419,
 <     "jsonrpc": "2.0",
 <     "result": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c8063445df0ac146100465780638da5cb5b14610064578063fdacd576146100ae575b600080fd5b61004e6100dc565b6040518082815260200191505060405180910390f35b61006c6100e2565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6100da600480360360208110156100c457600080fd5b8101908080359060200190929190505050610107565b005b60015481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146101ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806101b76033913960400191505060405180910390fd5b806001819055505056fe546869732066756e6374696f6e206973207265737472696374656420746f2074686520636f6e74726163742773206f776e6572a265627a7a7231582007302f208a10686769509b529e1878bda1859883778d70dedd1844fe790c9bde64736f6c63430005100032"
 <   }
   ✖ Blocks: 0            Seconds: 752
 *** Deployment Failed ***

"Migrations" -- Transaction was not mined within 750 seconds, please make sure your transaction was properly sent. Be aware that it might still be mined! -- Reason given: Custom error (could not decode)..


Exiting: Review successful transactions manually by checking the transaction hashes above on Etherscan.


Error:  *** Deployment Failed ***

"Migrations" -- Transaction was not mined within 750 seconds, please make sure your transaction was properly sent. Be aware that it might still be mined! -- Reason given: Custom error (could not decode)..

    at /home/siwei/.asdf/installs/nodejs/16.15.1/.npm/lib/node_modules/truffle/build/webpack:/packages/deployer/src/deployment.js:379:1
    at runMicrotasks ()
    at processTicksAndRejections (node:internal/process/task_queues:96:5)
    at Migration._deploy (/home/siwei/.asdf/installs/nodejs/16.15.1/.npm/lib/node_modules/truffle/build/webpack:/packages/migrate/Migration.js:68:1)
    at Migration._load (/home/siwei/.asdf/installs/nodejs/16.15.1/.npm/lib/node_modules/truffle/build/webpack:/packages/migrate/Migration.js:54:1)
    at Migration.run (/home/siwei/.asdf/installs/nodejs/16.15.1/.npm/lib/node_modules/truffle/build/webpack:/packages/migrate/Migration.js:202:1)
    at Object.runMigrations (/home/siwei/.asdf/installs/nodejs/16.15.1/.npm/lib/node_modules/truffle/build/webpack:/packages/migrate/index.js:152:1)
    at Object.runFrom (/home/siwei/.asdf/installs/nodejs/16.15.1/.npm/lib/node_modules/truffle/build/webpack:/packages/migrate/index.js:117:1)
    at Object.run (/home/siwei/.asdf/installs/nodejs/16.15.1/.npm/lib/node_modules/truffle/build/webpack:/packages/migrate/index.js:94:1)
    at module.exports (/home/siwei/.asdf/installs/nodejs/16.15.1/.npm/lib/node_modules/truffle/build/webpack:/packages/core/lib/commands/migrate/runMigrations.js:10:1)
    at Object.module.exports [as run] (/home/siwei/.asdf/installs/nodejs/16.15.1/.npm/lib/node_modules/truffle/build/webpack:/packages/core/lib/commands/migrate/run.js:41:1)
    at runCommand (/home/siwei/.asdf/installs/nodejs/16.15.1/.npm/lib/node_modules/truffle/build/webpack:/packages/core/lib/command-utils.js:184:1)
Truffle v5.5.18 (core: 5.5.18)
Node v16.15.1

看起来是 750秒之后出的问题 , 迟迟没有被确认 . 不过刷新了下浏览器,这个contract已经被部署成功了(估计是 truffle没有收到 response 或者event )

所以开始踩坑: 看了下区块链浏览器, 在我发布contract的30分钟内是没有任何block产生的。

11. 所以调高 gas价格,我们重新发布:

修改 truffle-config.js

truffle deploy --network goerli --verbose-rpc --interactive --skip-dry-run --reset

这次就可以了。

require('dotenv').config();
const HDWalletProvider = require('@truffle/hdwallet-provider');
const { INFURA_API_URL, MNEMONIC } = process.env;

module.exports = {
  networks: {
    development: {
      host: "127.0.0.1",
      port: 8545,
      network_id: "*"
    },
    goerli: {
      provider: () => new HDWalletProvider(MNEMONIC, INFURA_API_URL),
      network_id: '5',
      gas: 5500000,
      gasPrice: 50000000000, // 50 gwei   这里特别重要
      networkCheckTimeout: 1000000,
      timeoutBlocks: 200,
      addressIndex: 2
    }
  }
};

一个正常的log是这样的:

Compiling your contracts...
===========================
> Everything is up to date, there is nothing to compile.


Starting migrations...
======================
> Network name:    'goerli'
> Network id:      5
> Block gas limit: 29971671 (0x1c954d7)


1_initial_migration.js
======================

   Replacing 'Migrations'
   ----------------------
   > transaction hash:    0x4ac4d051c622e4ea918149c0e7c162c835f5ecdd51682e853cea8dc368e5dc8e
   > Blocks: 2            Seconds: 28
   > contract address:    0x47165943De7b3d274E36694eef8364e3Df8f3Be5
   > block number:        7071808
   > block timestamp:     1655423360
   > account:             0xc0dD5021e298dB57bEF361C735cd1C04cef2E48A
   > balance:             3.980539809985891948
   > gas used:            193243 (0x2f2db)
   > gas price:           50 gwei
   > value sent:          0 ETH
   > total cost:          0.00966215 ETH

   > Saving migration to chain.
   > Saving artifacts
   -------------------------------------
   > Total cost:          0.00966215 ETH


2_deploy_contract.js
====================

   Replacing 'Demo'
   ----------------
   > transaction hash:    0xb722d8a45e6d308edeaeee66a394a39e7727f2bc4b004ab8a713ef4fa4db9fe8
   > Blocks: 0            Seconds: 12
   > contract address:    0xE770243b04094757852b6B06e023F914cA59B522
   > block number:        7071810
   > block timestamp:     1655423390
   > account:             0xc0dD5021e298dB57bEF361C735cd1C04cef2E48A
   > balance:             3.972081259985891948
   > gas used:            123433 (0x1e229)
   > gas price:           50 gwei
   > value sent:          0 ETH
   > total cost:          0.00617165 ETH

   > Saving migration to chain.
   > Saving artifacts
   -------------------------------------
   > Total cost:          0.00617165 ETH

Summary
=======
> Total deployments:   2
> Final cost:          0.0158338 ETH

总结一下调试 需要用到的工具

1. google web browser 

2. goerli.etherscan.io  (查看部署后的结果)

3. 修改本地的代码 (看配置)

4. 看本地的log 输出

订阅/RSS Feed

Subscribe