2021-9-8 前端達人
Conflux移植了EVM,兼容以太坊的合約虛擬機,使用solidity作為合約語言。所以,開發(fā)需要使用remix進行合約十六進制碼的生成。
Conflux合約需要相應(yīng)的sdk部署到鏈上,形成智能合約地址,再使用call或send的方法,調(diào)用在鏈上的合約 。
我們使用node.js作為開發(fā)環(huán)境,需要安裝node.js的環(huán)境和java sdk。node.js使用express框架,而合約部署需要對應(yīng)的 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字段保留值,其余內(nèi)容都刪除,另存為code.json。code.json內(nèi)的內(nèi)容僅為:“0x60.......”。例如:
"0x6080604052600080553480156100145......5056fea265627a7a72315820b814......0ff600baf64736f6c63430005110032"
寫調(diào)用合約的代碼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({ // 節(jié)點的地址和端口號,這里用的測試網(wǎng)。實際最好用最新的主網(wǎng)地址 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文件定義合約方法,被外部調(diào)用以實現(xiàn)應(yīng)用目的 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文件定義合約方法,被外部調(diào)用以實現(xiàn)應(yīng)用目的。
將deploy.js和call.js放置在nodejs的工作目錄下。
如果.js中的函數(shù)無錯,鏈上節(jié)點正常使用,sdk版本匹配,啟動node deploy.js或node call.js即可。如果有錯誤會有明顯的error提示。
分享此文一切功德,皆悉回向給文章原作者及眾讀者.
免責聲明:藍藍設(shè)計尊重原作者,文章的版權(quán)歸原作者。如涉及版權(quán)問題,請及時與我們?nèi)〉寐?lián)系,我們立即更正或刪除。
來源:開源博客
藍藍設(shè)計( m.yvirxh.cn )是一家專注而深入的界面設(shè)計公司,為期望卓越的國內(nèi)外企業(yè)提供卓越的UI界面設(shè)計、BS界面設(shè)計 、 cs界面設(shè)計 、 ipad界面設(shè)計 、 包裝設(shè)計 、 圖標定制 、 用戶體驗 、交互設(shè)計、 網(wǎng)站建設(shè) 、平面設(shè)計服務(wù)
藍藍設(shè)計的小編 http://m.yvirxh.cn