Hi @soumyaray, there's actually no "blessed" or preferred way of doing what you describe. This is mostly because I haven't wanted to enshrine one particular approach when it may not be appropriate for everyone's specific domains.
If a hash works for you, then that's fine, IMO! If you want to make it feel a little less informal, then you could build some sort of "context" object that gets passed around instead, with a particular API that fully suits your needs. How does that sound to you?
You definitely want to avoid using instance variables, since steps intended to work with dry-transaction shouldn't be mutating their state from call to call.