2021-9-8 前端达人
Conflux移植了EVM,兼容以太坊的合约虚拟机,使用solidity作为合约语言。所以,开发需要使用remix进行合约十六进制码的生成。
Conflux合约需要相应的sdk部署到链上,形成智能合约地址,再使用call或send的方法,调用在链上的合约 。
我们使用node.js作为开发环境,需要安装node.js的环境和java sdk。node.js使用express框架,而合约部署需要对应的 js-conflux-sdk(npm install即为最新版)。建立文件夹sol,存放下面的.sol和两个.json文件,其它安装和检查办法略去2000字。
remix下删除所有的原来.sol文件,添加自己的test.sol文件,代码:
pragma solidity ^0.5.0;
contract Counter { uint public count=0; event SelfEvent(address indexed sender, uint current);
constructor() public {
} function inc(uint num) public returns (uint){ return count += num;
} function self() public { emit SelfEvent(msg.sender, count);
}
}
然后按图示选择配置,完成编译,分别生成一个abi.json和一个bytecode.json。
将bytecode文件里的bytecode字段保留值,其余内容都删除,另存为code.json。code.json内的内容仅为:“0x60.......”。例如:
"0x6080604052600080553480156100145......5056fea265627a7a72315820b814......0ff600baf64736f6c63430005110032"
写调用合约的代码deploy.js或者call.js。deploy.js 源码:
// 私钥地址,即所用conflux的钱包私钥,注意保密 const PRIVATE_KEY = '0x20f9169d40801955faada641cdb029f8e42c581c0c991a62753c736a0a168e5e'; // 合约地址 const CONTRACT = ''; const { Conflux } = require('js-conflux-sdk'); async function main() { const cfx = new Conflux({ // 节点的地址和端口号,这里用的测试网。实际最好用最新的主网地址 url: 'http://testnet-jsonrpc.conflux-chain.org:12537',
defaultGasPrice: 100,
defaultGas: 1000000,
logger: console,
}); const account = cfx.Account(PRIVATE_KEY); // create account instance console.log(account.address); // create contract instance const contract = cfx.Contract({
abi: require('./sol/abi.json'),
code: require('./sol/code.json'),
}); // deploy the contract const contractinfo = await contract.constructor()
.sendTransaction({ from: account,
gas: 100000000, // if not set gas, will use 'cfx.defaultGas' })
.confirmed(); console.log(contractinfo.contractCreated);
}
main().catch(e => console.error(e));
而call.js源码:
const { Conflux, util } = require('js-conflux-sdk'); // 这个地址是上面打印出来的 contractAddress 变量,钱包地址及私钥 const contractAddress = '0x2c692d83b1e4781fa9d894924f8a027c401ea9fa'; const PRIVATE_KEY = '0x20f9169d40801955faada641cdb029f8e42c581c0c991a62753c736a0a168e5e'; async function main() { const cfx = new Conflux({
url: 'http://testnet-jsonrpc.conflux-chain.org:12537',
defaultGasPrice: 100,
defaultGas: 1000000,
}); const contract = cfx.Contract({
address : contractAddress,
abi: require('./sol/abi.json'),
}); // 不进行记录。注意,这里的inc就是定义在test.sol中的方法。.sol文件定义合约方法,被外部调用以实现应用目的 console.log("1输出" + await contract.inc(10)); const account = cfx.Account(PRIVATE_KEY); // 进行记录并花费燃油 const balance = await contract.inc(10).sendTransaction({ from: account }).confirmed();
}
main().catch(e => console.error(e));
call.js里的inc()就是定义在test.sol中的方法。.sol文件定义合约方法,被外部调用以实现应用目的。
将deploy.js和call.js放置在nodejs的工作目录下。
如果.js中的函数无错,链上节点正常使用,sdk版本匹配,启动node deploy.js或node call.js即可。如果有错误会有明显的error提示。
分享此文一切功德,皆悉回向给文章原作者及众读者.
免责声明:蓝蓝设计尊重原作者,文章的版权归原作者。如涉及版权问题,请及时与我们取得联系,我们立即更正或删除。
来源:开源博客
蓝蓝设计( www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计、BS界面设计 、 cs界面设计 、 ipad界面设计 、 包装设计 、 图标定制 、 用户体验 、交互设计、 网站建设 、平面设计服务