It's okay to define a contract instance every time you need it,
as the ABI and deployed address haven't changed, and your web3 library
or doing anything slow over the network.
I think the efficiency difference is negligible, but if you can create your contract instance once and pass it ...
The solution was to create and add the account from which to send the transaction into a wallet.
adding the line
above the method.send() fixed it for me.
When you request state from Ethereum, it doesn't cost gas because you're just reading a node. If the node is on your computer, you're just reading your hard drive. On the other hand, when you change state, it requires miners to pick up the change ...