cryptozombies全攻略八
第四章.调用和合约函数
web3.js有2个方法来调用合约的函数
1.call
2.send
call
call用来调用view函数和pure函数
值运行在本地节点
不会在区块链上创建事务
send
send将创建一个事务并改变区块链上的数据
用send来调用非view或pure的函数
myContract.methods.myMethod(123).call()
myContract.methods.myMethod(123).send()
之前,我们定义了
Zombie[] public zombies;
这是一个公开的僵尸数组
在solidity中,当定义了一个public变量的时候
它将自动定义一个公开的getter同名方法
所以如果要查看一个id为15的僵尸
可以这样
zombies(15)
代码
function getZombieDetails(id){
return cryptoZombies.methods.zombies(id).call()
}
//调用函数
getZombieDetail(15)
.then(function(result){
console.log('Zombie 15: ', JSON.stringify(result))
})
这里的
cryptoZombies.methods.zombies(id).call()
会和web3提供者节点进行通信
告诉它返回id为15的僵尸信息
然后我们把三个方法都写出来
都是相同的道理
用cryptoZombies对象的methods
然后直接调用对应的方法,调用call()
function getZombieDetails(id) {
return cryptoZombies.methods.zombies(id).call()
}
function zombieToOwner(id) {
return cryptoZombies.methods.zombieToOwner(id).call()
}
function getZombiesByOwner(owner) {
return cryptoZombies.methods.getZombiesByOwner(owner).call()
}
第五章.MetaMask和账户
MetaMask允许用户在扩展中管理多个账户
我们可以这样来获取web3变量中激活的当前账户
var userAccount = web3.eth.accounts[0]
因为用户可以随时在MetaMask中切换账户
我们的应用需要去监控这个变量
一旦改变了就需要去更新界面
我们可以写一个setInterval方法
var accountInterval = setInterval(function(){
//检查账户是否切换
if( web3.eth.accounts[0] !== userAccount){
userAccount = web3.eth.accounts[0];
//调用一些方法来更新界面
updateInterface();
}
},100);
这段代码的意思是
每100毫秒就检查一次userAccount
是否还等于web3.eth.accounts[0]
如果不等,那么就将当前激活用户
赋值给userAccount
然后更新界面
第六章.显示
function displayZombies(ids) {
$("#zombies").empty();
for (id of ids) {
// Look up zombie details from our contract. Returns a `zombie` object
getZombieDetails(id)
.then(function(zombie) {
// Using ES6's "template literals" to inject variables into the HTML.
// Append each one to our #zombies div
$("#zombies").append(`<div class="zombie">
<ul>
<li>Name: ${zombie.name}</li>
<li>DNA: ${zombie.dna}</li>
<li>Level: ${zombie.level}</li>
<li>Wins: ${zombie.winCount}</li>
<li>Losses: ${zombie.lossCount}</li>
<li>Ready Time: ${zombie.readyTime}</li>
</ul>
</div>`);
});
}
}
第七章.发送事务
send
1.send一个事务需要一个from地址
来表明谁在调用这个函数
2.send一个事务需要花费gas
3.在用户send一个事务到该事务对区块链产生影响之间有一个不可忽略的延迟
生成僵尸
createRandomZombie
function createRandomZombie(string _name) public{
require(ownerZombieCount[msg.sender]=0);
uint randDna = _generateRandomDna(_name);
randDna = randDna - randDna % 100;
_createZombie(_name, randDna);
}