Hello!
Here is how i would do:
First i'd create an empty bullet, that would contain all the basic function of all my bullet. It would be a node2D, with a sprite, a collision box and a timer as a child.
The node would emit a signal upon collision with another body. This collision would emit a signal to it self, triggering the following function:
func _on_Bullet_body_entered(body):
if body.has_method('take_damage'):
body.take_damage(damage)
queue_free()
Then i'd make other bullet, inheriting of this empty bullet, and having different damages values, appearence and hitbox. (And you can add a random function, or another function calculating the damages, it's all done now!)
Ok, i hope i helped!
Here is the tutorial i followed to learn that, i think it might help you: