6.DApp-用Web3实现前端与智能合约的交互

题记

        用Web3实现前端与智能合约的交互,以下是操作流程和代码。

准备ganache环境

        文章地址:4.DApp-MetaMask怎么连接本地Ganache-CSDN博客 

准备智能合约 

        文章地址: 2.DApp-编写和运行solidity智能合约-CSDN博客

编写index.html文件

        

<!DOCTYPE html>

<html>

<head>

    <title>Name Contract Demo</title>

    <!--导入web3库-->

    <script src="https://cdn.jsdelivr.net/npm/web3@1.5.2/dist/web3.min.js"></script>

    <script>

    // 检查Metamask是否已安装

    if (typeof window.ethereum !== 'undefined') {

    console.log('Metamask已安装');

    }

    // 设置Web3.js提供者为Metamask

    const provider = window.ethereum;

    const web3 = new Web3(provider);

    // 请求Metamask连接到以太坊网络

    provider.request({ method: 'eth_requestAccounts' })

    .then(() => {

      console.log('Metamask已连接到以太坊网络');

    })

    .catch((err) => {

      console.error('无法连接到以太坊网络', err);

    });

    function setName() {

    // 合约地址

    const contractAddress = '0x32FDC4E86421143b1c27dE49542Bc8ECE2B162a0';

    // 合约ABI

    const contractABI = [

    {

        "inputs": [

            {

                "internalType": "string",

                "name": "_name",

                "type": "string"

            }

        ],

        "name": "setName",

        "outputs": [],

        "stateMutability": "nonpayable",

        "type": "function"

    },

    {

        "inputs": [],

        "name": "getName",

        "outputs": [

            {

                "internalType": "string",

                "name": "",

                "type": "string"

            }

        ],

        "stateMutability": "view",

        "type": "function"

    }

    ];

    const contract = new web3.eth.Contract(contractABI, contractAddress);

    const name = document.getElementById('name').value;

    // 替换为您的账户地址web3.eth.defaultAccount

    const fromAddress = '0x4e8eB4d1C203929074A3372F3703E556820fEA57';

    //contract.methods.setName(name).send({from: fromAddress})

    contract.methods.setName(name).send({from: fromAddress})

    .on('transactionHash', function(hash){

        console.log('Transaction Hash:', hash);

    })

    .on('receipt', function(receipt){

        console.log('Transaction Receipt:', receipt);

    })

    .on('error', function(error){

        console.error('Error:', error);

    });

    }

    function getName() {

    // 合约地址

    const contractAddress = '0x32FDC4E86421143b1c27dE49542Bc8ECE2B162a0';

    // 合约ABI

    const contractABI = [

    {

        "inputs": [

            {

                "internalType": "string",

                "name": "_name",

                "type": "string"

            }

        ],

        "name": "setName",

        "outputs": [],

        "stateMutability": "nonpayable",

        "type": "function"

    },

    {

        "inputs": [],

        "name": "getName",

        "outputs": [

            {

                "internalType": "string",

                "name": "",

                "type": "string"

            }

        ],

        "stateMutability": "view",

        "type": "function"

    }

    ];

    const contract = new web3.eth.Contract(contractABI, contractAddress);

    contract.methods.getName().call()

    .then(function(result) {

        console.log('Name:', result);

        document.getElementById('nameValue').innerText = result;

    })

    .catch(function(error) {

        console.error('Error:', error);

    });

    }

    </script>

</head>

<body>

    <h1>设置姓名</h1>

    <label for="name">姓名:</label>

    <input type="text" id="name">

    <button οnclick="setName()">设置姓名</button>

    <br>

    <button οnclick="getName()">得到姓名</button>

    <br>

    <span id="nameValue"></span>

</body>

</html>

