Block = n is not much simpler than ID = n * RecSize. The only assumption is that the records are homogeneous, but I think that is generally the situation with this type of peer network.
Another possibility would be to make one or two nodes be a master block address table manager(s), where they have a master block table containing the remote block number of each node. When a node comes on line, he writes his block number to the appropriate offset of the table. When a remote node wants to send data to a target, he checks his local copy of the table to see if the block number is set, and if not, refreshes his local copy. It's a bit more work, but would completely eliminate dependence on specific blocks. You could even extend it to handle the IP address of targets...so even that wouldn't have to be hard-coded. A small amount of indirection can go a long way.
You could wrap up the entire address resolution in a single program block, which would be run any time you want to update the local copy of the block/IP map.