solidity与go交互

147 阅读6分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

solidity与go交互

1、安装geth

2、使用remix或者其他编译器编写合约

pragma solidity ^0.8.0;


contract SharingEconomy {
 
 //平台合约主持人EOA
 address private host;

 //分类编号
 uint stick_id;

 //分类信息
 struct Sticks{
     string name;//分类名称
     string img;//分类图标
     bool exist;//是否存在
     
 }
 //存储所有分类信息
 mapping(uint => Sticks) stickData;

 
 //记录合约主持人
 constructor ()  {
   host = msg.sender;
 }
 	
 //只有主持人才可执行 
 modifier onlyHost() {
   require(msg.sender == host,
   "only host can do this");
    _;
 }
 
 //添加一种分类
 function addSticker(string memory species,string memory img) public onlyHost {
   stick_id++;
   stickData[stick_id].name=species;
   stickData[stick_id].img=img;
   stickData[stick_id].exist=true;
 
 }
 
 //返回分类
  function getStick(uint id) public view  returns(string memory name,string memory img){
   if(stickData[id].exist==true){
    return (stickData[id].name,stickData[id].img);
   }
  }
  
  //修改分类
 function updateStick(uint id,string memory newName) public {
     require(stickData[id].exist==true,"not exist stick");
     stickData[id].name=newName;
 }
 //删除分类
function delStick(uint id) public {
     require(stickData[id].exist==true,"not exist stick");
     stickData[id].exist=false;
}
  
  //管理员登录
 function signIn(address people) public view returns(string memory){
     require(people==host,"not real user");
     return "yes";

}
 

}
pragma solidity ^0.8.0;

import "./SharingEconomy.sol";

