title: Internals - Pluggable Architecture - Quorum ## Background ### Go Plugin `geth` is written in the Go programming language. [Go 1.8 introduced](https://golang.org/doc/go1.8#plugin) a new plugin architecture which allows for the creation of plugins (via `plugin` build mode) and to use these plugins at runtime (via `plugin` package). In order to utilize this architecture, there are strict requirements in developing plugins. By using the network RPC interface, the plugin is independently built and distributed without having to rebuild `geth`. Especially with gRPC interfaces, plugins can be written in different languages (see our [examples](../PluginDevelopment/#examples)). This makes it easy for you to build a prototype feature or even a proprietary plugin for your organization's internal use. We use HashiCorp's [`go-plugin`](https://github.com/hashicorp/go-plugin) library as it fits our asks and it has been proven in many plugin-based production systems. ### Why we decided to use plugins There are number of benefits: - Dynamically-linked binaries (which you get when using plugins) are much smaller than statically compiled binaries. - We value the ability to isolate failures. E.g.: Quorum client would continue mining/validating even if security plugin has crashed. - Easily enables support for open source plugins written in languages other than Go. ## Design ```plantuml skinparam componentStyle uml2 skinparam shadowing false skinparam backgroundColor transparent skinparam rectangle { roundCorner<> 25 } file "JSON File" as json file "TOML File" as toml note left of toml : Standard Ethereum Config note right of json : Quorum Plugin Settings node "geth" <> { rectangle "CLI Flags" as flags frame "plugin.Settings" as settings { storage "Plugin1\nDefinition" as pd1 storage "Plugin2\nDefinition" as pd2 storage "Plugin Central\nConnectivity" as pcc } json <-down- flags : "via\n""--plugins""" toml <-down- flags : "via\n""--config""" flags -down-> settings : populate interface """node.Service""" as service rectangle """plugin.PluginManager""" <> as pm note right of pm registered and managed as standard ""geth"" service life cycle end note pm -up- service pm -up- settings card "arbitrary" <> as arbitrary interface "internal1" as i1 interface "internal2" as i2 interface "internal3" as i3 package "Plugin Interface 1" { rectangle "Plugin1" <