mirror of https://github.com/poanetwork/quorum.git
integrate permission contracts with geth - update cache from contract and events
This commit is contained in:
parent
a98971370c
commit
eeda3e7044
|
@ -28,7 +28,7 @@ var (
|
||||||
)
|
)
|
||||||
|
|
||||||
// NodeManagerABI is the input ABI used to generate the binding from.
|
// NodeManagerABI is the input ABI used to generate the binding from.
|
||||||
const NodeManagerABI = "[{\"constant\":false,\"inputs\":[{\"name\":\"_enodeId\",\"type\":\"string\"}],\"name\":\"approveNode\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_enodeId\",\"type\":\"string\"}],\"name\":\"getNodeStatus\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"enodeId\",\"type\":\"string\"}],\"name\":\"getNodeDetails\",\"outputs\":[{\"name\":\"_enodeId\",\"type\":\"string\"},{\"name\":\"_nodeStatus\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_enodeId\",\"type\":\"string\"},{\"name\":\"_orgId\",\"type\":\"string\"}],\"name\":\"addOrgNode\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"nodeIndex\",\"type\":\"uint256\"}],\"name\":\"getNodeDetailsFromIndex\",\"outputs\":[{\"name\":\"_orgId\",\"type\":\"string\"},{\"name\":\"_enodeId\",\"type\":\"string\"},{\"name\":\"_nodeStatus\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_enodeId\",\"type\":\"string\"},{\"name\":\"_orgId\",\"type\":\"string\"}],\"name\":\"addNode\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getNumberOfNodes\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"name\":\"_permUpgradable\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_enodeId\",\"type\":\"string\"}],\"name\":\"NodeProposed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_enodeId\",\"type\":\"string\"}],\"name\":\"NodeApproved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_enodeId\",\"type\":\"string\"}],\"name\":\"NodePendingDeactivation\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_enodeId\",\"type\":\"string\"}],\"name\":\"NodeDeactivated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_enodeId\",\"type\":\"string\"}],\"name\":\"NodePendingActivation\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_enodeId\",\"type\":\"string\"}],\"name\":\"NodeActivated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_enodeId\",\"type\":\"string\"}],\"name\":\"NodePendingBlacklist\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"\",\"type\":\"string\"}],\"name\":\"NodeBlacklisted\",\"type\":\"event\"}]"
|
const NodeManagerABI = "[{\"constant\":false,\"inputs\":[{\"name\":\"_enodeId\",\"type\":\"string\"}],\"name\":\"approveNode\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_enodeId\",\"type\":\"string\"}],\"name\":\"getNodeStatus\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"enodeId\",\"type\":\"string\"}],\"name\":\"getNodeDetails\",\"outputs\":[{\"name\":\"_orgId\",\"type\":\"string\"},{\"name\":\"_enodeId\",\"type\":\"string\"},{\"name\":\"_nodeStatus\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_enodeId\",\"type\":\"string\"},{\"name\":\"_orgId\",\"type\":\"string\"}],\"name\":\"addOrgNode\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"nodeIndex\",\"type\":\"uint256\"}],\"name\":\"getNodeDetailsFromIndex\",\"outputs\":[{\"name\":\"_orgId\",\"type\":\"string\"},{\"name\":\"_enodeId\",\"type\":\"string\"},{\"name\":\"_nodeStatus\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_enodeId\",\"type\":\"string\"},{\"name\":\"_orgId\",\"type\":\"string\"}],\"name\":\"addNode\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getNumberOfNodes\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"name\":\"_permUpgradable\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_enodeId\",\"type\":\"string\"}],\"name\":\"NodeProposed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_enodeId\",\"type\":\"string\"}],\"name\":\"NodeApproved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_enodeId\",\"type\":\"string\"}],\"name\":\"NodePendingDeactivation\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_enodeId\",\"type\":\"string\"}],\"name\":\"NodeDeactivated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_enodeId\",\"type\":\"string\"}],\"name\":\"NodePendingActivation\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_enodeId\",\"type\":\"string\"}],\"name\":\"NodeActivated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_enodeId\",\"type\":\"string\"}],\"name\":\"NodePendingBlacklist\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"\",\"type\":\"string\"}],\"name\":\"NodeBlacklisted\",\"type\":\"event\"}]"
|
||||||
|
|
||||||
// NodeManager is an auto generated Go binding around an Ethereum contract.
|
// NodeManager is an auto generated Go binding around an Ethereum contract.
|
||||||
type NodeManager struct {
|
type NodeManager struct {
|
||||||
|
@ -174,12 +174,14 @@ func (_NodeManager *NodeManagerTransactorRaw) Transact(opts *bind.TransactOpts,
|
||||||
|
|
||||||
// GetNodeDetails is a free data retrieval call binding the contract method 0x3f0e0e47.
|
// GetNodeDetails is a free data retrieval call binding the contract method 0x3f0e0e47.
|
||||||
//
|
//
|
||||||
// Solidity: function getNodeDetails(enodeId string) constant returns(_enodeId string, _nodeStatus uint256)
|
// Solidity: function getNodeDetails(enodeId string) constant returns(_orgId string, _enodeId string, _nodeStatus uint256)
|
||||||
func (_NodeManager *NodeManagerCaller) GetNodeDetails(opts *bind.CallOpts, enodeId string) (struct {
|
func (_NodeManager *NodeManagerCaller) GetNodeDetails(opts *bind.CallOpts, enodeId string) (struct {
|
||||||
|
OrgId string
|
||||||
EnodeId string
|
EnodeId string
|
||||||
NodeStatus *big.Int
|
NodeStatus *big.Int
|
||||||
}, error) {
|
}, error) {
|
||||||
ret := new(struct {
|
ret := new(struct {
|
||||||
|
OrgId string
|
||||||
EnodeId string
|
EnodeId string
|
||||||
NodeStatus *big.Int
|
NodeStatus *big.Int
|
||||||
})
|
})
|
||||||
|
@ -190,8 +192,9 @@ func (_NodeManager *NodeManagerCaller) GetNodeDetails(opts *bind.CallOpts, enode
|
||||||
|
|
||||||
// GetNodeDetails is a free data retrieval call binding the contract method 0x3f0e0e47.
|
// GetNodeDetails is a free data retrieval call binding the contract method 0x3f0e0e47.
|
||||||
//
|
//
|
||||||
// Solidity: function getNodeDetails(enodeId string) constant returns(_enodeId string, _nodeStatus uint256)
|
// Solidity: function getNodeDetails(enodeId string) constant returns(_orgId string, _enodeId string, _nodeStatus uint256)
|
||||||
func (_NodeManager *NodeManagerSession) GetNodeDetails(enodeId string) (struct {
|
func (_NodeManager *NodeManagerSession) GetNodeDetails(enodeId string) (struct {
|
||||||
|
OrgId string
|
||||||
EnodeId string
|
EnodeId string
|
||||||
NodeStatus *big.Int
|
NodeStatus *big.Int
|
||||||
}, error) {
|
}, error) {
|
||||||
|
@ -200,8 +203,9 @@ func (_NodeManager *NodeManagerSession) GetNodeDetails(enodeId string) (struct {
|
||||||
|
|
||||||
// GetNodeDetails is a free data retrieval call binding the contract method 0x3f0e0e47.
|
// GetNodeDetails is a free data retrieval call binding the contract method 0x3f0e0e47.
|
||||||
//
|
//
|
||||||
// Solidity: function getNodeDetails(enodeId string) constant returns(_enodeId string, _nodeStatus uint256)
|
// Solidity: function getNodeDetails(enodeId string) constant returns(_orgId string, _enodeId string, _nodeStatus uint256)
|
||||||
func (_NodeManager *NodeManagerCallerSession) GetNodeDetails(enodeId string) (struct {
|
func (_NodeManager *NodeManagerCallerSession) GetNodeDetails(enodeId string) (struct {
|
||||||
|
OrgId string
|
||||||
EnodeId string
|
EnodeId string
|
||||||
NodeStatus *big.Int
|
NodeStatus *big.Int
|
||||||
}, error) {
|
}, error) {
|
||||||
|
|
|
@ -63,10 +63,10 @@ contract NodeManager {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get node details given enode Id
|
// Get node details given enode Id
|
||||||
function getNodeDetails(string memory enodeId) public view returns (string memory _enodeId, uint _nodeStatus)
|
function getNodeDetails(string memory enodeId) public view returns (string memory _orgId, string memory _enodeId, uint _nodeStatus)
|
||||||
{
|
{
|
||||||
uint nodeIndex = getNodeIndex(enodeId);
|
uint nodeIndex = getNodeIndex(enodeId);
|
||||||
return (nodeList[nodeIndex].enodeId, nodeList[nodeIndex].status);
|
return (nodeList[nodeIndex].orgId, nodeList[nodeIndex].enodeId, nodeList[nodeIndex].status);
|
||||||
}
|
}
|
||||||
// Get node details given index
|
// Get node details given index
|
||||||
function getNodeDetailsFromIndex(uint nodeIndex) public view returns (string memory _orgId, string memory _enodeId, uint _nodeStatus)
|
function getNodeDetailsFromIndex(uint nodeIndex) public view returns (string memory _orgId, string memory _enodeId, uint _nodeStatus)
|
||||||
|
|
|
@ -154,11 +154,6 @@ func (p *PermissionCtrl) init() error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// call populates the account permissions based on past history
|
|
||||||
if err := p.populateAcctPermissions(); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// set the default access to ReadOnly
|
// set the default access to ReadOnly
|
||||||
types.SetDefaultAccess()
|
types.SetDefaultAccess()
|
||||||
|
|
||||||
|
@ -187,7 +182,7 @@ func (p *PermissionCtrl) manageNodePermissions() {
|
||||||
// Listens on the channel for new node approval via smart contract and
|
// Listens on the channel for new node approval via smart contract and
|
||||||
// adds the same into permissioned-nodes.json
|
// adds the same into permissioned-nodes.json
|
||||||
func (p *PermissionCtrl) monitorNewNodeAdd() {
|
func (p *PermissionCtrl) monitorNewNodeAdd() {
|
||||||
log.Info("AJ-new node approved")
|
log.Info("AJ-new node approved event monitor started...")
|
||||||
ch := make(chan *pbind.NodeManagerNodeApproved, 1)
|
ch := make(chan *pbind.NodeManagerNodeApproved, 1)
|
||||||
|
|
||||||
opts := &bind.WatchOpts{}
|
opts := &bind.WatchOpts{}
|
||||||
|
@ -205,6 +200,26 @@ func (p *PermissionCtrl) monitorNewNodeAdd() {
|
||||||
case nodeAddEvent = <-ch:
|
case nodeAddEvent = <-ch:
|
||||||
log.Info("AJ-newNodeApproved", "node", nodeAddEvent.EnodeId)
|
log.Info("AJ-newNodeApproved", "node", nodeAddEvent.EnodeId)
|
||||||
p.updatePermissionedNodes(nodeAddEvent.EnodeId, NodeAdd)
|
p.updatePermissionedNodes(nodeAddEvent.EnodeId, NodeAdd)
|
||||||
|
|
||||||
|
auth := bind.NewKeyedTransactor(p.key)
|
||||||
|
permAcctSession := &pbind.NodeManagerSession{
|
||||||
|
Contract: p.permNode,
|
||||||
|
CallOpts: bind.CallOpts{
|
||||||
|
Pending: true,
|
||||||
|
},
|
||||||
|
TransactOpts: bind.TransactOpts{
|
||||||
|
From: auth.From,
|
||||||
|
Signer: auth.Signer,
|
||||||
|
GasLimit: 47000000,
|
||||||
|
GasPrice: big.NewInt(0),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
if rs, err := permAcctSession.GetNodeDetails(nodeAddEvent.EnodeId); err != nil {
|
||||||
|
log.Error("AJ-failed to read node info ", "err", err)
|
||||||
|
} else {
|
||||||
|
types.NodeInfoMap.UpsertNode(rs.OrgId, rs.EnodeId, int(rs.NodeStatus.Uint64()))
|
||||||
|
log.Info("AJ-newNodeApproved cached updated for ", "enode", rs.EnodeId)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -416,26 +431,6 @@ func (p *PermissionCtrl) populatePermissionedNodes() error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// populates the account permissions cache from past account access update events
|
|
||||||
func (p *PermissionCtrl) populateAcctPermissions() error {
|
|
||||||
|
|
||||||
opts := &bind.FilterOpts{}
|
|
||||||
pastEvents, err := p.permAcct.AcctManagerFilterer.FilterAccountAccessModified(opts)
|
|
||||||
|
|
||||||
if err == nil {
|
|
||||||
recExists := true
|
|
||||||
for recExists {
|
|
||||||
recExists = pastEvents.Next()
|
|
||||||
if recExists {
|
|
||||||
log.Info("AJ-added account ", "acct", pastEvents.Event.Address, "roleId", pastEvents.Event.RoleId)
|
|
||||||
types.AddAccountAccess(pastEvents.Event.Address, pastEvents.Event.RoleId)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Monitors permissions changes at acount level and uodate the account permissions cache
|
// Monitors permissions changes at acount level and uodate the account permissions cache
|
||||||
func (p *PermissionCtrl) monitorAccountPermissions() {
|
func (p *PermissionCtrl) monitorAccountPermissions() {
|
||||||
ch := make(chan *pbind.AcctManagerAccountAccessModified)
|
ch := make(chan *pbind.AcctManagerAccountAccessModified)
|
||||||
|
@ -455,6 +450,25 @@ func (p *PermissionCtrl) monitorAccountPermissions() {
|
||||||
case newEvent = <-ch:
|
case newEvent = <-ch:
|
||||||
log.Info("AJ-AccountAccessModified", "address", newEvent.Address, "role", newEvent.RoleId)
|
log.Info("AJ-AccountAccessModified", "address", newEvent.Address, "role", newEvent.RoleId)
|
||||||
types.AddAccountAccess(newEvent.Address, newEvent.RoleId)
|
types.AddAccountAccess(newEvent.Address, newEvent.RoleId)
|
||||||
|
auth := bind.NewKeyedTransactor(p.key)
|
||||||
|
permAcctSession := &pbind.AcctManagerSession{
|
||||||
|
Contract: p.permAcct,
|
||||||
|
CallOpts: bind.CallOpts{
|
||||||
|
Pending: true,
|
||||||
|
},
|
||||||
|
TransactOpts: bind.TransactOpts{
|
||||||
|
From: auth.From,
|
||||||
|
Signer: auth.Signer,
|
||||||
|
GasLimit: 47000000,
|
||||||
|
GasPrice: big.NewInt(0),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
if addr, org, role, status, orgAdmin, err := permAcctSession.GetAccountDetails(newEvent.Address); err != nil {
|
||||||
|
log.Error("AJ-failed to read account info ", "err", err)
|
||||||
|
} else {
|
||||||
|
types.AcctInfoMap.UpsertAccount(org, role, addr, orgAdmin, int(status.Uint64()))
|
||||||
|
log.Info("AJ-AccountAccessModified cached updated for ", "acct", addr)
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -520,6 +534,7 @@ func (p *PermissionCtrl) populateInitPermissions() error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
log.Warn("Failed to retrieve network boot status ", "err", err)
|
log.Warn("Failed to retrieve network boot status ", "err", err)
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if networkInitialized && !p.permissionedMode {
|
if networkInitialized && !p.permissionedMode {
|
||||||
|
@ -532,57 +547,94 @@ func (p *PermissionCtrl) populateInitPermissions() error {
|
||||||
log.Info("Node started in non-permissioned mode")
|
log.Info("Node started in non-permissioned mode")
|
||||||
return errors.New("Node started in non-permissioned mode")
|
return errors.New("Node started in non-permissioned mode")
|
||||||
}
|
}
|
||||||
|
|
||||||
if !networkInitialized {
|
if !networkInitialized {
|
||||||
// Ensure that there is at least one account given as a part of genesis.json
|
if err := p.bootupNetwork(permInterfSession); err != nil {
|
||||||
// which will have full access. If not throw a fatal error
|
|
||||||
// Do not want a network with no access
|
|
||||||
log.Info("AJ-network not initialized")
|
|
||||||
|
|
||||||
permInterfSession.TransactOpts.Nonce = new(big.Int).SetUint64(p.eth.TxPool().Nonce(permInterfSession.TransactOpts.From))
|
|
||||||
if _, err := permInterfSession.SetPolicy(p.permConfig.NwAdminOrg, p.permConfig.NwAdminRole, p.permConfig.OrgAdminRole); err != nil {
|
|
||||||
log.Error("AJ-permIntr.setPolicy failed", "err", err)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
log.Info("AJ-permInter setPolicy done")
|
|
||||||
permInterfSession.TransactOpts.Nonce = new(big.Int).SetUint64(p.eth.TxPool().Nonce(permInterfSession.TransactOpts.From))
|
|
||||||
if _, err := permInterfSession.Init(common.HexToAddress(p.permConfig.OrgAddress), common.HexToAddress(p.permConfig.RoleAddress), common.HexToAddress(p.permConfig.AccountAddress), common.HexToAddress(p.permConfig.VoterAddress), common.HexToAddress(p.permConfig.NodeAddress)); err != nil {
|
|
||||||
log.Error("AJ-permIntr.init failed", "err", err)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
log.Info("AJ-permInter init done")
|
|
||||||
// populate the initial node list from static-nodes.json
|
|
||||||
err = p.populateStaticNodesToContract(permInterfSession)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
log.Info("AJ-permInter init node population done")
|
|
||||||
// populate initial account access to full access
|
|
||||||
err = p.populateInitAccountAccess(permInterfSession)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
log.Info("AJ-permInter init account population done")
|
|
||||||
if err == nil && len(p.permConfig.Accounts) == 0 {
|
|
||||||
|
|
||||||
//utils.Fatalf("Permissioned network being brought up with zero accounts having full access. Add permissioned full access accounts in genesis.json and bring up the network")
|
|
||||||
}
|
|
||||||
|
|
||||||
// update network status to boot completed
|
|
||||||
err = p.updateNetworkStatus(permInterfSession)
|
|
||||||
if err != nil {
|
|
||||||
log.Info("AJ-failed to updated network boot status")
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
log.Info("AJ-network boot completed")
|
log.Info("AJ-network boot completed")
|
||||||
} else {
|
} else {
|
||||||
log.Info("AJ-network already booted")
|
log.Info("AJ-network already booted")
|
||||||
|
//populate orgs, nodes, roles and accounts from contract
|
||||||
|
|
||||||
|
p.populateOrgsFromContract(auth)
|
||||||
|
|
||||||
|
p.populateNodesFromContract(auth)
|
||||||
|
|
||||||
|
p.populateRolesFromContract(auth)
|
||||||
|
|
||||||
|
p.populateAccountsFromContract(auth)
|
||||||
|
log.Info("AJ-all data loaded from contract")
|
||||||
}
|
}
|
||||||
|
|
||||||
//populate orgs, nodes, roles and accounts from contract
|
ShowCacheData()
|
||||||
|
|
||||||
//populate orgs
|
return nil
|
||||||
permOrgSession := &pbind.OrgManagerSession{
|
}
|
||||||
Contract: p.permOrg,
|
|
||||||
|
func (p *PermissionCtrl) bootupNetwork(permInterfSession *pbind.PermInterfaceSession) error {
|
||||||
|
// Ensure that there is at least one account given as a part of genesis.json
|
||||||
|
// which will have full access. If not throw a fatal error
|
||||||
|
// Do not want a network with no access
|
||||||
|
log.Info("AJ-network not initialized")
|
||||||
|
|
||||||
|
permInterfSession.TransactOpts.Nonce = new(big.Int).SetUint64(p.eth.TxPool().Nonce(permInterfSession.TransactOpts.From))
|
||||||
|
if _, err := permInterfSession.SetPolicy(p.permConfig.NwAdminOrg, p.permConfig.NwAdminRole, p.permConfig.OrgAdminRole); err != nil {
|
||||||
|
log.Error("AJ-permIntr.setPolicy failed", "err", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
log.Info("AJ-permInter setPolicy done")
|
||||||
|
permInterfSession.TransactOpts.Nonce = new(big.Int).SetUint64(p.eth.TxPool().Nonce(permInterfSession.TransactOpts.From))
|
||||||
|
if _, err := permInterfSession.Init(common.HexToAddress(p.permConfig.OrgAddress), common.HexToAddress(p.permConfig.RoleAddress), common.HexToAddress(p.permConfig.AccountAddress), common.HexToAddress(p.permConfig.VoterAddress), common.HexToAddress(p.permConfig.NodeAddress)); err != nil {
|
||||||
|
log.Error("AJ-permIntr.init failed", "err", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
log.Info("AJ-permInter init done")
|
||||||
|
|
||||||
|
types.OrgInfoMap.UpsertOrg(p.permConfig.NwAdminOrg, 2)
|
||||||
|
types.RoleInfoMap.UpsertRole(p.permConfig.NwAdminOrg, p.permConfig.NwAdminRole, true, 3, true)
|
||||||
|
// populate the initial node list from static-nodes.json
|
||||||
|
err := p.populateStaticNodesToContract(permInterfSession)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
log.Info("AJ-permInter init node population done")
|
||||||
|
// populate initial account access to full access
|
||||||
|
err = p.populateInitAccountAccess(permInterfSession)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
log.Info("AJ-permInter init account population done")
|
||||||
|
if err == nil && len(p.permConfig.Accounts) == 0 {
|
||||||
|
|
||||||
|
//utils.Fatalf("Permissioned network being brought up with zero accounts having full access. Add permissioned full access accounts in genesis.json and bring up the network")
|
||||||
|
}
|
||||||
|
|
||||||
|
// update network status to boot completed
|
||||||
|
err = p.updateNetworkStatus(permInterfSession)
|
||||||
|
if err != nil {
|
||||||
|
log.Info("AJ-failed to updated network boot status")
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func ShowCacheData() {
|
||||||
|
log.Info("AJ-======org info ======")
|
||||||
|
types.OrgInfoMap.Show()
|
||||||
|
log.Info("AJ-======Node info======")
|
||||||
|
types.NodeInfoMap.Show()
|
||||||
|
log.Info("AJ-======role info======")
|
||||||
|
types.RoleInfoMap.Show()
|
||||||
|
log.Info("AJ-======act info======")
|
||||||
|
types.AcctInfoMap.Show()
|
||||||
|
log.Info("AJ-============")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *PermissionCtrl) populateAccountsFromContract(auth *bind.TransactOpts) {
|
||||||
|
//populate accounts
|
||||||
|
permAcctSession := &pbind.AcctManagerSession{
|
||||||
|
Contract: p.permAcct,
|
||||||
CallOpts: bind.CallOpts{
|
CallOpts: bind.CallOpts{
|
||||||
Pending: true,
|
Pending: true,
|
||||||
},
|
},
|
||||||
|
@ -593,53 +645,25 @@ func (p *PermissionCtrl) populateInitPermissions() error {
|
||||||
GasPrice: big.NewInt(0),
|
GasPrice: big.NewInt(0),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
permOrgSession.TransactOpts.Nonce = new(big.Int).SetUint64(p.eth.TxPool().Nonce(permOrgSession.TransactOpts.From))
|
permAcctSession.TransactOpts.Nonce = new(big.Int).SetUint64(p.eth.TxPool().Nonce(permAcctSession.TransactOpts.From))
|
||||||
if numberOfOrgs, err := permOrgSession.GetNumberOfOrgs(); err != nil {
|
if numberOfRoles, err := permAcctSession.GetNumberOfAccounts(); err != nil {
|
||||||
log.Error("AJ-reading org num failed")
|
log.Error("AJ-reading acct num failed")
|
||||||
} else {
|
} else {
|
||||||
log.Info("AJ-org num ", "num", numberOfOrgs.Int64())
|
log.Info("AJ-acct num ", "num", numberOfRoles.Int64())
|
||||||
iOrgNum := numberOfOrgs.Uint64()
|
iOrgNum := numberOfRoles.Uint64()
|
||||||
for k := uint64(0); k < iOrgNum; k++ {
|
for k := uint64(0); k < iOrgNum; k++ {
|
||||||
permOrgSession.TransactOpts.Nonce = new(big.Int).SetUint64(p.eth.TxPool().Nonce(permOrgSession.TransactOpts.From))
|
permAcctSession.TransactOpts.Nonce = new(big.Int).SetUint64(p.eth.TxPool().Nonce(permAcctSession.TransactOpts.From))
|
||||||
if o, s, err := permOrgSession.GetOrgInfo(big.NewInt(int64(k))); err != nil {
|
if addr, org, role, status, orgAdmin, err := permAcctSession.GetAccountDetailsFromIndex(big.NewInt(int64(k))); err != nil {
|
||||||
log.Error("AJ-Org reading org info failed")
|
log.Error("AJ-Org reading org info failed")
|
||||||
} else {
|
} else {
|
||||||
types.OrgInfoMap.UpsertOrg(o, int(s.Int64()))
|
types.AcctInfoMap.UpsertAccount(org, role, addr, orgAdmin, int(status.Int64()))
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
//populate nodes
|
|
||||||
permNodeSession := &pbind.NodeManagerSession{
|
|
||||||
Contract: p.permNode,
|
|
||||||
CallOpts: bind.CallOpts{
|
|
||||||
Pending: true,
|
|
||||||
},
|
|
||||||
TransactOpts: bind.TransactOpts{
|
|
||||||
From: auth.From,
|
|
||||||
Signer: auth.Signer,
|
|
||||||
GasLimit: 47000000,
|
|
||||||
GasPrice: big.NewInt(0),
|
|
||||||
},
|
|
||||||
}
|
|
||||||
permNodeSession.TransactOpts.Nonce = new(big.Int).SetUint64(p.eth.TxPool().Nonce(permNodeSession.TransactOpts.From))
|
|
||||||
if numberOfNodes, err := permNodeSession.GetNumberOfNodes(); err != nil {
|
|
||||||
log.Error("AJ-reading node num failed")
|
|
||||||
} else {
|
|
||||||
log.Info("AJ-node num ", "num", numberOfNodes.Int64())
|
|
||||||
iOrgNum := numberOfNodes.Uint64()
|
|
||||||
for k := uint64(0); k < iOrgNum; k++ {
|
|
||||||
permNodeSession.TransactOpts.Nonce = new(big.Int).SetUint64(p.eth.TxPool().Nonce(permNodeSession.TransactOpts.From))
|
|
||||||
if nodeStruct, err := permNodeSession.GetNodeDetailsFromIndex(big.NewInt(int64(k))); err != nil {
|
|
||||||
log.Error("AJ-node reading org info failed")
|
|
||||||
} else {
|
|
||||||
types.NodeInfoMap.UpsertNode(nodeStruct.OrgId, nodeStruct.EnodeId, int(nodeStruct.NodeStatus.Int64()))
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *PermissionCtrl) populateRolesFromContract(auth *bind.TransactOpts) {
|
||||||
//populate roles
|
//populate roles
|
||||||
permRoleSession := &pbind.RoleManagerSession{
|
permRoleSession := &pbind.RoleManagerSession{
|
||||||
Contract: p.permRole,
|
Contract: p.permRole,
|
||||||
|
@ -669,10 +693,12 @@ func (p *PermissionCtrl) populateInitPermissions() error {
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//populate accounts
|
func (p *PermissionCtrl) populateNodesFromContract(auth *bind.TransactOpts) {
|
||||||
permAcctSession := &pbind.AcctManagerSession{
|
//populate nodes
|
||||||
Contract: p.permAcct,
|
permNodeSession := &pbind.NodeManagerSession{
|
||||||
|
Contract: p.permNode,
|
||||||
CallOpts: bind.CallOpts{
|
CallOpts: bind.CallOpts{
|
||||||
Pending: true,
|
Pending: true,
|
||||||
},
|
},
|
||||||
|
@ -683,35 +709,54 @@ func (p *PermissionCtrl) populateInitPermissions() error {
|
||||||
GasPrice: big.NewInt(0),
|
GasPrice: big.NewInt(0),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
permAcctSession.TransactOpts.Nonce = new(big.Int).SetUint64(p.eth.TxPool().Nonce(permAcctSession.TransactOpts.From))
|
permNodeSession.TransactOpts.Nonce = new(big.Int).SetUint64(p.eth.TxPool().Nonce(permNodeSession.TransactOpts.From))
|
||||||
|
if numberOfNodes, err := permNodeSession.GetNumberOfNodes(); err != nil {
|
||||||
if numberOfRoles, err := permAcctSession.GetNumberOfAccounts(); err != nil {
|
log.Error("AJ-reading node num failed")
|
||||||
log.Error("AJ-reading acct num failed")
|
|
||||||
} else {
|
} else {
|
||||||
log.Info("AJ-acct num ", "num", numberOfRoles.Int64())
|
log.Info("AJ-node num ", "num", numberOfNodes.Int64())
|
||||||
iOrgNum := numberOfRoles.Uint64()
|
iOrgNum := numberOfNodes.Uint64()
|
||||||
for k := uint64(0); k < iOrgNum; k++ {
|
for k := uint64(0); k < iOrgNum; k++ {
|
||||||
permAcctSession.TransactOpts.Nonce = new(big.Int).SetUint64(p.eth.TxPool().Nonce(permAcctSession.TransactOpts.From))
|
permNodeSession.TransactOpts.Nonce = new(big.Int).SetUint64(p.eth.TxPool().Nonce(permNodeSession.TransactOpts.From))
|
||||||
if addr, org, role, status, orgAdmin, err := permAcctSession.GetAccountDetailsFromIndex(big.NewInt(int64(k))); err != nil {
|
if nodeStruct, err := permNodeSession.GetNodeDetailsFromIndex(big.NewInt(int64(k))); err != nil {
|
||||||
log.Error("AJ-Org reading org info failed")
|
log.Error("AJ-node reading org info failed")
|
||||||
} else {
|
} else {
|
||||||
types.AcctInfoMap.UpsertAccount(org, role, addr, orgAdmin, int(status.Int64()))
|
types.NodeInfoMap.UpsertNode(nodeStruct.OrgId, nodeStruct.EnodeId, int(nodeStruct.NodeStatus.Int64()))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
log.Info("AJ-all data loaded")
|
func (p *PermissionCtrl) populateOrgsFromContract(auth *bind.TransactOpts) {
|
||||||
types.OrgInfoMap.Show()
|
//populate orgs
|
||||||
log.Info("============")
|
permOrgSession := &pbind.OrgManagerSession{
|
||||||
types.NodeInfoMap.Show()
|
Contract: p.permOrg,
|
||||||
log.Info("============")
|
CallOpts: bind.CallOpts{
|
||||||
types.RoleInfoMap.Show()
|
Pending: true,
|
||||||
log.Info("============")
|
},
|
||||||
types.AcctInfoMap.Show()
|
TransactOpts: bind.TransactOpts{
|
||||||
log.Info("============")
|
From: auth.From,
|
||||||
|
Signer: auth.Signer,
|
||||||
|
GasLimit: 47000000,
|
||||||
|
GasPrice: big.NewInt(0),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
permOrgSession.TransactOpts.Nonce = new(big.Int).SetUint64(p.eth.TxPool().Nonce(permOrgSession.TransactOpts.From))
|
||||||
|
if numberOfOrgs, err := permOrgSession.GetNumberOfOrgs(); err != nil {
|
||||||
|
log.Error("AJ-reading org num failed")
|
||||||
|
} else {
|
||||||
|
log.Info("AJ-org num ", "num", numberOfOrgs.Int64())
|
||||||
|
iOrgNum := numberOfOrgs.Uint64()
|
||||||
|
for k := uint64(0); k < iOrgNum; k++ {
|
||||||
|
permOrgSession.TransactOpts.Nonce = new(big.Int).SetUint64(p.eth.TxPool().Nonce(permOrgSession.TransactOpts.From))
|
||||||
|
if o, s, err := permOrgSession.GetOrgInfo(big.NewInt(int64(k))); err != nil {
|
||||||
|
log.Error("AJ-Org reading org info failed")
|
||||||
|
} else {
|
||||||
|
types.OrgInfoMap.UpsertOrg(o, int(s.Int64()))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return nil
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Reads the node list from static-nodes.json and populates into the contract
|
// Reads the node list from static-nodes.json and populates into the contract
|
||||||
|
@ -731,6 +776,7 @@ func (p *PermissionCtrl) populateStaticNodesToContract(permissionsSession *pbind
|
||||||
log.Warn("Failed to propose node", "err", err)
|
log.Warn("Failed to propose node", "err", err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
types.NodeInfoMap.UpsertNode(p.permConfig.NwAdminOrg, node.String(), 2)
|
||||||
log.Debug("Transaction pending", "tx hash", tx.Hash())
|
log.Debug("Transaction pending", "tx hash", tx.Hash())
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
|
@ -750,6 +796,7 @@ func (p *PermissionCtrl) populateInitAccountAccess(permissionsSession *pbind.Per
|
||||||
if er != nil {
|
if er != nil {
|
||||||
utils.Fatalf("error adding permission initial account list account: %s, error:%v", a, er)
|
utils.Fatalf("error adding permission initial account list account: %s, error:%v", a, er)
|
||||||
}
|
}
|
||||||
|
types.AcctInfoMap.UpsertAccount(p.permConfig.NwAdminOrg, p.permConfig.NwAdminRole, common.HexToAddress(a), true, 2)
|
||||||
}
|
}
|
||||||
log.Info("AJ-add initial account list ...done")
|
log.Info("AJ-add initial account list ...done")
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue