以太坊真实测试网络合约交互实战
操作步骤
•安装truffle-hdwallet-provider
•导入包
•创建一个prodivier
//引入包
let Web3 =require('web3')
let HDWalletProvider = require('truffle-hdwallet-provider')
//2.new一个web3实例
let web3 = new Web3()
//3.设置metamask Ropsten-network的助记住词,表明花谁的钱
let terms = 'truly state fruit rug decide riot shy lake apple orphan october dinosaur'
//3.设置测试网络 infura
let netIp = 'https://ropsten.infura.io/v3/4c25a49808354c5480f97d4c82117ee4'
let provider = new HDWalletProvider(terms, netIp)
web3.setProvider(provider)
需要填写的数据
•助记词,表示花谁的钱--metamask 测试网络 scout same naive genius cannon maze differ acquire penalty habit surround ice
•指定一个服务商,让他帮助我们连接到真实网络 https://ropsten.infura.io/v3/4c25a49808354c5480f97d4c82117ee4
•需要使用个npm包(接受两个参数:1,2,这个包会帮我们连接到对应网络) npm install [email protected][1] --save
什么是Infura

•专业一点讲,Infura是一种IaaS(Infrastructure as a Service)产品,目的是为了降低访问以太坊数据的门槛。
•通俗一点讲,Infura就是一个可以让你的dApp快速接入以太坊的平台,不需要本地运行以太坊节点。
•从程序员的角度讲,Infura就是一个Web3 Provider,背后是负载均衡的API节点集群。使用它的好处就是,你永远不必担心连接的节点失效的问题,Infura会管理好这一切。
代码修改
02-deploy
let {bytecode, interface} = require('./01-compile')
//1.引入web3
let Web3 = require('web3')
//引入包
let HDWalletProvider = require('truffle-hdwallet-provider')
//2.new一个web3实例
let web3 = new Web3()
//3.设置metamask Ropsten-network的助记住词,表明花谁的钱
let terms = 'truly state fruit rug decide riot shy lake apple orphan october dinosaur'
//3.设置测试网络 infura
let netIp = 'https://ropsten.infura.io/v3/4c25a49808354c5480f97d4c82117ee4'
let provider = new HDWalletProvider(terms, netIp)
web3.setProvider(provider)
console.log('version:________', web3.version)
console.log('web3-eth.curretProvider_____________', web3.currentProvider)
//1.拼接合约数据
let contract = new web3.eth.Contract(JSON.parse(interface))
let deploy = async () => {
    //获取所有的账户
    let accounts = await web3.eth.getAccounts()
    console.log('accounts____', accounts)
    //执行部署
    let instance = await contract.deploy({
        data: bytecode,//合约的bytecode
        arguments: ['helloworld']//给构造函数传递参数,使用数组
    }).send({
        from: accounts[0],
        gas: '3000000',
        gasPrice: '1',
    })
    console.log('instance_address_____', instance.options.address)
}
deploy()
03-instance
//引入包
let Web3 =require('web3')
let HDWalletProvider = require('truffle-hdwallet-provider')
//2.new一个web3实例
let web3 = new Web3()
//3.设置metamask Ropsten-network的助记住词,表明花谁的钱
let terms = 'truly state fruit rug decide riot shy lake apple orphan october dinosaur'
//3.设置测试网络 infura
let netIp = 'https://ropsten.infura.io/v3/4c25a49808354c5480f97d4c82117ee4'
let provider = new HDWalletProvider(terms, netIp)
web3.setProvider(provider)
let abi = [{
    "constant": true,
    "inputs": [],
    "name": "getValue",
    "outputs": [{"name": "", "type": "string"}],
    "payable": false,
    "stateMutability": "view",
    "type": "function"
}, {
    "constant": false,
    "inputs": [{"name": "_str", "type": "string"}],
    "name": "setValue",
    "outputs": [],
    "payable": false,
    "stateMutability": "nonpayable",
    "type": "function"
}, {
    "inputs": [{"name": "_str", "type": "string"}],
    "payable": false,
    "stateMutability": "nonpayable",
    "type": "constructor"
}]
let address = '0x797Ff2e41b64eD1adfc84cA98afeD00813Dd051D' //此处是合约地址
//此处abi已经json对象,不需要进行parse动作
let contractInstance = new web3.eth.Contract(abi, address)
console.log('address__________', contractInstance.options.address)
module.exports = contractInstance
04-interaction
//引入包
let Web3 =require('web3')
let HDWalletProvider = require('truffle-hdwallet-provider')
//2.new一个web3实例
let web3 = new Web3()
//3.设置metamask Ropsten-network的助记住词,表明花谁的钱
let terms = 'truly state fruit rug decide riot shy lake apple orphan october dinosaur'
//3.设置测试网络 infura
let netIp = 'https://ropsten.infura.io/v3/4c25a49808354c5480f97d4c82117ee4'
let provider = new HDWalletProvider(terms, netIp)
web3.setProvider(provider)
//整体封装成函数
//web3和区块链交互的返回值都是promise,可以直接使用async
let test = async () => {
    try {
        //获取当前区块链的对应助记词的账户地址
        let accounts = await web3.eth.getAccounts()
        let from = accounts[0]
        let y1 = await instance.methods.getValue().call()
        let res = await instance.methods.setValue('Hello HangTou').send({
            from: from,
            gas:'3000000',
            value: 0,
        })
        console.log('res:', res)
        let v2 = await instance.methods.getValue().call()
        console.log('v2:', v2)
    } catch (e) {
        console.log(e)
    }
}
test()
结果展示

git地址 https://github.com/potaxie/web3
References
[1] [email protected]: mailto:[email protected]
下一篇:本地开发环境以太坊合约交互实战
                    