<!DOCTYPE html>
<html>
<head>
    <title>Name Contract Demo</title>
    <!--导入web3库-->
    <script src="https://cdn.jsdelivr.net/npm/web3@1.5.2/dist/web3.min.js"></script>
    <script>
    // 检查Metamask是否已安装
    if (typeof window.ethereum !== 'undefined') {
    console.log('Metamask已安装');
    }
  
    // 设置Web3.js提供者为Metamask
    const provider = window.ethereum;
    const web3 = new Web3(provider);
  
    // 请求Metamask连接到以太坊网络
    provider.request({ method: 'eth_requestAccounts' })
    .then(() => {
      console.log('Metamask已连接到以太坊网络');
    })
    .catch((err) => {
      console.error('无法连接到以太坊网络', err);
    });
  
    function setName() {
    // 合约地址
    const contractAddress = '0x32FDC4E86421143b1c27dE49542Bc8ECE2B162a0'; 
    // 合约ABI
    const contractABI = [
	{
		"inputs": [
			{
				"internalType": "string",
				"name": "_name",
				"type": "string"
			}
		],
		"name": "setName",
		"outputs": [],
		"stateMutability": "nonpayable",
		"type": "function"
	},
	{
		"inputs": [],
		"name": "getName",
		"outputs": [
			{
				"internalType": "string",
				"name": "",
				"type": "string"
			}
		],
		"stateMutability": "view",
		"type": "function"
	}
    ]; 
    const contract = new web3.eth.Contract(contractABI, contractAddress);
    const name = document.getElementById('name').value;
    // 替换为您的账户地址web3.eth.defaultAccount
    const fromAddress = '0x4e8eB4d1C203929074A3372F3703E556820fEA57'; 
    //contract.methods.setName(name).send({from: fromAddress})

    contract.methods.setName(name).send({from: fromAddress})
    .on('transactionHash', function(hash){
        console.log('Transaction Hash:', hash);
    })
    .on('receipt', function(receipt){
        console.log('Transaction Receipt:', receipt);
    })
    .on('error', function(error){
        console.error('Error:', error);
    });
    }

    function getName() {
    // 合约地址
    const contractAddress = '0x32FDC4E86421143b1c27dE49542Bc8ECE2B162a0'; 
    // 合约ABI
    const contractABI = [
	{
		"inputs": [
			{
				"internalType": "string",
				"name": "_name",
				"type": "string"
			}
		],
		"name": "setName",
		"outputs": [],
		"stateMutability": "nonpayable",
		"type": "function"
	},
	{
		"inputs": [],
		"name": "getName",
		"outputs": [
			{
				"internalType": "string",
				"name": "",
				"type": "string"
			}
		],
		"stateMutability": "view",
		"type": "function"
	}
    ]; 
    const contract = new web3.eth.Contract(contractABI, contractAddress);
    contract.methods.getName().call()
    .then(function(result) {
        console.log('Name:', result);
        document.getElementById('nameValue').innerText = result;
    })
    .catch(function(error) {
        console.error('Error:', error);
    });
    }
    </script>
</head>
<body>
    <h1>设置姓名</h1>
    <label for="name">姓名:</label>
    <input type="text" id="name">
    <button onclick="setName()">设置姓名</button>
    <br>
    <button onclick="getName()">得到姓名</button>
    <br>
    <span id="nameValue"></span>
</body>
</html>

执行程序 

       使用vscode的Live Server打开网页

       参考这篇文章的执行方法:1.Vue-在独立页面实现Vue的增删改查-CSDN博客 

展示图 

发起交易 

完成交易 

 后记

        觉得有用可以点赞或收藏!

