1.智能合约就是在“服务器“(区块链网络)上运行的一个类。
【当拥有者上传,区块链网络就会创建影实例化合约,构造函数在此时被实例化,而且只运行这一次】
2.调用者在本地根据智能合约的abi在【本地】模拟出一个本地的类并实例话!
3.然后本地js可以像操作本地创建的对象一样来操作各种方法和属性。
4.事件不需要代码,仅仅是把对应的参数打印到区块链日志里,供查询(相当于打印参数值到控制台)
solidity函数中msg.sender获取当前函数调用者的钱包地址
总结:1.要操作代币授权,需要用代币合约的地址或者类型来实例话一个代币合约实例,用这个实例去执行具体的转移或者授权操作(也就是调用代币合约的函数)
2.谁调用了这个代币合约实例,谁就是发送者,如果用户直接用js调用,那么钱包地址就是发送者,如果在某个合约里调用了这个代币合约实例,那么这个调用的合约就是发送者【msg.sender】
例子:
const abi = [{"inputs":[],"name":"myFunction","outputs":[],"stateMutability":"nonpayable","type":"function"}];
const contractAddress = '0x1234567890123456789012345678901234567890'; const myContract = new web3.eth.Contract(abi, contractAddress);
await myContract.methods.myFunction().send({ from: '0x123...', gas: 100000 });
像这个很明显调用具体的方法后面还带了个【send】,就更能说明就是本地虚拟化出一个类(智能合约)的对象,然后带上操作{调用方法},最后发送出去!
注意:
1.整个用户调用,执行合约代码的过程是这样的:
用户调用-》钱包客户端处理(例如弹出授权申请提示框)+区块链确认-》执行合约(类)相应的方法。
即是:每次调用就是一次交易,都是先在区块链网络上确认了交易,然后才会去执行相应的方法!