mirror of
https://github.com/number571/blockchain.git
synced 2026-09-13 18:45:45 +05:00
304 lines
6.2 KiB
Go
304 lines
6.2 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"math/big"
|
|
"io/ioutil"
|
|
"crypto/ecdsa"
|
|
contract "./contracts"
|
|
"github.com/ethereum/go-ethereum/crypto"
|
|
"github.com/ethereum/go-ethereum/common"
|
|
"github.com/ethereum/go-ethereum/ethclient"
|
|
"github.com/ethereum/go-ethereum/accounts/abi/bind"
|
|
)
|
|
|
|
type UserType struct {
|
|
Purse string
|
|
AddressHex string
|
|
AddressEth common.Address
|
|
PublicKey *ecdsa.PublicKey
|
|
PrivateKey *ecdsa.PrivateKey
|
|
}
|
|
|
|
type Estate struct{
|
|
Id *big.Int
|
|
Owner common.Address
|
|
Info string
|
|
Squere *big.Int
|
|
UsefulSquere *big.Int
|
|
RenterAddress common.Address
|
|
PresentStatus bool
|
|
SaleStatus bool
|
|
RentStatus bool
|
|
}
|
|
|
|
type Present struct {
|
|
Id *big.Int
|
|
EstateId *big.Int
|
|
AddressFrom common.Address
|
|
AddressTo common.Address
|
|
Finished bool
|
|
}
|
|
|
|
type Sale struct {
|
|
Id *big.Int
|
|
EstateId *big.Int
|
|
Owner common.Address
|
|
Price *big.Int
|
|
Customers []common.Address
|
|
Prices []*big.Int
|
|
Finished bool
|
|
}
|
|
|
|
type Rent struct {
|
|
Id *big.Int
|
|
EstateId *big.Int
|
|
Owner common.Address
|
|
Renter common.Address
|
|
Time *big.Int
|
|
Money *big.Int
|
|
DeadLine *big.Int
|
|
Finished bool
|
|
}
|
|
|
|
var (
|
|
User *UserType
|
|
ClientETH = connectToETH("http://127.0.0.1:5555")
|
|
Instance = newContract(
|
|
common.HexToAddress(readFile("contract.address")),
|
|
ClientETH,
|
|
)
|
|
)
|
|
|
|
func loadUser(purse string) *UserType {
|
|
priv, err := crypto.HexToECDSA(purse)
|
|
if err != nil {
|
|
return nil
|
|
}
|
|
pub, ok := priv.Public().(*ecdsa.PublicKey)
|
|
if !ok {
|
|
return nil
|
|
}
|
|
addressHex := crypto.PubkeyToAddress(*pub).Hex()
|
|
addressEth := common.HexToAddress(addressHex)
|
|
return &UserType{
|
|
Purse: purse,
|
|
AddressHex: addressHex,
|
|
AddressEth: addressEth,
|
|
PublicKey: pub,
|
|
PrivateKey: priv,
|
|
}
|
|
}
|
|
|
|
func newContract(contractAddr common.Address, clientEth *ethclient.Client) *contract.Contract {
|
|
instance, err := contract.NewContract(contractAddr, clientEth)
|
|
if err != nil {
|
|
return nil
|
|
}
|
|
return instance
|
|
}
|
|
|
|
func connectToETH(address string) *ethclient.Client {
|
|
client, err := ethclient.Dial(address)
|
|
if err != nil {
|
|
return nil
|
|
}
|
|
return client
|
|
}
|
|
|
|
func readFile(filename string) string {
|
|
data, err := ioutil.ReadFile(filename)
|
|
if err != nil {
|
|
return ""
|
|
}
|
|
return string(data)
|
|
}
|
|
|
|
func resetAuth(user *UserType) *bind.TransactOpts {
|
|
nonce, err := ClientETH.PendingNonceAt(context.Background(), crypto.PubkeyToAddress(*user.PublicKey))
|
|
if err != nil {
|
|
return nil
|
|
}
|
|
|
|
gasPrice, err := ClientETH.SuggestGasPrice(context.Background())
|
|
if err != nil {
|
|
return nil
|
|
}
|
|
|
|
auth := bind.NewKeyedTransactor(user.PrivateKey)
|
|
auth.Nonce = big.NewInt(int64(nonce))
|
|
auth.Value = big.NewInt(0)
|
|
|
|
auth.GasLimit = uint64(3000000)
|
|
auth.GasPrice = gasPrice
|
|
|
|
return auth
|
|
}
|
|
|
|
func getEstates(index *big.Int) *Estate {
|
|
// (*big.Int, common.Address, string, *big.Int, *big.Int, common.Address, error)
|
|
id, owner, info, squere, usefulsquere, renteraddress, err := Instance.GetEstates(&bind.CallOpts{From: User.AddressEth}, index)
|
|
if err != nil {
|
|
return nil
|
|
}
|
|
presentS, saleS, rentS, err := Instance.GetEstatesStatuses(&bind.CallOpts{From: User.AddressEth}, index)
|
|
if err != nil {
|
|
return nil
|
|
}
|
|
return &Estate{
|
|
Id: id,
|
|
Owner: owner,
|
|
Info: info,
|
|
Squere: squere,
|
|
UsefulSquere: usefulsquere,
|
|
RenterAddress: renteraddress,
|
|
PresentStatus: presentS,
|
|
SaleStatus: saleS,
|
|
RentStatus: rentS,
|
|
}
|
|
}
|
|
|
|
func getPresents(index *big.Int) *Present {
|
|
// (*big.Int, common.Address, common.Address, bool, error)
|
|
id, from, to, finished, err := Instance.GetPresents(&bind.CallOpts{From: User.AddressEth}, index)
|
|
if err != nil {
|
|
return nil
|
|
}
|
|
return &Present{
|
|
Id: index,
|
|
EstateId: id,
|
|
AddressFrom: from,
|
|
AddressTo: to,
|
|
Finished: finished,
|
|
}
|
|
}
|
|
|
|
func getSales(index *big.Int) *Sale {
|
|
// (*big.Int, common.Address, *big.Int, []common.Address, []*big.Int, bool, error)
|
|
id, owner, price, customers, prices, finished, err := Instance.GetSales(&bind.CallOpts{From: User.AddressEth}, index)
|
|
if err != nil {
|
|
return nil
|
|
}
|
|
return &Sale{
|
|
Id: index,
|
|
EstateId: id,
|
|
Owner: owner,
|
|
Price: price,
|
|
Customers: customers,
|
|
Prices: prices,
|
|
Finished: finished,
|
|
}
|
|
}
|
|
|
|
func getRents(index *big.Int) *Rent {
|
|
// (*big.Int, common.Address, common.Address, *big.Int, *big.Int, *big.Int, bool, error)
|
|
id, owner, renter, time, money, deadline, finished, err := Instance.GetRents(&bind.CallOpts{From: User.AddressEth}, index)
|
|
if err != nil {
|
|
return nil
|
|
}
|
|
return &Rent{
|
|
Id: index,
|
|
EstateId: id,
|
|
Owner: owner,
|
|
Renter: renter,
|
|
Time: time,
|
|
Money: money,
|
|
DeadLine: deadline,
|
|
Finished: finished,
|
|
}
|
|
}
|
|
|
|
type EstateStr struct {
|
|
Id *big.Int
|
|
Owner string
|
|
Info string
|
|
Squere *big.Int
|
|
UsefulSquere *big.Int
|
|
RenterAddress string
|
|
PresentStatus bool
|
|
SaleStatus bool
|
|
RentStatus bool
|
|
}
|
|
|
|
func estatesToString(estate *Estate) *EstateStr {
|
|
return &EstateStr{
|
|
Id: estate.Id,
|
|
Owner: estate.Owner.Hex(),
|
|
Info: estate.Info,
|
|
Squere: estate.Squere,
|
|
UsefulSquere: estate.UsefulSquere,
|
|
RenterAddress: estate.RenterAddress.Hex(),
|
|
PresentStatus: estate.PresentStatus,
|
|
SaleStatus: estate.SaleStatus,
|
|
RentStatus: estate.RentStatus,
|
|
}
|
|
}
|
|
|
|
type PresentStr struct {
|
|
Id *big.Int
|
|
EstateId *big.Int
|
|
AddressFrom string
|
|
AddressTo string
|
|
Finished bool
|
|
}
|
|
|
|
func presentsToString(present *Present) *PresentStr {
|
|
return &PresentStr{
|
|
Id: present.Id,
|
|
EstateId: present.EstateId,
|
|
AddressFrom: present.AddressFrom.Hex(),
|
|
AddressTo: present.AddressTo.Hex(),
|
|
Finished: present.Finished,
|
|
}
|
|
}
|
|
|
|
type SaleStr struct {
|
|
Id *big.Int
|
|
EstateId *big.Int
|
|
Owner string
|
|
Price *big.Int
|
|
Customers []string
|
|
Prices []*big.Int
|
|
Finished bool
|
|
}
|
|
|
|
func salesToString(sale *Sale) *SaleStr {
|
|
var customers []string
|
|
for _, cust := range sale.Customers {
|
|
customers = append(customers, cust.Hex())
|
|
}
|
|
return &SaleStr{
|
|
Id: sale.Id,
|
|
EstateId: sale.EstateId,
|
|
Owner: sale.Owner.Hex(),
|
|
Price: sale.Price,
|
|
Customers: customers,
|
|
Prices: sale.Prices,
|
|
Finished: sale.Finished,
|
|
}
|
|
}
|
|
|
|
type RentStr struct {
|
|
Id *big.Int
|
|
EstateId *big.Int
|
|
Owner string
|
|
Renter string
|
|
Time *big.Int
|
|
Money *big.Int
|
|
DeadLine *big.Int
|
|
Finished bool
|
|
}
|
|
|
|
func rentsToString(rent *Rent) *RentStr {
|
|
return &RentStr{
|
|
Id: rent.Id,
|
|
EstateId: rent.EstateId,
|
|
Owner: rent.Owner.Hex(),
|
|
Renter: rent.Renter.Hex(),
|
|
Time: rent.Time,
|
|
Money: rent.Money,
|
|
DeadLine: rent.DeadLine,
|
|
Finished: rent.Finished,
|
|
}
|
|
}
|