In this article/tutorial, I will show how to build a simple DApp using JS-Conflux-SDK.

By using jS-Conflux-SDK, an integrated development library based on JavaScript language, and NPM package management, DApp based on Conflux network can be developed, and smart contracts of interest can be developed, compiled and deployed into Conflux network. It is hoped that through the recording and sorting of this paper, more students who are interested in The high performance public chain Conflux can try to use JS-Conflux-SDK to develop their interested projects more conveniently.

Compared with Web3, JS-Conflux-SDK has made a series of improvements and optimizations to its logic. This paper will mainly introduce the method of using this SDK to develop and invoke related smart contracts. If you’re familiar with how to write smart contracts, you can do a lot more interesting things with them.

Environment configuration

You need to install nodeJS as the running environment. For details about how to deploy the nodeJS environment, see the documentation.

  1. Select the folder where you want to store your DAPP as yourWorking directory.
  2. Run the init command of NPM in the working directory to createpackage.jsonThis file can help you store key information such as project name, project version, project description, entry point files, project dependency information and so on:
npm init -y
Copy the code
  1. package.jsonThe file content should meet your project configuration. Here is the corresponding content of the DAPP I created:
{
  "name": "contract-project"."version": "1.0.0"."description": "smart Contract"."main": "index.js"."scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "Yumingyuan"."license": "ISC"
}
Copy the code

In addition, you need to use the NPM package management tool to install some necessary dependency packages in the project path. The command is as follows:

NPM install [email protected]Copy the code

The installed version is controlled through the @ operator to ensure that the compiler is compatible with our code.

  1. In addition, you need to use the NPM command inSame working directoryInstall JavaScript Conflux Software Development Kit
npm install js-conflux-sdk
Copy the code

After installing, you will find a folder node_modules in the appropriate directory, which was automatically generated when you installed the SDK.

Trying to develop

  1. If we need to write smart contracts, we need to try them outSolidityThis door develops smart contracts for smart contracts and for high-level programming languages created to implement smart contracts. The corresponding suffix for Solidity files issolTo facilitate development, we created a contracts folder under the project folder. And store the smart contract code that we wrote./contracts/test.sol, which reads as follows:
pragma solidity ^0.5. 0;

contract ERC20 {
    
    using SafeMath for uint256;
    event Approval(address indexed tokenOwner, address indexed spender, uint tokens);
    event Transfer(address indexed from, address indexed to, uint tokens);
    mapping(address= > uint256) balances;
    mapping(address= > mapping (address= > uint256)) allowed;
    string public symbol;
    uint8 public decimals;
    string public  name;
    uint256 private _totalSupply;

    constructor(uint8 _decimals, string memory _symbol, string memory _name, uint256 _total_supply) public{
        decimals = _decimals;
        symbol = _symbol;
        name = _name;
        _totalSupply = _total_supply;
        balances[msg.sender] = _totalSupply;
    }

    function totalSupply() public view returns (uint256) {
        return _totalSupply;
    }    

    function balanceOf(address tokenOwner) public view returns (uint) {
        return balances[tokenOwner];
    }

    function transfer(address receiver, uint numTokens) public returns (bool) {
        require(numTokens <= balances[msg.sender]);
        balances[msg.sender] = balances[msg.sender].sub(numTokens);
        balances[receiver] = balances[receiver].add(numTokens);
        emit Transfer(msg.sender, receiver, numTokens);
        return true;
    }

    function approve(address delegate, uint numTokens) public returns (bool) {
        allowed[msg.sender][delegate] = numTokens;
        emit Approval(msg.sender, delegate, numTokens);
        return true;
    }

    function allowance(address owner, address delegate) public view returns (uint) {
        return allowed[owner][delegate];
    }

    function transferFrom(address owner, address buyer, uint numTokens) public returns (bool) {
        require(numTokens <= balances[owner]);    
        require(numTokens <= allowed[owner][msg.sender]);
    
        balances[owner] = balances[owner].sub(numTokens);
        allowed[owner][msg.sender] = allowed[owner][msg.sender].sub(numTokens);
        balances[buyer] = balances[buyer].add(numTokens);
        emit Transfer(owner, buyer, numTokens);
        return true;
    }
}

