Truffle - 2 利用Truffle编写、测试智能合约并将其部署到不同的测试网络

Truffle - 2 利用Truffle编写、测试智能合约并将其部署到不同的测试网络,第1张

2 利用Truffle编写、测试智能合约并将其部署到不同的测试网络 2.1创建项目

建一个文件夹

mkdir truffle-project
truffle init //初始化

qinjianquan@MacBook-Pro-10 truffle-project % ls //查看文件
contracts		test
migrations		truffle-config.js  

contracts 编写智能合约的文件夹

migrations 使用solidity编写智能合约的文件夹,编写文件解释truffle 如何部署智能合约,用的是node.js

Test 用来写测试文件,大多数使用的是node.js,也有一些使用的是Solidity

配置文件用来定义智能合约部署的网络

2.2 编写合约
vim contracts/SimpleStorage.sol
pragma solidity ^0.8.4; //请注意solidity的版本问题,如果合约指定的版本和当前Solidity不兼容的话,这将会在编译的时候出错

contract SimpleStorage {
    uint data;

    function updateData(uint _data) external {
        data = _data;
    }

    function readData() external view returns(uint) {
        return data;
    }
}
vim truffle-config.js  //通过配置文件修改配置
truffle compile //编译
Compiling your contracts...
===========================
✓ Fetching solc version list from solc-bin. Attempt #1
✓ Downloading compiler. Attempt #1.
> Compiling ./contracts/Migrations.sol
> Compiling ./contracts/SimpleStorage.sol
> Compilation warnings encountered:

    Warning: SPDX license identifier not provided in source file. Before publishing, consider adding a comment containing "SPDX-License-Identifier: " to each source file. Use "SPDX-License-Identifier: UNLICENSED" for non-open-source code. Please see https://spdx.org for more information.
--> project:/contracts/SimpleStorage.sol


> Artifacts written to /Users/qinjianquan/truffle-project/build/contracts
> Compiled successfully using:
   - solc: 0.8.13+commit.abaa5c0e.Emscripten.clang
qinjianquan@MacBook-Pro-10 truffle-project % ls //查看生成的json文件
build			contracts		migrations		test			truffle-config.js
qinjianquan@MacBook-Pro-10 truffle-project % ls build/contracts/
Migrations.json		SimpleStorage.json
qinjianquan@MacBook-Pro-10 truffle-project % ls
build			contracts		migrations		test			truffle-config.js
qinjianquan@MacBook-Pro-10 truffle-project % ls build/contracts/
Migrations.json		SimpleStorage.json
vim build/contracts/SimpleStorage.json //查看编译后的json文件以及一些其它编译合约的信息
"abi": [
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_data",
          "type": "uint256"
        }
      ],
      "name": "uodateData",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "readData",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    }
  ],
--
2.3 测试

测试文件/合约都可以在vs code先编写,然后通过命令行工具部署和测试

vim test/SimpleStorage.js //编写测试文件
const SimpleStorage = artifacts.require('SimpleStorage');

contract('SimpleStorage', ()=> {
     it ('Should update data',sync () => {
          const storage = await SimpleStorage.new();
          await storage.updateData(10);
          const data = await storage.readData();
          assert(data.toString() === '10');
     });
});
qinjianquan@MacBook-Pro-10 truffle-project % truffle test 运行测试,此时的测试在本地的私有链Ganache上,非常简单方便
Using network 'test'.


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


  Contract: SimpleStorage
    ✔ Should update data (2093ms)


  1 passing (2s)

2.4 部署合约

使用truffle部署合约将会部署在本地的区块链ganache上,ganache可以独立安装,但是当安装了truffle时,也会自动安装ganache

第一步:在migrations文件中创建migration文件

vim 2_deploy_contract.js

第二步:编译部署文件

const SimpleStorage = artifacts.require('SimpleStorage.sol');

module.exports = function (deployer) {
     deployer.deploy(SimpleStorage);
};

第三步:启动ganache

qinjianquan@MacBook-Pro-10 truffle-project % truffle develop
Truffle Develop started at http://127.0.0.1:9545/  //本地区块链应运行的ip

//产生了10对公钥和私钥
Accounts:
(0) 0xfb7032b3fcffc0a41e96b99afd663a477819667c
(1) 0x6d5d77c220e16b941dbae18160ede44927ef0896
(2) 0x3b3400226108c3852517c92fbf77897f26f0ed22
(3) 0x0d84c5e7da17a1cc0c7ea80e542cc4510dd86031
(4) 0xbfe92d1c88a0ed13d810f6eb5895d9977a1344a2
(5) 0xbe1a8378aee4e12743165b7b734acd341dd9b7bb
(6) 0xab288c9e27360cb669fa0400a059c7cb832bb9fe
(7) 0xa0c0d996cae482689ec7e21773ae244706cd0568
(8) 0x9b75a563dd23bc0aacab738fe44699c6f059d4c4
(9) 0xeaf4ee109ec7e8021625472d39844e62d11e40d7

