Conflux智能合约——1.入门篇

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界面设计 、 包装设计 、 图标定制 、 用户体验 、交互设计、 网站建设 平面设计服务

分享本文至:

日历

链接

blogger

蓝蓝 http://www.lanlanwork.com

存档