Blockchain is a promising technology that has received extensive attention from academia and industry in various subject domains. The significant potential of blockchain technology lies in its key characteristics of decentralization, persistency, anonymity, and auditability. However, the development of blockchain applications faces many technical difficulties because such applications are highly complex and heterogeneous, involving cooperation and interoperation between legacy systems and blockchain systems. These difficulties are further exacerbated by the lack of a common understanding of different blockchain solutions and components from a software engineering perspective. This study proposes a taxonomy to classify the eight fundamental components of blockchain systems. These components comprise a platform, network, distributed ledger, smart contract, consensus protocol, digital wallet, token, and node. Under the proposed taxonomy, each component is divided into several aspects (i.e., characteristics) that collectively describe the component. As a result of this elaboration, the taxonomy organizes the eight components into 83 dimensions and 199 characteristics. The taxonomy was validated using illustrative scenarios and a case study. The proposed taxonomy aims to provide a better understanding of the interrelationships among different blockchain components and aspects. Such an understanding can help blockchain application developers to design better blockchain architectures and systems.