合约外部访问

合约外部调用的原理

  • ABI :Application Binary Interface(应用二进制接口)
  • 读操作与写操作的不同调用方式

web3js

开发过程

  • 环境搭建
  • MetaMask初始化
  • ABI数据
  • 读操作
  • 写操作

工具与环境

  • HFS web服务器(启动服务)
  • Gannache-cli
  • VSCode

代码参考,引用的是Remix官方示例的Owner.sol的合约

  • login.html (合约地址可以通过Remix获取)
    <!DOCTYPE html>
    <html>
    
    <head>
    	<meta charset="UTF-8">
    
    	<title>Insert title here</title>
    	<script src="web3.min.js"></script>
    	<script src="owner.js"></script>
    	<style>
    		body {
    			background-color: #5544aa;
    			background-image: url('images/b9.jpg');
    			text-align: center;
    		}
    
    		.div {
    			margin: 0 auto;
    
    			border: 1px solid #F00;
    			position: absolute;
    			top: 50%;
    			left: 40%;
    		}
    
    		.button {
    			background-color: #4CAF50;
    			/* Green */
    			border: 3;
    			color: white;
    			padding: 15px 32px;
    			text-align: center;
    			text-decoration: none;
    			display: inline-block;
    			font-size: 24px;
    			margin: 4px 2px;
    			cursor: pointer;
    			align: center;
    		}
    	</style>
    </head>
    
    <body>
    
    	<script type="text/javascript">
    		var myaccounts;
    		window.addEventListener('load', function () {
    			if (!window.web3) {//用来判断你是否安装了metamask
    				window.alert('Please install MetaMask first.');
    				return;
    			}
    			if (window.ethereum) {
    				ethereum.enable().then(function (accounts) {
    				myaccounts = accounts;
    				window.web3 = new Web3(ethereum);
    				// window.web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
    				})
    					.catch(function (error) {
    						// Handle error. Likely the user rejected the login
    						console.error(error)
    					});
    			}
    		});
    
    		function getOwner() {
    			var contractAddress = "0x157AA1c65518D6e1f2d00Ea75593B73A4CD41dE2";
    
    			var OwnerFactory = new web3.eth.Contract(owner_abi, contractAddress);
    			var getOwner = OwnerFactory.methods.getOwner();
    			getOwner.call(function (err, res) {
    				if (err) {
    					console.log("An error occured", err)
    					return
    				}
    				alert("The owner is: " + res)
    			});
    		}
    
    		function changeOwner() {
    			alert("changeOwner")
    			var newowner = document.getElementById("newowner").value;
    			var contractAddress = "0x157AA1c65518D6e1f2d00Ea75593B73A4CD41dE2";
    			var OwenerContract = new web3.eth.Contract(owner_abi,contractAddress);
    	    	var trans = OwenerContract.methods.changeOwner(newowner);
    
    		   	var me = myaccounts[0];
    			trans.send({from:me}).on('transactionHash', function(hash){
                    console.log(hash);
    			})
    			.on('receipt', function(receipt){
    			   console.log(receipt);
    			})
    			.on('confirmation', function(confirmationNumber, receipt){
    				alert(confirmationNumber)
    				  console.log(confirmationNumber);
    			})
    			.on('error', function(error, receipt) {
    				console.log(error);
    			});
    		}
    		function sign() {
    			alert("sign")
    
    		}
    	</script>
    	<div class="div">
    		<input type="button" onclick="javascropt:sign()" class="button" value="签名"></input>
    		<input type="button" onclick="javascropt:getOwner()" class="button" value="读合约数据"></input><br />
    		<input type="button" onclick="javascropt:changeOwner()" class="button" value="改变owner"></input>
    		<input type="text" id="newowner"></input>
    
    	</div>
    </body>
    
    </html>
    
  • owner.js (Owner的BalanceManager_metadata.json里获取)
    
    	    var owner_abi = [
    		{
    			"inputs": [],
    			"stateMutability": "nonpayable",
    			"type": "constructor"
    		},
    		{
    			"anonymous": false,
    			"inputs": [
    				{
    					"indexed": true,
    					"internalType": "address",
    					"name": "oldOwner",
    					"type": "address"
    				},
    				{
    					"indexed": true,
    					"internalType": "address",
    					"name": "newOwner",
    					"type": "address"
    				}
    			],
    			"name": "OwnerSet",
    			"type": "event"
    		},
    		{
    			"inputs": [
    				{
    					"internalType": "address",
    					"name": "newOwner",
    					"type": "address"
    				}
    			],
    			"name": "changeOwner",
    			"outputs": [],
    			"stateMutability": "nonpayable",
    			"type": "function"
    		},
    		{
    			"inputs": [],
    			"name": "getOwner",
    			"outputs": [
    				{
    					"internalType": "address",
    					"name": "",
    					"type": "address"
    				}
    			],
    			"stateMutability": "view",
    			"type": "function"
    		}
    	];
    
    	var abi =  [
    
    		{
    			"inputs": [],
    			"stateMutability": "nonpayable",
    			"type": "constructor"
    		},
    		{
    			"anonymous": false,
    			"inputs": [
    				{
    					"indexed": true,
    					"internalType": "address",
    					"name": "oldOwner",
    					"type": "address"
    				},
    				{
    					"indexed": true,
    					"internalType": "address",
    					"name": "newOwner",
    					"type": "address"
    				}
    			],
    			"name": "OwnerSet",
    			"type": "event"
    		},
    		{
    			"inputs": [
    				{
    					"internalType": "address",
    					"name": "newOwner",
    					"type": "address"
    				}
    			],
    			"name": "changeOwner",
    			"outputs": [],
    			"stateMutability": "nonpayable",
    			"type": "function"
    		},
    		{
    			"inputs": [],
    			"name": "getOwner",
    			"outputs": [
    				{
    					"internalType": "address",
    					"name": "",
    					"type": "address"
    				}
    			],
    			"stateMutability": "view",
    			"type": "function"
    		}
    	]
    
  • web3.min.js
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值