數字藏品開發(上線版)丨數字藏品系統開發(NFT數字藏品原始碼)

xiaofufu發表於2023-02-27

  智慧合約是執行在區塊鏈公鏈上的一種程式碼,該程式碼由Solidity編寫,並透過區塊鏈的智慧合約虛擬機器來執行,以達到對區塊鏈程式設計的目標。可以將區塊鏈公聯理解為作業系統,Solidity是編寫該作業系統應用程式的程式語言,智慧合約虛擬機器則是程式語言編譯之後的程式碼執行環境。


  var fs=require('fs');


  const fetch=require('node-fetch')


  var Web3=require('web3');


  const ethers=require('ethers');


  const infuraKey=fs.readFileSync("../.infuraKey").toString().trim();


  var ethRpcUrl=``+infuraKey


  var web3=new Web3(ethRpcUrl);


  abi=[


  {


  "inputs":[],


  "name":"getValue",


  "outputs":[


  {


  "internalType":"uint256",


  "name":"",


  "type":"uint256"


  }


  ],


  "stateMutability":"view",


  "type":"function"


  },


  {


  "inputs":[


  {


  "internalType":"uint256",


  "name":"_value",


  "type":"uint256"


  }


  ],


  "name":"setValue",


  "outputs":[],


  "stateMutability":"nonpayable",


  "type":"function"


  }


  ]


  contractAddress="合約地址"


  pk="錢包私鑰"


  userAccount="私鑰對應的賬戶地址"


  main()


  .then(()=>process.exit(0))


  .catch(error=>{


  console.error(error);


  process.exit(1);


  });


  async function main(){


  await setValue();


  await getValue();


  }


  async function getNonce(account){


  let nonce=await web3.eth.getTransactionCount(account);


  console.log('nonce=',nonce)


  return nonce;


  }


  async function getValue(){


  //對方法進行sha3編碼,然後取前四個位元組


  //var methodSign=await web3.utils.keccak256("getValue()").substr(0,10);


  var methodSign=await web3.utils.keccak256("getValue()").substr(0,10);


  //console.log(methodSign)


  data=methodSign;


  //如果有入參,對入參進行編碼


  //encodeParams=web3.eth.abi.encodeParameters(['uint256'],[456]);


  //拼接方法名和入參作為jsonrpc的params中的data欄位的資料


  //data+=encodeParams.substr(2,encodeParams.length)


  console.log(data)


  //構造post請求的body引數


  var input={"jsonrpc":"2.0","id":3,"method":"eth_call","params":[{"to":contractAddress,"data":data},"latest"]}


  //http可以一次多個請求


  var inputs=[input,input]


  //傳送post請求


  const resp=await fetch(ethRpcUrl,{


  method:"POST",


  body:JSON.stringify(inputs),


  headers:{


  "Content-Type":"application/json"


  }


  });


  var rpcResult=await resp.json();


  console.log(rpcResult[0].result)


  //用ethers包中的方法解析返回結果


  var ethersResult=await ethers.utils.defaultAbiCoder.decode(['uint256'],rpcResult[0].result)


  //用web3包中的方法解析防護結果


  var decodeResult=await web3.eth.abi.decodeParameters(['uint256'],rpcResult[0].result);


  console.log("vaule is"+ethersResult)


  console.log("value is"+decodeResult[0])


  }


  async function setValue(){


  //這裡借用web3的方法對要傳送的內容進行簽名


  var contract=new web3.eth.Contract(abi,contractAddress);


  value=456;


  var encodeABI=contract.methods.setValue(value).encodeABI();


  var signResult=await web3.eth.accounts.signTransaction({


  gas:3000000,


  to:contractAddress,


  data:encodeABI,


  nonce:await getNonce(userAccount)


  },pk);


  console.log(signResult);


  rawTransaction=signResult.rawTransaction


  //構造post請求的body引數


  var input={"jsonrpc":"2.0","id":3,"method":"eth_sendRawTransaction","params":[rawTransaction]}


  console.log(input)


  var inputs=[input]


  //傳送post請求


  const resp=await fetch(ethRpcUrl,{


  method:"POST",


  body:JSON.stringify(inputs),


  headers:{


  "Content-Type":"application/json"


  }


  });


  var rpcResult=await resp.json();


  console.log(rpcResult)


  }


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69956839/viewspace-2937097/,如需轉載,請註明出處,否則將追究法律責任。

相關文章