Private Keys:
(0) b0531e2f34c749fbe35e931729b0ea5fa8dc3e8c721959bff26b75072eab803f
(1) ea879baab63887baa9537b62720c46e0f91d18a0ba1e1f94a07e1738326a35f2
(2) 6d7c219ca62df4071c0ac20f649565671eea5d18074fa26553f4435ad6f3c232
(3) 3c190d33a159af8c4eea0dcde454f01f1b6c5c300245336c81274e8509dc8f42
(4) 3146aa207eb681981e4ff32c0ae2b7c4fdc394439a7c4749716a69780956b471
(5) 1690311f845117441480148ab3c3825b750946075dbf90caeb727a7532bb0f53
(6) 6359b8b4b912a83268db09b3b40d77bccfc2510acf1b8178142342d54818f5ef
(7) de988ee0c1d5ea7736710ca7ce131db1c388e53b2e40364547ac7c2f938e16c0
(8) d9474696f0680b2c195a62c3bec892eec8e9d58937076086ce8eee38568b277d
(9) 40b16ad4d62db2314bf397c4acfdb5edc6005c5c18020201a8d2767063439ebc

Mnemonic: rely spell ensure loan toss bitter tissue error pretty cactus eyebrow fantasy

⚠️  Important ⚠️  : This mnemonic was created for you by Truffle. It is not secure.
Ensure you do not use it on production blockchains, or else you risk losing funds.

第四步:部署合约

truffle(develop)> migrate --reset
--  //部署好合约的基本信息
2_deploy_contracts.js
=====================

   Deploying 'SimpleStorage'
   -------------------------
   > transaction hash:    0xb77455f2770124ca686f3455fa37320c8f85210706ecc608dfe1eed99a376ae2
   > Blocks: 0            Seconds: 0
   > contract address:    0xEa914459CDe53Ebea8AdF4f86B26624B8b19f4aD
   > block number:        3
   > block timestamp:     1650762450
   > account:             0xFb7032b3fcfFc0A41E96B99AFd663A477819667C
   > balance:             99.998606050600155647
   > gas used:            125653 (0x1ead5)
   > gas price:           3.178366198 gwei
   > value sent:          0 ETH
   > total cost:          0.000399371247877294 ETH

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

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

第五步,在公共测试网络部署(使用binance smart chain)

注意,public test net 需要获取BNB

0xfb7032b3fcffc0a41e96b99afd663a477819667c //选择一个账户
https://testnet.binance.org/faucet-smart //获取测试所要用的BNB
https://testnet.bscscan.com/address/0xfb7032b3fcffc0a41e96b99afd663a477819667c //查看获取的BNB
vim truffle-config.js  //回到终端修改配置文件

//引入依赖,能够让我们在主网或者测试网签名交易
const  HDWalletProvider = require('@truffle/hdwallet-provider'); 
const privateKeys = ['0xb0531e2f34c749fbe35e931729b0ea5fa8dc3e8c721959bff26b75072eab803f'];
--
  networks: {
	--
	//eth测试
	eth:{
      provider: () => new HDWalletProvider(
        privateKeys,
        'ETH_NODE_URL'
        ),
        network_id:1,
        skipDryRun:true
    },
    ethTestnet:{
      provider: () => new HDWalletProvider(
        privateKeys,
        'ETH_NODE_URL'
        ),
        network_id:5,
        skipDryRun:true
    },
   	//bsc 测试
    bsc:{
      provider: () => new HDWalletProvider(
        privateKeys,
        'https://bsc-dataseed.binance.org/'
        ),
        network_id:56,
        skipDryRun:true
    },
    bscTestnet:{
      provider: () => new HDWalletProvider(
        privateKeys,
        'https://data-seed-prebsc-1-s1.binance.org:8545/'
        ),
        network_id:97,
        skipDryRun:true
    }
  },
	--
  },

在binance上部署,如下是合约部署好的结果

truffle migrate --reset --network bscTestnet //

qinjianquan@MacBook-Pro-10 truffle-project % truffle migrate --reset --network bscTestnet

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


Starting migrations...
======================
> Network name:    'bscTestnet'
> Network id:      97
> Block gas limit: 30000000 (0x1c9c380)


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

   Deploying 'Migrations'
   ----------------------
   > transaction hash:    0xa72186e9fadb8e678230d98c7c0ace69e0997f93909555d051ff28b78a6b8fb9
   > Blocks: 1            Seconds: 4
   > contract address:    0xdeC493327921499E17AE674dc7a18cB12D723b02
   > block number:        18716980
   > block timestamp:     1650766972
   > account:             0xFb7032b3fcfFc0A41E96B99AFd663A477819667C
   > balance:             0.99751146
   > gas used:            248854 (0x3cc16)
   > gas price:           10 gwei
   > value sent:          0 ETH
   > total cost:          0.00248854 ETH

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