library SafeMath { 
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
      assert(b <= a);
      return a - b;
    }
    
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
      uint256 c = a + b;
      assert(c >= a);
      returnc; }}Copy the code
  1. The way to try out Solidity programming can be usingRemix, can be written by themselvestest.solThe file is uploaded to Remix for compilation, but we see another interesting method (the following steps are explained), so the screenshot here is just an example:

  1. There is a foreign tycoon, he wrote a special compilation can be usedsolThe JS script, whose content is as follows, is saved ascompile.jsAnd will we writetest.solFile into the./contracts/test.solUnder, at the same time willcompile.jsOn the. /The logic of this code is to readcontractsFolder contracts and save their ABI and Bytecode as JSON files, stored into the project./buildUnder folder:
const path = require('path'); const fs = require('fs-extra'); const solc = require('solc'); const sourceFolderPath = path.resolve(__dirname, 'contracts'); const buildFolderPath = path.resolve(__dirname, 'build'); const getContractSource = contractFileName => { const contractPath = path.resolve(__dirname, 'contracts', contractFileName); return fs.readFileSync(contractPath, 'utf8'); }; let sources = {}; var walk = function (dir) { var results = []; var list = fs.readdirSync(dir); list.forEach(function (file) { file = dir + '/' + file; var stat = fs.statSync(file); if (stat && stat.isDirectory()) { results = results.concat(walk(file)); } else { if (file.substr(file.length - 4, file.length) === ".sol") { sources = { ... sources, [file]: { content: getContractSource(file) } }; } results.push(file); }}); return results; }; walk(sourceFolderPath); const input = { language: 'Solidity', sources, settings: { outputSelection: { '*': { '*': ['*'] } } } } console.log('\nCompiling contracts... '); const output = JSON.parse(solc.compile(JSON.stringify(input))); console.log('Done'); let shouldBuild = true; if (output.errors) { console.error(output.errors); // throw '\nError in compilation please check the contract\n'; for (error of output.errors) { if (error.severity === 'error') { shouldBuild = false; throw 'Error found'; break; } } } if (shouldBuild) { console.log('\nBuilding please wait... '); fs.removeSync(buildFolderPath); fs.ensureDirSync(buildFolderPath); for (let contractFile in output.contracts) { for (let key in output.contracts[contractFile]) { fs.outputJsonSync( path.resolve(buildFolderPath, `${key}.json`), { abi: output.contracts[contractFile][key]["abi"], bytecode: output.contracts[contractFile][key]["evm"]["bytecode"]["object"] }, { spaces: 2, EOL: "\n" } ); } } console.log('Build finished successfully! \n'); } else { console.log('\nBuild failed\n'); }Copy the code
  1. By running it on the command linecompile.jscompile./Contracts/test.sol
node compile.js
Copy the code

The result is as follows if the compilation is successful:

  1. You can take a look at it./buildData in the folder, found that the compilation tool generated a fileERC20.jsonSafeMath.json, includingERC20.jsonAs follows:
{
  "abi": [{"constant": true."inputs": []."name": "name"."outputs": [{"internalType": "string"."name": ""."type": "string"}]."payable": false."stateMutability": "view"."type": "function"
    },
    {
      "constant": false."inputs": [{"internalType": "address"."name": "delegate"."type": "address"
        },
        {
          "internalType": "uint256"."name": "numTokens"."type": "uint256"}]."name": "approve"."outputs": [{"internalType": "bool"."name": ""."type": "bool"}]."payable": false."stateMutability": "nonpayable"."type": "function"
    },
    {
      "constant": true."inputs": []."name": "totalSupply"."outputs": [{"internalType": "uint256"."name": ""."type": "uint256"}]."payable": false."stateMutability": "view"."type": "function"
    },
    {
      "constant": false."inputs": [{"internalType": "address"."name": "owner"."type": "address"
        },
        {
          "internalType": "address"."name": "buyer"."type": "address"
        },
        {
          "internalType": "uint256"."name": "numTokens"."type": "uint256"}]."name": "transferFrom"."outputs": [{"internalType": "bool"."name": ""."type": "bool"}]."payable": false."stateMutability": "nonpayable"."type": "function"
    },
    {
      "constant": true."inputs": []."name": "decimals"."outputs": [{"internalType": "uint8"."name": ""."type": "uint8"}]."payable": false."stateMutability": "view"."type": "function"
    },
    {
      "constant": true."inputs": [{"internalType": "address"."name": "tokenOwner"."type": "address"}]."name": "balanceOf"."outputs": [{"internalType": "uint256"."name": ""."type": "uint256"}]."payable": false."stateMutability": "view"."type": "function"
    },
    {
      "constant": true."inputs": []."name": "symbol"."outputs": [{"internalType": "string"."name": ""."type": "string"}]."payable": false."stateMutability": "view"."type": "function"
    },
    {
      "constant": false."inputs": [{"internalType": "address"."name": "receiver"."type": "address"
        },
        {
          "internalType": "uint256"."name": "numTokens"."type": "uint256"}]."name": "transfer"."outputs": [{"internalType": "bool"."name": ""."type": "bool"}]."payable": false."stateMutability": "nonpayable"."type": "function"
    },
    {
      "constant": true."inputs": [{"internalType": "address"."name": "owner"."type": "address"
        },
        {
          "internalType": "address"."name": "delegate"."type": "address"}]."name": "allowance"."outputs": [{"internalType": "uint256"."name": ""."type": "uint256"}]."payable": false."stateMutability": "view"."type": "function"
    },
    {
      "inputs": [{"internalType": "uint8"."name": "_decimals"."type": "uint8"
        },
        {
          "internalType": "string"."name": "_symbol"."type": "string"
        },
        {
          "internalType": "string"."name": "_name"."type": "string"
        },
        {
          "internalType": "uint256"."name": "_total_supply"."type": "uint256"}]."payable": false."stateMutability": "nonpayable"."type": "constructor"
    },
    {
      "anonymous": false."inputs": [{"indexed": true."internalType": "address"."name": "tokenOwner"."type": "address"
        },
        {
          "indexed": true."internalType": "address"."name": "spender"."type": "address"
        },
        {
          "indexed": false."internalType": "uint256"."name": "tokens"."type": "uint256"}]."name": "Approval"."type": "event"
    },
    {
      "anonymous": false."inputs": [{"indexed": true."internalType": "address"."name": "from"."type": "address"
        },
        {
          "indexed": true."internalType": "address"."name": "to"."type": "address"
        },
        {
          "indexed": false."internalType": "uint256"."name": "tokens"."type": "uint256"}]."name": "Transfer"."type": "event"}]."bytecode": "60806040523480156200001157600080fd5b506040516200100f3803806200100f833981810160405260808110156200003757600080fd5b8101908080519060200190929190805160405193929190846401000000008211156200006257600080fd5b838201915060208201858111156200007957600080fd5b82518660018202830111640100000000821117156200009757600080fd5b8083526020830192505050908051906020019080838360005b83811015620000cd578082015181840152602081019050620000b0565b50505050905090810190601f168015620000fb5780820380516001836020036101000a031916815260200191505b50604052602001805160405193929190846401000000008211156200011f57600080fd5b838201915060208201858111156200013657600080fd5b82518660018202830111640100000000821117156200015457600080fd5b8083526020830192505050908051906020019080838360005b838110156200018a5780820151818401526020810190506200016d565b50505050905090810190601f168015620001b85780820380516001836020036101000a031916815260200191505b506040526020018051906020019092919050505083600360006101000a81548160ff021916908360ff1602179055508260029080519060200190620001ff9291906200026f565b508160049080519060200190620002189291906200026f565b50806005819055506005546000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505050506200031e565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620002b257805160ff1916838001178555620002e3565b82800160010185558215620002e3579182015b82811115620002e2578251825591602001919060010190620002c5565b5b509050620002f29190620002f6565b5090565b6200031b91905b8082111562000317576000816000905550600101620002fd565b5090565b90565b610ce1806200032e6000396000f3fe608060405234801561001057600080fd5b50600436106100935760003560e01c8063313ce56711610066578063313ce5671461022557806370a082311461024957806395d89b41146102a1578063a9059cbb14610324578063dd62ed3e1461038a57610093565b806306fdde0314610098578063095ea7b31461011b57806318160ddd1461018157806323b872dd1461019f575b600080fd5b6100a0610402565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156100e05780820151818401526020810190506100c5565b50505050905090810190601f16801561010d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101676004803603604081101561013157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506104a0565b604051808215151515815260200191505060405180910390f35b610189610592565b6040518082815260200191505060405180910390f35b61020b600480360360608110156101b557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061059c565b604051808215151515815260200191505060405180910390f35b61022d610917565b604051808260ff1660ff16815260200191505060405180910390f35b61028b6004803603602081101561025f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061092a565b6040518082815260200191505060405180910390f35b6102a9610972565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156102e95780820151818401526020810190506102ce565b50505050905090810190601f1680156103165780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103706004803603604081101561033a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610a10565b604051808215151515815260200191505060405180910390f35b6103ec600480360360408110156103a057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610bf2565b6040518082815260200191505060405180910390f35b60048054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156104985780601f1061046d57610100808354040283529160200191610498565b820191906000526020600020905b81548152906001019060200180831161047b57829003601f168201915b505050505081565b600081600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b6000600554905090565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211156105e957600080fd5b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482111561067257600080fd5b6106c3826000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610c7990919063ffffffff16565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061079482600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610c7990919063ffffffff16565b600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610865826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610c9090919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b600360009054906101000a900460ff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60028054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610a085780601f106109dd57610100808354040283529160200191610a08565b820191906000526020600020905b8154815290600101906020018083116109eb57829003601f168201915b505050505081565b60008060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054821115610a5d57600080fd5b610aae826000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610c7990919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610b41826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610c9090919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600082821115610c8557fe5b818303905092915050565b600080828401905083811015610ca257fe5b809150509291505056fea265627a7a72315820b72443db895a78ba6a5792887a143c1eef3b80737abde5b746129f115dbde05164736f6c634300050b0032"
}

Copy the code

That’s not all, you need to find the bytecode and increment the value of this key by 0x, which gives the following effect:

{
  "abi": [{"constant": true."inputs": []."name": "name"."outputs": [{"internalType": "string"."name": ""."type": "string"}]."payable": false."stateMutability": "view"."type": "function"
    },
    {
      "constant": false."inputs": [{"internalType": "address"."name": "delegate"."type": "address"
        },
        {
          "internalType": "uint256"."name": "numTokens"."type": "uint256"}]."name": "approve"."outputs": [{"internalType": "bool"."name": ""."type": "bool"}]."payable": false."stateMutability": "nonpayable"."type": "function"
    },
    {
      "constant": true."inputs": []."name": "totalSupply"."outputs": [{"internalType": "uint256"."name": ""."type": "uint256"}]."payable": false."stateMutability": "view"."type": "function"
    },
    {
      "constant": false."inputs": [{"internalType": "address"."name": "owner"."type": "address"
        },
        {
          "internalType": "address"."name": "buyer"."type": "address"
        },
        {
          "internalType": "uint256"."name": "numTokens"."type": "uint256"}]."name": "transferFrom"."outputs": [{"internalType": "bool"."name": ""."type": "bool"}]."payable": false."stateMutability": "nonpayable"."type": "function"
    },
    {
      "constant": true."inputs": []."name": "decimals"."outputs": [{"internalType": "uint8"."name": ""."type": "uint8"}]."payable": false."stateMutability": "view"."type": "function"
    },
    {
      "constant": true."inputs": [{"internalType": "address"."name": "tokenOwner"."type": "address"}]."name": "balanceOf"."outputs": [{"internalType": "uint256"."name": ""."type": "uint256"}]."payable": false."stateMutability": "view"."type": "function"
    },
    {
      "constant": true."inputs": []."name": "symbol"."outputs": [{"internalType": "string"."name": ""."type": "string"}]."payable": false."stateMutability": "view"."type": "function"
    },
    {
      "constant": false."inputs": [{"internalType": "address"."name": "receiver"."type": "address"
        },
        {
          "internalType": "uint256"."name": "numTokens"."type": "uint256"}]."name": "transfer"."outputs": [{"internalType": "bool"."name": ""."type": "bool"}]."payable": false."stateMutability": "nonpayable"."type": "function"
    },
    {
      "constant": true."inputs": [{"internalType": "address"."name": "owner"."type": "address"
        },
        {
          "internalType": "address"."name": "delegate"."type": "address"}]."name": "allowance"."outputs": [{"internalType": "uint256"."name": ""."type": "uint256"}]."payable": false."stateMutability": "view"."type": "function"
    },
    {
      "inputs": [{"internalType": "uint8"."name": "_decimals"."type": "uint8"
        },
        {
          "internalType": "string"."name": "_symbol"."type": "string"
        },
        {
          "internalType": "string"."name": "_name"."type": "string"
        },
        {
          "internalType": "uint256"."name": "_total_supply"."type": "uint256"}]."payable": false."stateMutability": "nonpayable"."type": "constructor"
    },
    {
      "anonymous": false."inputs": [{"indexed": true."internalType": "address"."name": "tokenOwner"."type": "address"
        },
        {
          "indexed": true."internalType": "address"."name": "spender"."type": "address"
        },
        {
          "indexed": false."internalType": "uint256"."name": "tokens"."type": "uint256"}]."name": "Approval"."type": "event"
    },
    {
      "anonymous": false."inputs": [{"indexed": true."internalType": "address"."name": "from"."type": "address"
        },
        {
          "indexed": true."internalType": "address"."name": "to"."type": "address"
        },
        {
          "indexed": false."internalType": "uint256"."name": "tokens"."type": "uint256"}]."name": "Transfer"."type": "event"}]."bytecode": "0x60806040523480156200001157600080fd5b506040516200100f3803806200100f833981810160405260808110156200003757600080fd5b8101908080519060200190929190805160405193929190846401000000008211156200006257600080fd5b838201915060208201858111156200007957600080fd5b82518660018202830111640100000000821117156200009757600080fd5b8083526020830192505050908051906020019080838360005b83811015620000cd578082015181840152602081019050620000b0565b50505050905090810190601f168015620000fb5780820380516001836020036101000a031916815260200191505b50604052602001805160405193929190846401000000008211156200011f57600080fd5b838201915060208201858111156200013657600080fd5b82518660018202830111640100000000821117156200015457600080fd5b8083526020830192505050908051906020019080838360005b838110156200018a5780820151818401526020810190506200016d565b50505050905090810190601f168015620001b85780820380516001836020036101000a031916815260200191505b506040526020018051906020019092919050505083600360006101000a81548160ff021916908360ff1602179055508260029080519060200190620001ff9291906200026f565b508160049080519060200190620002189291906200026f565b50806005819055506005546000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505050506200031e565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620002b257805160ff1916838001178555620002e3565b82800160010185558215620002e3579182015b82811115620002e2578251825591602001919060010190620002c5565b5b509050620002f29190620002f6565b5090565b6200031b91905b8082111562000317576000816000905550600101620002fd565b5090565b90565b610ce1806200032e6000396000f3fe608060405234801561001057600080fd5b50600436106100935760003560e01c8063313ce56711610066578063313ce5671461022557806370a082311461024957806395d89b41146102a1578063a9059cbb14610324578063dd62ed3e1461038a57610093565b806306fdde0314610098578063095ea7b31461011b57806318160ddd1461018157806323b872dd1461019f575b600080fd5b6100a0610402565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156100e05780820151818401526020810190506100c5565b50505050905090810190601f16801561010d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101676004803603604081101561013157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506104a0565b604051808215151515815260200191505060405180910390f35b610189610592565b6040518082815260200191505060405180910390f35b61020b600480360360608110156101b557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061059c565b604051808215151515815260200191505060405180910390f35b61022d610917565b604051808260ff1660ff16815260200191505060405180910390f35b61028b6004803603602081101561025f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061092a565b6040518082815260200191505060405180910390f35b6102a9610972565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156102e95780820151818401526020810190506102ce565b50505050905090810190601f1680156103165780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103706004803603604081101561033a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610a10565b604051808215151515815260200191505060405180910390f35b6103ec600480360360408110156103a057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610bf2565b6040518082815260200191505060405180910390f35b60048054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156104985780601f1061046d57610100808354040283529160200191610498565b820191906000526020600020905b81548152906001019060200180831161047b57829003601f168201915b505050505081565b600081600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b6000600554905090565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211156105e957600080fd5b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482111561067257600080fd5b6106c3826000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610c7990919063ffffffff16565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061079482600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610c7990919063ffffffff16565b600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610865826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610c9090919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b600360009054906101000a900460ff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60028054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610a085780601f106109dd57610100808354040283529160200191610a08565b820191906000526020600020905b8154815290600101906020018083116109eb57829003601f168201915b505050505081565b60008060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054821115610a5d57600080fd5b610aae826000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610c7990919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610b41826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610c9090919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600082821115610c8557fe5b818303905092915050565b600080828401905083811015610ca257fe5b809150509291505056fea265627a7a72315820b72443db895a78ba6a5792887a143c1eef3b80737abde5b746129f115dbde05164736f6c634300050b0032"
}

Copy the code

Please be sure to find this difference and add 0x after compiling, otherwise, errors will occur during subsequent deployment contracts. The advantage of having both the ABI and Bytecode in the same JSON file is that we only need to read the ERc20.json file to use them to call Conflux to create the smart contract.

  1. After the smart contract is compiled, we need to deploy it into the Conflux network, and you need to spend some time to prepare as follows:
  • See How to Create a Conflux Web Wallet to create your own Conflux wallet;
  • After logging in to the wallet, click on the pageApply for test currencyButton, apply for 100CFX test currency, the subsequent deployment contract needs to be consumed;
  • Click in the left columnThe private key walletGet your private key. This private key is only used to deploy the contract. Do not tell others, because the private key can be accessed directly into your wallet and cannot be made public.
  1. writedeploy.js, its purpose is to deploy the written contract to the Conflux network, and the deployment location is the contract address corresponding to the private key (there will be a later explain oh, don’t hurry!).
// Fill in your private key address, in order to reduce information leakage, I use the test account private key after 20 has been replaced with an asterisk, do not copy my ha!
const PRIVATE_KEY = '0x2772b19636f1d183a9a2a0d27da2a1d0efb97637b425********************';
// Contract address
const CONTRACT = ' ';
const { Conflux } = require('js-conflux-sdk');
const compiled = require(`./build/${process.argv[2]}.json`);
const config = require('./config.json');

async function main() {
  const cfx = new Conflux({
    url: 'http://main.confluxrpc.org'});const account = cfx.Account(PRIVATE_KEY); // create account instance
  console.log(account.address); 

  // create contract instance
  const contract = cfx.Contract({
	  
    abi: compiled.abi,
    bytecode: compiled.bytecode,
  });
  //console.log(contract.address)
  const receipt = await contract.constructor(config["decimals"], config["symbol"], config["name"], config["total_supply"])
    .sendTransaction({ from: account })
    .confirmed();
  console.log("recv:"+receipt.contractCreated); 
}
main().catch(e= > console.error(e));
Copy the code

To be clear: Nonce is the transaction sequence number of the account. Each initiated transaction (including the deployment contract) uses a Nonce which increases by 1 after the transaction succeeds. If the transaction fails, the Nonce does not increase by 1 (the nonce is specified here, and you can also delete it to use the default value of Conflux). If the nonce cannot be executed because an error exists in the system, an error is reported as follows:

const config = require(‘./config.json’); Json file, where private_key uses the same private key as deploy.js:

{
  "private_key": "2772b19636f1d183a9a2a0d27da2a1d0efb97637b425********************"."network": "homestead"."ERC20": "0x0DEd9F7D82a24099F09AF7831CaB61B31Df10487"."name": "Kanchan Coin"."symbol": "SNK"."total_supply": "1000000000000000000000000"."decimals": 18
}
Copy the code

Deployment and Invocation

  1. rundeploy.jsThe method is as follows:
node deploy.js <contract_name>

Copy the code

Take the contract we wrote as an example:

node deploy.js ERC20
Copy the code

It should be noted that ERC20 is a command-line argument, obtained by process.argv[2] in deploy.js, which helps our program to find and deploy named test.json in the./contracts/ folder.

  1. The command output is displayed through the programrecv:0x846ba74923c670a5aec4e58b7551396b9bed5658Obtained the address of our deployment contract0x846ba74923c670a5aec4e58b7551396b9bed5658Continue writing at that addresscall.jsCode to access and invoke the contract:
const { Conflux, util } = require('js-conflux-sdk');
// Address of the contract holder
const public_address = '0x17b38613e633c2b8fb4686a3a62b9b782ac5e0ca';
/ / deploy contracts address address, associated with 0 x17b38613e633c2b8fb4686a3a62b9b782ac5e0ca: above has been explained
const contractAddress = '0x846ba74923c670a5aec4e58b7551396b9bed5658';
const PRIVATE_KEY = '0x2772b19636f1d183a9a2a0d27da2a1d0efb97637b425********************';
const compiled = require(`./build/ERC20.json`)
async function main() {
  const cfx = new Conflux({
    url: 'http://main.confluxrpc.org'});const contract = cfx.Contract({
    address : contractAddress,
    abi: compiled.abi,
  });
  // Check the supply volume
  let result = await contract.totalSupply();
  console.log("Total supply:"  + result.toString());
  const account = cfx.Account(PRIVATE_KEY);
  
  // Check the account balance
  let balance = await contract.balanceOf(public_address);
  console.log("address:"+public_address+" have balance:"+balance.toString());// This is the account public address of the deployment contract
  
  // Try to trade
  let allowance_result=await contract.allowance(public_address,'0x1941E3137aDDf02514cBFeC292710463d41e8196');
  console.log("tx:"+allowance_result);
  
  approve_result=await contract.approve(transfer_address,1000);
  console.log("approve result:"+approve_result);
  // Try to transfer money
  let transfer_balance=await contract.balanceOf(transfer_address);
  console.log("address:"+transfer_address+" have balance:"+transfer_balance.toString());
  
  await contract.transfer(transfer_address,100).sendTransaction({
	  from: account
  }).confirmed();
  
  let transfer_balance_after=await contract.balanceOf(transfer_address);
  console.log("after transfer address:"+transfer_address+" have balance:"+transfer_balance_after.toString());
  
}
main().catch(e= > console.error(e));
Copy the code
  1. The result is as follows:

Afterword.

  1. After the above environment configuration this wave of operation, ourpackage.jsonThe document also changed:
{
  "name": "contract-project"."version": "1.0.0"."description": "smart Contract"."main": "index.js"."scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "Yumingyuan"."license": "ISC"."dependencies": {
    "ethers": "^ 5.0.3." "."fs-extra": "^ 9.0.1"."js-conflux-sdk": "^ 0.10.3"."solc": "^ 0.5.11"}}Copy the code
  1. The path file tree for the project is as follows:
+Contract-project
    -call.js
    -compile.js
    -config.json
    -deploy.js
    +build
        -ERC20.json
        -SafeMath.json
    +contracts
        -test.sol
   -package.json
   -package-lock.json
Copy the code

Thanks to community friends: Yu Mingyuan for your hard work

Thanks for the guidance and help of the assassin and Panpan.