好的,以下是一个简单的前端web3应用程序,用于上面编写的ERC20智能合约交互: ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Web3 App</title> <script src="https://cdn.jsdelivr.net/npm/web3@1.3.5/dist/web3.min.js"></script> </head> <body> <h1>Web3 App</h1> <p>Account: <span id="account"></span></p> <p>Balance: <span id="balance"></span> ERC20 tokens</p> <input id="to" type="text" placeholder="Recipient address"> <input id="value" type="text" placeholder="Amount"> <button onclick="transfer()">Transfer</button> <script> window.addEventListener(&#39;load&#39;, async () => { if (typeof window.ethereum !== &#39;undefined&#39;) { await window.ethereum.enable(); const web3 = new Web3(window.ethereum); const contractAddress = &#39;CONTRACT_ADDRESS&#39;; const contractAbi = [{ &#39;constant&#39;: true, &#39;inputs&#39;: [{&#39;name&#39;: &#39;&#39;, &#39;type&#39;: &#39;address&#39;}], &#39;name&#39;: &#39;balanceOf&#39;, &#39;outputs&#39;: [{&#39;name&#39;: &#39;&#39;, &#39;type&#39;: &#39;uint256&#39;}], &#39;payable&#39;: false, &#39;stateMutability&#39;: &#39;view&#39;, &#39;type&#39;: &#39;function&#39; }, { &#39;constant&#39;: true, &#39;inputs&#39;: [], &#39;name&#39;: &#39;name&#39;, &#39;outputs&#39;: [{&#39;name&#39;: &#39;&#39;, &#39;type&#39;: &#39;string&#39;}], &#39;payable&#39;: false, &#39;stateMutability&#39;: &#39;view&#39;, &#39;type&#39;: &#39;function&#39; }, { &#39;constant&#39;: false, &#39;inputs&#39;: [{&#39;name&#39;: &#39;_to&#39;, &#39;type&#39;: &#39;address&#39;}, {&#39;name&#39;: &#39;_value&#39;, &#39;type&#39;: &#39;uint256&#39;}], &#39;name&#39;: &#39;transfer&#39;, &#39;outputs&#39;: [{&#39;name&#39;: &#39;success&#39;, &#39;type&#39;: &#39;bool&#39;}], &#39;payable&#39;: false, &#39;stateMutability&#39;: &#39;nonpayable&#39;, &#39;type&#39;: &#39;function&#39; }, { &#39;constant&#39;: true, &#39;inputs&#39;: [], &#39;name&#39;: &#39;symbol&#39;, &#39;outputs&#39;: [{&#39;name&#39;: &#39;&#39;, &#39;type&#39;: &#39;string&#39;}], &#39;payable&#39;: false, &#39;stateMutability&#39;: &#39;view&#39;, &#39;type&#39;: &#39;function&#39; }, { &#39;constant&#39;: false, &#39;inputs&#39;: [{&#39;name&#39;: &#39;_spender&#39;, &#39;type&#39;: &#39;address&#39;}, {&#39;name&#39;: &#39;_value&#39;, &#39;type&#39;: &#39;uint256&#39;}], &#39;name&#39;: &#39;approve&#39;, &#39;outputs&#39;: [{&#39;name&#39;: &#39;success&#39;, &#39;type&#39;: &#39;bool&#39;}], &#39;payable&#39;: false, &#39;stateMutability&#39;: &#39;nonpayable&#39;, &#39;type&#39;: &#39;function&#39; }, { &#39;constant&#39;: true, &#39;inputs&#39;: [{&#39;name&#39;: &#39;&#39;, &#39;type&#39;: &#39;address&#39;}, {&#39;name&#39;: &#39;&#39;, &#39;type&#39;: &#39;address&#39;}], &#39;name&#39;: &#39;allowance&#39;, &#39;outputs&#39;: [{&#39;name&#39;: &#39;&#39;, &#39;type&#39;: &#39;uint256&#39;}], &#39;payable&#39;: false, &#39;stateMutability&#39;: &#39;view&#39;, &#39;type&#39;: &#39;function&#39; }, { &#39;constant&#39;: false, &#39;inputs&#39;: [{&#39;name&#39;: &#39;_from&#39;, &#39;type&#39;: &#39;address&#39;}, {&#39;name&#39;: &#39;_to&#39;, &#39;type&#39;: &#39;address&#39;}, { &#39;name&#39;: &#39;_value&#39;, &#39;type&#39;: &#39;uint256&#39; }], &#39;name&#39;: &#39;transferFrom&#39;, &#39;outputs&#39;: [{&#39;name&#39;: &#39;success&#39;, &#39;type&#39;: &#39;bool&#39;}], &#39;payable&#39;: false, &#39;stateMutability&#39;: &#39;nonpayable&#39;, &#39;type&#39;: &#39;function&#39; }, { &#39;inputs&#39;: [{&#39;name&#39;: &#39;_name&#39;, &#39;type&#39;: &#39;string&#39;}, {&#39;name&#39;: &#39;_symbol&#39;, &#39;type&#39;: &#39;string&#39;}, { &#39;name&#39;: &#39;_totalSupply&#39;, &#39;type&#39;: &#39;uint256&#39; }], &#39;payable&#39;: false, &#39;stateMutability&#39;: &#39;nonpayable&#39;, &#39;type&#39;: &#39;constructor&#39; }, { &#39;anonymous&#39;: false, &#39;inputs&#39;: [{&#39;indexed&#39;: true, &#39;name&#39;: &#39;_from&#39;, &#39;type&#39;: &#39;address&#39;}, { &#39;indexed&#39;: true, &#39;name&#39;: &#39;_to&#39;, &#39;type&#39;: &#39;address&#39; }, {&#39;indexed&#39;: false, &#39;name&#39;: &#39;_value&#39;, &#39;type&#39;: &#39;uint256&#39;}], &#39;name&#39;: &#39;Transfer&#39;, &#39;type&#39;: &#39;event&#39; }, { &#39;anonymous&#39;: false, &#39;inputs&#39;: [{&#39;indexed&#39;: true, &#39;name&#39;: &#39;_owner&#39;, &#39;type&#39;: &#39;address&#39;}, { &#39;indexed&#39;: true, &#39;name&#39;: &#39;_spender&#39;, &#39;type&#39;: &#39;address&#39; }, {&#39;indexed&#39;: false, &#39;name&#39;: &#39;_value&#39;, &#39;type&#39;: &#39;uint256&#39;}], &#39;name&#39;: &#39;Approval&#39;, &#39;type&#39;: &#39;event&#39; }]; const contract = new web3.eth.Contract(contractAbi, contractAddress); const accounts = await web3.eth.getAccounts(); const account = accounts[0]; document.getElementById(&#39;account&#39;).textContent = account; const balance = await contract.methods.balanceOf(account).call(); document.getElementById(&#39;balance&#39;).textContent = balance; transfer = async () => { const to = document.getElementById(&#39;to&#39;).value; const value = document.getElementById(&#39;value&#39;).value; await contract.methods.transfer(to, value).send({from: account}); location.reload(); }; } else { alert(&#39;Please install MetaMask to use this dApp!&#39;); } }); </script> </body> </html> ``` 在这个应用程序中,我们使用了web3.js库来以太坊网络交互,首先需要检查MetaMask是否已安装并启用。然后,我们使用智能合约地址ABI创建了一个智能合约实例,以便可以合约交互。我们还获取了当前用户的帐户智能合约中该帐户的余额,并将其显示在页面上。最后,我们定义了一个转移函数,该函数在用户输入收件人地址金额后,调用智能合约的“transfer”函数来发送代币,并重新加载页面以更新余额。 请注意,在这个示例中,你需要将“CONTRACT_ADDRESS”替换为你部署的ERC20智能合约的地址。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值