2_deploy_contracts.js
=====================

   Deploying 'SimpleStorage'
   -------------------------
   > transaction hash:    0xef537e56844b148363b9e54ca7db8b1aa92d06c0ec28a9e02923dd80f4690f5f
   > Blocks: 1            Seconds: 4
   > contract address:    0xEa914459CDe53Ebea8AdF4f86B26624B8b19f4aD
   > block number:        18716985
   > block timestamp:     1650766987
   > account:             0xFb7032b3fcfFc0A41E96B99AFd663A477819667C
   > balance:             0.9958298
   > gas used:            125653 (0x1ead5)
   > gas price:           10 gwei
   > value sent:          0 ETH
   > total cost:          0.00125653 ETH

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

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

注意:虽然合约部署在bsc上,但是显示仍旧以ETH结算,这是因为truffle是为eth设计的,我们实际上使用的是BNB

通过交易哈希,可以查看交易详情

http://www.kaotop.com/file/tupian/20220516/image-20220424103312941.png)]

2.5 与智能合约交互

使用truffle console

truffle console --network bscTestnet 
truffle(bscTestnet)> storage = await SimpleStorage.deployed() //将合约定义为新的变量
undefined

truffle(bscTestnet)> storage.address //获取合约地址
'0xEa914459CDe53Ebea8AdF4f86B26624B8b19f4aD'

执行合约

truffle(bscTestnet)> await storage.updateData(10)
truffle(bscTestnet)> {
  tx: '0x78e3317e91c89ae6100a25334d02b4a7375917702a7213afc997e4be34b3269c',
  receipt: {
    blockHash: '0xedd34370c0c6f7f2f193de112cb85c9414a4345e21e600bdb18860fb403d6a4d',
    blockNumber: 18717394,
    contractAddress: null,
    cumulativeGasUsed: 823595,
    from: '0xfb7032b3fcffc0a41e96b99afd663a477819667c',
    gasUsed: 41602,
    logs: [],
    logsBloom: '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',
    status: true,
    to: '0xea914459cde53ebea8adf4f86b26624b8b19f4ad',
    transactionHash: '0x78e3317e91c89ae6100a25334d02b4a7375917702a7213afc997e4be34b3269c',
    transactionIndex: 9,
    type: '0x0',
    rawLogs: []
  },
  logs: []
}
https://testnet.bscscan.com/tx/0x78e3317e91c89ae6100a25334d02b4a7375917702a7213afc997e4be34b3269c //查看交易信息

Input Data:

#NameTypeData
0_datauint25610
data = storage.readData() //读取
BN { negative: 0, words: [ 10, <1 empty item> ], length: 1, red: null }

data = await storage.readData() 
undefined
truffle(bscTestnet)> data.toString()//转化为字符串,更容易阅读
'10'

事实上,使用truffle develop命令,可以同时启动本地的区块链和进入console

qinjianquan@MacBook-Pro-10 truffle-project % truffle develop
Truffle Develop started at http://127.0.0.1:9545/

Accounts:
(0) 0xfb7032b3fcffc0a41e96b99afd663a477819667c
(1) 0x6d5d77c220e16b941dbae18160ede44927ef0896
(2) 0x3b3400226108c3852517c92fbf77897f26f0ed22
(3) 0x0d84c5e7da17a1cc0c7ea80e542cc4510dd86031
(4) 0xbfe92d1c88a0ed13d810f6eb5895d9977a1344a2
(5) 0xbe1a8378aee4e12743165b7b734acd341dd9b7bb
(6) 0xab288c9e27360cb669fa0400a059c7cb832bb9fe
(7) 0xa0c0d996cae482689ec7e21773ae244706cd0568
(8) 0x9b75a563dd23bc0aacab738fe44699c6f059d4c4
(9) 0xeaf4ee109ec7e8021625472d39844e62d11e40d7

Private Keys:
(0) b0531e2f34c749fbe35e931729b0ea5fa8dc3e8c721959bff26b75072eab803f
(1) ea879baab63887baa9537b62720c46e0f91d18a0ba1e1f94a07e1738326a35f2
(2) 6d7c219ca62df4071c0ac20f649565671eea5d18074fa26553f4435ad6f3c232
(3) 3c190d33a159af8c4eea0dcde454f01f1b6c5c300245336c81274e8509dc8f42
(4) 3146aa207eb681981e4ff32c0ae2b7c4fdc394439a7c4749716a69780956b471
(5) 1690311f845117441480148ab3c3825b750946075dbf90caeb727a7532bb0f53
(6) 6359b8b4b912a83268db09b3b40d77bccfc2510acf1b8178142342d54818f5ef
(7) de988ee0c1d5ea7736710ca7ce131db1c388e53b2e40364547ac7c2f938e16c0
(8) d9474696f0680b2c195a62c3bec892eec8e9d58937076086ce8eee38568b277d
(9) 40b16ad4d62db2314bf397c4acfdb5edc6005c5c18020201a8d2767063439ebc

Mnemonic: rely spell ensure loan toss bitter tissue error pretty cactus eyebrow fantasy

⚠️  Important ⚠️  : This mnemonic was created for you by Truffle. It is not secure.
Ensure you do not use it on production blockchains, or else you risk losing funds.

truffle(develop)> 

进入本地console后,仍然可以执行在bscTestnet console 的内容

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/925127.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-16
下一篇 2022-05-16

发表评论

登录后才能评论

评论列表(0条)