客户端和web端对智能合约的事件Event进行调用的代码示例
web truffle
按官网的例子
http://truffleframework.com/boxes/pet-shop
truffle作为一个运行测试框架,用的也是web3对智能合约进行调用。
文件所在的位置src/js/app.js
initWeb3: function() {
// web3入口
if (typeof web3 !== 'undefined') {
App.web3Provider = web3.currentProvider;
} else {
// 测试网络
App.web3Provider = new Web3.providers.HttpProvider('http://localhost:8588'); //这里是我指定的端口88
}
web3 = new Web3(App.web3Provider);
return App.initContract();
},
初始化智能合约的时候,用了truffle自己编译的json文件进行调用
initContract: function() {
//加载Adoption.json
$.getJSON('Adoption.json', function(data) {
// 智能合约实例化
var AdoptionArtifact = data;
App.contracts.Adoption = TruffleContract(AdoptionArtifact); //赋值到App.contracts下的节点数据
// 设置合约提供者
App.contracts.Adoption.setProvider(App.web3Provider);
// 检索操作
return App.markAdopted();
});
return App.bindEvents();//执行事件绑定
},
事件绑定是这么实现的
bindEvents: function() {
$(document).on('click', '.btn-adopt', App.handleAdopt);
},
其中btn-adopt
对应的是src/index.html
中的按钮
<button class="btn btn-default btn-adopt" type="button" data-id="0">Adopt</button>
运行环境后,进行元素检查,发现按钮绑定了事件
被绑定的方法在js文件的下面做定义。
handleAdopt: function() {
event.preventDefault();//该方法将通知 Web 浏览器不要执行与事件关联的默认动作(如果存在这样的动作)
var petId = parseInt($(event.target).data('id'));
var adoptionInstance;
web3.eth.getAccounts(function(error, accounts) { //本质还是web3调用
if (error) {
console.log(error);
}
var account = accounts[0];
App.contracts.Adoption.deployed().then(function(instance) {
adoptionInstance = instance;
// Execute adopt as a transaction by sending account
return adoptionInstance.adopt(petId, {from: account});
}).then(function(result) {
return App.markAdopted(); //成功了就把按钮禁用
}).catch(function(err) {
console.log(err.message);
});
});
}
markAdopted: function(adopters, account) {
//实例
var adoptionInstance;
App.contracts.Adoption.deployed().then(function(instance) {
adoptionInstance = instance;
return adoptionInstance.getAdopters.call();
}).then(function(adopters) {
for (i = 0; i < adopters.length; i++) {
if (adopters[i] !== '0x0000000000000000000000000000000000000000') {
$('.panel-pet').eq(i).find('button').text('Success').attr('disabled', true);
}
}
}).catch(function(err) {
console.log(err.message);
});
},
总结:web端的智能合约使用技术栈为 Node + truffle + web3 ,能完成完整的编写,测试,部署。
客户端 java web3j
项目开源地址为 https://github.com/web3j/web3j
由于web3j的作用和web3一样,都是对智能合约进行部署调用。
客户端 java qtum-android
量子链官方钱包客户端并没有使用web3j,而是自己写的库。
项目地址为 https://github.com/qtumproject/qtum-android
文件为位置 app/src/main/java/org/qtum/wallet/utils/ContractBuilder.java