区块头和区块体数据也会被当作输入数据做一次Hash运算,其运算结果会被存储在下一个区块的区块头中,这样任何区块内容的修改都会反映到区块的Hash值上,而区块的Hash值又是下一个区块的输入数据,它又会被当作新区块的数据参与一次新区块的Hash运算,随着时间的推移和交易量的增加,所有的区块会通过保存前一个区块的Hash运算结果的方式组成一条链。
==将交易打包成数据块,再将数据块以Hash值的方式组织成链式结构,这就是区块链定义的来源。==由分布在全世界的节点组成,任何人都可以公开查询,但又无法任意修改。
合约交互代码:
//SPDX-License-Identifier:MIT
pragma solidity=0.8.4;
contract Test{
uint256 private value;
function setValue(uint256 _value)public{
value=_value;
}
function getValue()public view returns(uint256){
return value;
}
}
使用web3.js与合约交互
再有就是通过web3.js的库进行交互
var fs=require('fs');
var Web3=require('web3');
const infuraKey=fs.readFileSync("../.infuraKey").toString().trim();
var ethRpcUrl=https://rinkeby.infura.io/v3/
+infuraKey
var web3=new Web3(ethRpcUrl);
abi=[
{
"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"
}
]
address="合约地址"
pk="钱包私钥"
main()
.then(()=>process.exit(0))
.catch(error=>{
console.error(error);
process.exit(1);
});
async function getValue(){
var contract=new web3.eth.Contract(abi,address);
var value=await contract.methods.getValue().call();
console.log(value);
}
async function setValue(){
value=123
var contract=new web3.eth.Contract(abi,address);
var encodeABI=await contract.methods.setValue(value).encodeABI();
var signResult=await web3.eth.accounts.signTransaction({
gas:3000000,
to:address,
data:encodeABI
},pk);
console.log(signResult);
var result=await web3.eth.sendSignedTransaction(signResult.rawTransaction);
console.log(result);
}
async function main(){
await setValue();
await getValue();
}