智能合约入门——Remix+合约调用
最近这段时间Defi很火,但是如果你只是一个小散户,你可能只看到了表面的一层机会,而且往往还抓不住。区块链是程序的世界,科学家们统治着区块链,想要在未来的世界里深入了解区块链,用程序自动化流程是必不可少的。
当我们使用程序调用区块链上的数据时,往往需要选择一种比较方便的语言,现有的框架主要以JavaScript为主。
现在世界上比较流行的在线ide可以满足大部分的编程需求,Remix算是区块链应用里的集大成者。
https://remix.ethereum.org/
安装插件
这个在线的IDE可以选择一个入门教程,在选择插件获取(左侧图标最下面那个),搜索LEARNETH,然后选择Active就可以点击新出现的图标进入了。
1.Web.js请求区块链数据
(async () => {
try {
let blockNumber = await web3.eth.getBlockNumber()
console.log('current block number : ', blockNumber)
} catch (e) {
console.log(e.message)
}
})()
这几行代码封装了一个自调用的web3.js程序,可以在控制台返回当前以太坊的区块高度,使用的是web3.eth.getBlockNumber()这个函数。
在进行编译和执行操作前,需要将编译器设置为Injected Web3或者是Web3 Provider,JavaScript VM不支持这个web3.js库。
然后在下面的终端输入:
remix.execute()
就可以得到当前区块高度了。
2.与一个合约进行交互
刚刚我们只是通过它获取了一个区块链的信息,第二步我们就可以通过程序与以太坊上已经部署的合约进行交互了。
凡是部署到以太坊上的合约,只要它不自毁,就可以一直存在在以太坊上,而且由于去中心化的设计,部署者和使用者都不需要自己拥有服务器,大大减少了开发者的研发成本。
合约可以看成是一个类(就是一个集合体),里面有很多的函数和变量,根据部署时设置的不同,有些函数根据权限的不同只有固定的人可以调用和查看,有些函数是所有人都可以使用和查看的。
这次的例子是使用web3.eth的库来调用tether合约,获取它的名字,代码如下:
(async () => {
try {
const abi = ...
const contractAddress = '0xdac17f958d2ee523a2206206994597c13d831ec7'
// instantiate a new web3 Contract object
let contract = new web3.eth.Contract(abi, contractAddress)
// call the autogenerated function to return the value of a public state variable
let name = await contract.methods.name().call()
// log it to the remix console
console.log(name)
} catch (e) {
console.log(e.message)
}
})()
这里关于ABI这一块我进行了简化(太长了),如果我们要调用一个合约,我们得知道它的ABI以及地址,比如我们要掉用的这个合约的ABI可以通过它的地址从ethscan上查到:https://etherscan.io/address/0xdac17f958d2ee523a2206206994597c13d831ec7#code
ABI我们在这个页面上可以点击Read contract获取这个合约的变量信息,在这里可以看到它的name是Tether USD。
那么我们切换回刚刚的页面,然后进行编译和执行,同样的我们要注意刚刚的编译选项,选择Injected Web3或者是Web3 Provider,同时我们还要注意切换到Mainnet。
tips:以太网分为主网和测试网,测试网可以免费获取eth进行测试和部署,对于开发者来说可以在测试网上测试通过了再进行主网部署。主网和测试网的切换可以通过Metamask切换。
在完成了之后在网页下部的终端内输入remix.execute(),就可以看到反馈了。
OK到这里我们的入门第一步就结束了
总结一下:
1.通过web3.js可以访问以太网的信息,包括区块高度,交易等等。
2.通过web3.js可以与以太网上的合约进行交互,交互需要拥有权限,并且知道合约的地址和ABI。