github.com/bigzoro/my_simplechain@v0.0.0-20240315012955-8ad0a2a29bb9/ethclient/permission.go (about)

     1  package ethclient
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"math/big"
     7  	"strconv"
     8  	"strings"
     9  
    10  	"github.com/bigzoro/my_simplechain/common"
    11  )
    12  
    13  // AddPeer 添加节点
    14  func (ec *Client) AddPeer(ctx context.Context, url string, from common.Address) (bool, error) {
    15  	var result bool
    16  	err := ec.c.CallContext(ctx, &result, "permission_addPeer", url, from)
    17  	return result, err
    18  }
    19  
    20  // RemovePeer 移除节点
    21  func (ec *Client) RemovePeer(ctx context.Context, url string) (bool, error) {
    22  	var result bool
    23  	err := ec.c.CallContext(ctx, &result, "permission_removePeer", url)
    24  	return result, err
    25  }
    26  
    27  // SetAdminNode 设置给定的节点成为管理节点
    28  // 在联盟网络初始化完成之前进行
    29  func (ec *Client) SetAdminNode(ctx context.Context, fullNodeId string, nodeName string, address common.Address, from common.Address) (string, error) {
    30  	var result string
    31  	err := ec.c.CallContext(ctx, &result, "permission_setAdminNode", fullNodeId, nodeName, address, from)
    32  	return result, err
    33  }
    34  
    35  // InitFinish 完成联盟网络初始化
    36  func (ec *Client) InitFinish(ctx context.Context, from common.Address) (string, error) {
    37  	var result string
    38  	err := ec.c.CallContext(ctx, &result, "permission_initFinish", from)
    39  	return result, err
    40  }
    41  
    42  // MakeProposalForJoin 发起加入联盟提案
    43  func (ec *Client) MakeProposalForJoin(ctx context.Context, fullNodeId string, nodeName string, nodeAddress common.Address, from common.Address) (string, error) {
    44  	var result string
    45  	err := ec.c.CallContext(ctx, &result, "permission_makeProposalForJoin", fullNodeId, nodeName, nodeAddress, from)
    46  	return result, err
    47  }
    48  
    49  // AcceptProposalForJoin 接受加入联盟提案
    50  func (ec *Client) AcceptProposalForJoin(ctx context.Context, fullNodeId string, from common.Address) (string, error) {
    51  	var result string
    52  	err := ec.c.CallContext(ctx, &result, "permission_acceptProposalForJoin", fullNodeId, from)
    53  	return result, err
    54  }
    55  
    56  // RejectProposalForJoin 拒绝加入联盟提案
    57  func (ec *Client) RejectProposalForJoin(ctx context.Context, fullNodeId string, from common.Address) (string, error) {
    58  	var result string
    59  	err := ec.c.CallContext(ctx, &result, "permission_rejectProposalForJoin", fullNodeId, from)
    60  	return result, err
    61  }
    62  
    63  // MakeProposalForAdmin 发起成为管理节点提案
    64  func (ec *Client) MakeProposalForAdmin(ctx context.Context, fullNodeId string, from common.Address) (string, error) {
    65  	var result string
    66  	err := ec.c.CallContext(ctx, &result, "permission_makeProposalForAdmin", fullNodeId, from)
    67  	return result, err
    68  }
    69  
    70  // AcceptProposalForAdmin 接受成为管理节点提案
    71  func (ec *Client) AcceptProposalForAdmin(ctx context.Context, fullNodeId string, from common.Address) (string, error) {
    72  	var result string
    73  	err := ec.c.CallContext(ctx, &result, "permission_acceptProposalForAdmin", fullNodeId, from)
    74  	return result, err
    75  }
    76  
    77  // RejectProposalForAdmin 拒绝成为管理节点提案
    78  func (ec *Client) RejectProposalForAdmin(ctx context.Context, fullNodeId string, from common.Address) (string, error) {
    79  	var result string
    80  	err := ec.c.CallContext(ctx, &result, "permission_rejectProposalForAdmin", fullNodeId, from)
    81  	return result, err
    82  }
    83  
    84  // MakeProposalForCommon 发起成为普通节点提案
    85  func (ec *Client) MakeProposalForCommon(ctx context.Context, fullNodeId string, from common.Address) (string, error) {
    86  	var result string
    87  	err := ec.c.CallContext(ctx, &result, "permission_makeProposalForCommon", fullNodeId, from)
    88  	return result, err
    89  }
    90  
    91  // AcceptProposalForCommon 接受成为普通节点提案
    92  func (ec *Client) AcceptProposalForCommon(ctx context.Context, fullNodeId string, from common.Address) (string, error) {
    93  	var result string
    94  	err := ec.c.CallContext(ctx, &result, "permission_acceptProposalForCommon", fullNodeId, from)
    95  	return result, err
    96  }
    97  
    98  // RejectProposalForCommon 拒绝成为普通节点提案
    99  func (ec *Client) RejectProposalForCommon(ctx context.Context, fullNodeId string, from common.Address) (string, error) {
   100  	var result string
   101  	err := ec.c.CallContext(ctx, &result, "permission_rejectProposalForCommon", fullNodeId, from)
   102  	return result, err
   103  }
   104  
   105  // MakeProposalForExit 发起节点退出联盟提案
   106  func (ec *Client) MakeProposalForExit(ctx context.Context, fullNodeId string, from common.Address) (string, error) {
   107  	var result string
   108  	err := ec.c.CallContext(ctx, &result, "permission_makeProposalForExit", fullNodeId, from)
   109  	return result, err
   110  }
   111  
   112  // AcceptProposalForExit 接受节点退出联盟提案
   113  func (ec *Client) AcceptProposalForExit(ctx context.Context, fullNodeId string, from common.Address) (string, error) {
   114  	var result string
   115  	err := ec.c.CallContext(ctx, &result, "permission_acceptProposalForExit", fullNodeId, from)
   116  	return result, err
   117  }
   118  
   119  // RejectProposalForExit 拒绝节点退出联盟提案
   120  func (ec *Client) RejectProposalForExit(ctx context.Context, fullNodeId string, from common.Address) (string, error) {
   121  	var result string
   122  	err := ec.c.CallContext(ctx, &result, "permission_rejectProposalForExit", fullNodeId, from)
   123  	return result, err
   124  }
   125  
   126  // IsNetworkInitFinished 联盟初始化网络是否完成
   127  func (ec *Client) IsNetworkInitFinished(ctx context.Context) (bool, error) {
   128  	var result bool
   129  	err := ec.c.CallContext(ctx, &result, "permission_isNetworkInitFinished")
   130  	return result, err
   131  }
   132  
   133  // UpdateNodeInfo 节点自己更新ip和端口
   134  func (ec *Client) UpdateNodeInfo(ctx context.Context, from common.Address, ip string, port string) (string, error) {
   135  	var result string
   136  	err := ec.c.CallContext(ctx, &result, "permission_updateNodeInfo", from, ip, port)
   137  	return result, err
   138  }
   139  
   140  // Exit 自己直接退出网络
   141  func (ec *Client) Exit(ctx context.Context, from common.Address) (string, error) {
   142  	var result string
   143  	err := ec.c.CallContext(ctx, &result, "permission_exit", from)
   144  	return result, err
   145  }
   146  
   147  // GetNodeByRole 根据角色获取节点
   148  // check pass
   149  func (ec *Client) GetNodeByRole(ctx context.Context, role *big.Int, from common.Address) (string, error) {
   150  	var result string
   151  	err := ec.c.CallContext(ctx, &result, "permission_getNodeByRole", role, from)
   152  	return result, err
   153  }
   154  
   155  // GetNodeRole 获取节点的角色
   156  func (ec *Client) GetNodeRole(ctx context.Context, fullNodeId string, from common.Address) (*big.Int, error) {
   157  	var result big.Int
   158  	err := ec.c.CallContext(ctx, &result, "permission_getNodeRole", fullNodeId, from)
   159  	return &result, err
   160  }
   161  
   162  // GetNodeInfoByName 根据节点名称获取节点信息
   163  func (ec *Client) GetNodeInfoByName(ctx context.Context, nodeName string, from common.Address) (string, error) {
   164  	var result string
   165  	err := ec.c.CallContext(ctx, &result, "permission_getNodeInfoByName", nodeName, from)
   166  	return result, err
   167  }
   168  
   169  // GetAllStatingRecord 获取正在进行的统计记录
   170  func (ec *Client) GetAllStatingRecord(ctx context.Context, from common.Address) (string, error) {
   171  	var result string
   172  	err := ec.c.CallContext(ctx, &result, "permission_getAllStatingRecord", from)
   173  	return result, err
   174  }
   175  
   176  // IsAdmin 是否是管理节点
   177  // check pass
   178  func (ec *Client) IsAdmin(ctx context.Context, fullNodeId string, from common.Address) (bool, error) {
   179  	var result bool
   180  	err := ec.c.CallContext(ctx, &result, "permission_isAdmin", fullNodeId, from)
   181  	return result, err
   182  }
   183  
   184  // SetPermissionContractAddress 设置权限合约地址
   185  // check pass
   186  func (ec *Client) SetPermissionContractAddress(ctx context.Context, addr common.Address) (bool, error) {
   187  	var result bool
   188  	err := ec.c.CallContext(ctx, &result, "permission_setPermissionContractAddress", addr)
   189  	return result, err
   190  }
   191  
   192  // GetPermissionContractAddress 获取权限合约地址
   193  // check pass
   194  func (ec *Client) GetPermissionContractAddress(ctx context.Context) (string, error) {
   195  	var result string
   196  	err := ec.c.CallContext(ctx, &result, "permission_getPermissionContractAddress")
   197  	return result, err
   198  }
   199  
   200  // SetStoreContractAddress 设置存储合约的地址
   201  // check pass
   202  func (ec *Client) SetStoreContractAddress(ctx context.Context, addr common.Address) (bool, error) {
   203  	var result bool
   204  	err := ec.c.CallContext(ctx, &result, "permission_setStoreContractAddress", addr)
   205  	return result, err
   206  }
   207  
   208  // GetStoreContractAddress 获取存储abi合约地址
   209  // check pass
   210  func (ec *Client) GetStoreContractAddress(ctx context.Context) (string, error) {
   211  	var result string
   212  	err := ec.c.CallContext(ctx, &result, "permission_getStoreContractAddress")
   213  	return result, err
   214  }
   215  
   216  // StoreContractAbi 保存合约的abi
   217  func (ec *Client) StoreContractAbi(ctx context.Context, contractAddress common.Address, contractName string, abi string, from common.Address) (string, error) {
   218  	var result string
   219  	err := ec.c.CallContext(ctx, &result, "permission_storeContractAbi", contractAddress, contractName, abi, from)
   220  	return result, err
   221  }
   222  
   223  // GetContractAbi 根据合约名称获取合约的abi
   224  func (ec *Client) GetContractAbi(ctx context.Context, contractName string, from common.Address) (string, error) {
   225  	var result string
   226  	err := ec.c.CallContext(ctx, &result, "permission_getContractAbi", contractName, from)
   227  	return result, err
   228  }
   229  
   230  func (ec *Client) GetAdminCount(ctx context.Context) (int, error) {
   231  	var result big.Int
   232  	err := ec.c.CallContext(ctx, &result, "permission_getAdminCount")
   233  	return int(result.Int64()), err
   234  }
   235  
   236  type NodeInfo struct {
   237  	NodeId       string
   238  	Ip           string
   239  	Port         string
   240  	NodeName     string
   241  	NodeAddress  string
   242  	Role         string
   243  	IsOriginator bool
   244  	CreatedAt    int64
   245  }
   246  
   247  // GetNodeInfo 获取节点信息
   248  // check pass
   249  func (ec *Client) GetNodeInfo(ctx context.Context, fullNodeId string, from common.Address) (*NodeInfo, error) {
   250  	var result string
   251  	err := ec.c.CallContext(ctx, &result, "permission_getNodeInfo", fullNodeId, from)
   252  	arr := strings.Split(result, ",")
   253  	var nodeInfo NodeInfo
   254  	if len(arr) == 8 {
   255  		nodeInfo.NodeId = arr[0]
   256  		nodeInfo.Ip = arr[1]
   257  		nodeInfo.Port = arr[2]
   258  		nodeInfo.NodeName = arr[3]
   259  		nodeInfo.NodeAddress = arr[4]
   260  		nodeInfo.Role = arr[5]
   261  		if arr[6] == "true" {
   262  			nodeInfo.IsOriginator = true
   263  		} else {
   264  			nodeInfo.IsOriginator = false
   265  		}
   266  		createdAt, err := strconv.ParseInt(arr[7], 10, 64)
   267  		if err == nil {
   268  			nodeInfo.CreatedAt = createdAt
   269  		} else {
   270  			fmt.Println("createdAt ParseInt error", arr[7])
   271  		}
   272  	}
   273  	return &nodeInfo, err
   274  }
   275  
   276  type VoteStats struct {
   277  	NodeId        string //节点id
   278  	Agree         int    //同意票
   279  	Disagree      int    //反对票
   280  	ProposeNodeId string //提议者
   281  	OpCode        string //操作
   282  	Complete      bool   //投票完成
   283  }
   284  
   285  const (
   286  	JoinAction        string = "join"         //加入网络
   287  	UpgradeAction     string = "upgrade"      //升级操作
   288  	DemoteAction      string = "demote"       //降级操作
   289  	NetworkExitAction string = "network_exit" //退出网络
   290  )
   291  
   292  //string opJoin="0";
   293  //// 1 退出联盟
   294  //string opExit="1";
   295  //// 2 升级为管理节点
   296  //string opAdmin="2";
   297  //// 3 降级成普通节点
   298  //string opCommon="3";
   299  
   300  // GetStateMap 获取节点申请的统计信息
   301  func (ec *Client) GetStateMap(ctx context.Context, fullNodeId string, opCode string, from common.Address) (*VoteStats, error) {
   302  	var result string
   303  	err := ec.c.CallContext(ctx, &result, "permission_getStateMap", fullNodeId, opCode, from)
   304  	arr := strings.Split(result, ",")
   305  	var voteStats VoteStats
   306  	if len(arr) == 5 {
   307  		voteStats.NodeId = fullNodeId
   308  		agree, err := strconv.Atoi(arr[0])
   309  		if err == nil {
   310  			voteStats.Agree = agree
   311  		}
   312  		disagree, err := strconv.Atoi(arr[1])
   313  		if err == nil {
   314  			voteStats.Disagree = disagree
   315  		}
   316  		voteStats.ProposeNodeId = arr[2]
   317  		switch arr[3] {
   318  		case "0":
   319  			voteStats.OpCode = JoinAction
   320  		case "1":
   321  			voteStats.OpCode = NetworkExitAction
   322  		case "2":
   323  			voteStats.OpCode = UpgradeAction
   324  		case "3":
   325  			voteStats.OpCode = DemoteAction
   326  		}
   327  		if arr[4] == "1" {
   328  			voteStats.Complete = true
   329  		}
   330  
   331  	}
   332  	return &voteStats, err
   333  }