contract User is SharingEconomy{
 
  //所有分类物品笔数
 mapping(string => uint)  goodsInx;
 
 //所有物品的编号
 uint number; 
 
 //用户信息
 struct Integral {
     string name; //用户姓名
     string password; //用户密码
     address people; //用户地址
     uint integral; //用户积分
     string email;//用户邮箱
     string headImg;//头像
     string sign;//个性签名
     uint goodsNum;//物品数量
     uint balance;//余额
     bool exist; //是否存在
     bool isLogin;//是否登录
 }

 
 //租借者信息
 struct Borrower {
     address borrower; //租借者地址
     string since; //租借开始时间
     string over; //租借截止时间
     
 }
 
 //物品信息
 struct Goods {
   address owner;	//出借人EOA
   Borrower borrowers; //借用人信息
   uint id; //物品id
   string name; //物品名称
   string species; //物品所在的种类
   uint rent; //租金
   uint ethPledge;	//押金
   uint count; //借用次数
   uint deal;//交易记录
   mapping(uint => dealRecords) dealData;
    uint backs;//归还记录
    mapping(uint => backRecords) backData;
   bool available;  //是否已上架
   bool isBorrow;   //是否已借出
   
 }
 //物品图片
 struct goodsImg{
   string goodSign;
   string[] goodsImgs;
 }

 //存储物品图片
 mapping (uint => goodsImg) goodsImgData;

  struct Needs {
   uint id;
   address people;
   string species;
   string content;
   string issueTimes;
   
 }

 //存储所有需求信息
// mapping (address => Needs) needsData;
// mapping (uint =>Needs) needsData;

 //交易记录
 struct dealRecords{
   uint blockNum;// 区块号
   uint dealDate; //交易时间
   bytes32 signHash; //签名哈希
   uint borrowDays;//租用天数
     bool isAgree; //是否同意
 }
 //归还记录
 struct backRecords{
   
     bool isBackAgree; //是否同意归还押金
 }
  
 //存储所有物品信息
 mapping(uint => Goods) public goodsData;
 
 //存储所有用户信息
 mapping(address => Integral) public integralData;

 //存储所有分类

 //每次转账金额
	uint eachAmount =1 ether;
 
 //用户注册
 function register(string memory name,address people,string memory email,string memory password) payable public {
     require(integralData[people].exist == false,"user is exist");
     
     integralData[people].name=name;
     integralData[people].people=people;
     integralData[people].email=email;
     integralData[people].password=password;
     integralData[people].exist=true;
     payable(people).transfer(eachAmount);
     integralData[people].balance = address(people).balance;
 }
 
 //用户登录
 function login(address people) public {
     require(people ==msg.sender,"not real user");
     require(integralData[people].people == people,"address errror");
     require(integralData[people].exist == true,"user not exist");
     integralData[people].isLogin =true;
    //  loginUser.push(people);

 }
//修改用户信息
function updateUser(address people,string memory name,string memory email,string memory sign) public{
  require(people ==msg.sender,"not real user");
  require(integralData[people].people == people,"address errror");
     integralData[people].name=name;
     integralData[people].sign=sign;
     integralData[people].email=email;
}

//添加头像
function addUserImg(address people,string memory headImg) public{
  require(people ==msg.sender,"not real user");
  require(integralData[people].people == people,"address errror");
  integralData[people].headImg=headImg;
}

 //用户注销登录
 function logout(address people) public{
     require(integralData[people].people == people,"address errror");
     require(integralData[people].isLogin == true,"people is logout");
     integralData[people].isLogin = false;
 }
 
 //物品上架
 function addGoods(address owner,string memory name,string memory species,uint rent, uint ethPledge,string[] memory goodsImgs,string memory goodSign) public returns(uint){
  require(integralData[owner].isLogin == true,"people is logout");
		 
   //物品序号加1   
   goodsInx[species] +=1;
   uint inx = goodsInx[species];
   
   number++;
   
  goodsData[number].owner=owner;
  goodsData[number].id=number;
  goodsData[number].name=name;
  goodsData[number].species=species;
  goodsData[number].rent=rent;
  goodsData[number].ethPledge=ethPledge;
  goodsData[number].count=goodsData[number].count+1;
  goodsData[number].available=true;
  goodsImgData[number].goodSign=goodSign;
  goodsImgData[number].goodsImgs=goodsImgs;
  
   goodsId.push(number);
   //返回数据索引
   return inx;
 }
 
 //修改物品
 function updGoods(uint id,string memory name,string memory species,uint rent, uint ethPledge) public {
    //必须是借出人才可以修改
    require(goodsData[id].owner ==msg.sender,"owner isn't msg");
    
  goodsData[id].name=name;
  goodsData[id].species=species;
  goodsData[id].rent=rent;
  goodsData[id].ethPledge=ethPledge;
 }

 //充值
 function topUp(uint myAmount,address people ) public payable{
  require(integralData[people].people == people,"address errror");
  payable(people).transfer(myAmount*1000000000000000000);
    integralData[people].balance += myAmount*1000000000000000000;
 }

 //返回用户信息
 function getUser(address user) public view returns (
     string memory name,address people,uint integral,string memory email,string memory sign,uint goodsNum,uint balance){
         return (integralData[user].name,integralData[user].people,integralData[user].integral,integralData[user].email,integralData[user].sign,integralData[user].goodsNum,integralData[user].balance);
 }

 //返回用户头像
 function getUserImg(address user)public view returns(string memory img){
   return integralData[user].headImg;
 }
 
 
 //按照物品ID返回物品信息
 function getGoods(uint id) public view returns (
     address owner,string memory name,string memory species,uint rent,uint ethPledge,string[] memory goodImg){
         return (goodsData[id].owner,goodsData[id].name,goodsData[id].species,goodsData[id].rent,goodsData[id].ethPledge,goodsImgData[id].goodsImgs);
 }

uint[] public goodsId;
 //返回所有物品id
 function getGoodsId() public view returns(uint[] memory){
     
     return goodsId; 
 }
  
 //物品下架
 function outGoods(address owner,uint id) public {
  //物品必须存在 
   require(goodsData[id].available==true, 
		 "goods not exist");
		 
  //只有拥有者能够下架
  require(owner == goodsData[id].owner);
  
  //操作者必须是拥有者
  require(goodsData[id].owner == msg.sender);
  
  goodsData[id].available=false;
  goodsData[id].id=0;
  
 }
 
 
 //查询物品借出状态
 function isGoodsLend(uint id) public view returns(bool) { 
   //物品必须存在 
   require(goodsData[id].available==true, 
		 "goods not exist");
	
   //返回借出状态	
   return goodsData[id].isBorrow;
 }
 
 
//  借用物品
 function borrowGoods(uint id,uint borrowDays) public returns(uint,address,uint) { 
   //物品必须存在 
   require(goodsData[id].available==true, 
		 "goods not exist");
   
   //物品必须是可用状态
   require(goodsData[id].available,
           "goods not available");
		   
   //物品必须没被借出	
   require(!goodsData[id].isBorrow,
           "goods already lend");
		   
   goodsData[id].deal += 1;
   
   goodsData[id].dealData[goodsData[id].deal].borrowDays=borrowDays;
   return (goodsData[id].deal,msg.sender,borrowDays);
 }

 //同意借用
 function agreeBorrow(uint id,uint deal,string memory since,address borrower) public {
   require(goodsData[id].owner ==msg.sender,"owner isn't msg");
   //设置借用人EOA
   goodsData[id].borrowers.borrower =borrower;
   goodsData[id].borrowers.since= since;

   goodsData[id].dealData[deal].isAgree=true;
   
 }

 //借出物品
 function borrow(uint id,uint deal) public payable{
   require(goodsData[id].dealData[deal].isAgree=true,"disagree");

   payable( goodsData[id].borrowers.borrower).transfer(goodsData[id].dealData[deal].borrowDays*goodsData[id].rent);
   //设置为已借出
   goodsData[id].isBorrow = true;
   goodsData[id].count += 1;
   goodsData[id].dealData[deal].blockNum = block.number;
   goodsData[id].dealData[deal].dealDate = block.timestamp;
 }

  //交易哈希
 function dealHash(uint id,uint deal,uint blockNum) public{
   require(goodsData[id].dealData[deal].isAgree=true,"disagree");
   goodsData[id].dealData[deal].signHash = blockhash(blockNum);
 }
 
 //查询物品借出人
 function queryBorrower(uint id) public view returns(address) { 
   //物品必须存在 
   require(goodsData[id].available==true, 
		 "goods not exist");
	
   //物品必须已被借出	
   require(goodsData[id].isBorrow,
           "goods not lend");
		   
   //返回借出人
   return goodsData[id].borrowers.borrower;
 }
 
 
 //归还
 function doGoodsReturn(uint id) public { 
   //物品必须存在 
   require(goodsData[id].available==true, 
		 "goods not exist");
	
   //必须是出借人才可以改变状态	
   require(goodsData[id].borrowers.borrower == msg.sender,
           "not goods owner");
		   
   //物品必须已被借出	
   require(goodsData[id].isBorrow,
           "goods not lend");

   goodsData[id].backs += 1;
 }

 //同意归还
 function agreeBack(uint id,uint backs) public{
   require(goodsData[id].owner ==msg.sender,"owner isn't msg");

   goodsData[id].backData[backs].isBackAgree=true;
 }

  //归还物品
 function backGoods(uint id,uint backs,string memory over) public payable{
   //将押金返还借用人
   uint pledge = goodsData[id].ethPledge;
   if(goodsData[id].backData[backs].isBackAgree==true){

    payable( goodsData[id].borrowers.borrower).transfer(pledge);
   goodsData[id].borrowers.borrower = address(0);
   goodsData[id].borrowers.over=over;
   goodsData[id].isBorrow = false;

   }else{

    payable( goodsData[id].owner).transfer(pledge);
     //设置借用人EOA
   goodsData[id].borrowers.borrower = address(0);
   
   //设置归还时间
   goodsData[id].borrowers.over=over;
   
   //设置为未借出
   goodsData[id].isBorrow = false;
   }
   //借入人获得积分
   uint integral =goodsData[id].rent *2;
   integralData[msg.sender].integral=integralData[msg.sender].integral + integral;
 }
   
 }



 

3、复制abi

1651711164(1).png

4、转go: abigen --abi 合约.abi --pkg Agreement --type 合约 --out 合约.go

5、就可以生成go文件,之间调用方法就行了。