docs: def set(self, key: bytes, value: bytes) -> Tuple[Hash32]:
          """
          Returns all updated hashes in root->leaf order
          """
          validate_is_bytes(key)
          validate_length(key, self._key_size)
          validate_is_bytes(value)
  
          path = to_int(key)
          node = value
          _, branch = self._get(key)
          proof_update = []  # Keep track of proof updates
  
          target_bit = 1
          # branch is in root->leaf order, so flip
          for sibling_node in reversed(branch):
              # Set
              node_hash = keccak(node)
              proof_update.append(node_hash)
              self.db[node_hash] = node
  
              # Update
              if (path & target_bit):
                  node = sibling_node + node_hash
              else:
                  node = node_hash + sibling_node
  
              target_bit <<= 1
  
          # Finally, update root hash
          self.root_hash = keccak(node)
          self.db[self.root_hash] = node
  
          # updates need to be in root->leaf order, so flip back
          return tuple(reversed(proof_update))