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 }